mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-05-06 02:16:04 +08:00
[AFV] Ref T730, make output buffer a pointer and avoid the buffer is connected multiple times with CAudioInputBuffer::frameAvailable
* discussion https://discordapp.com/channels/539048679160676382/623947987822837779/632921747171311616 * pass "whole" QAudioFormat to CAudioInputBuffer (not only channel count), maybe useful in future * parent for buffer is required, removed default
This commit is contained in:
@@ -34,9 +34,9 @@ namespace BlackCore
|
|||||||
this->setObjectName("CAudioInputBuffer");
|
this->setObjectName("CAudioInputBuffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAudioInputBuffer::start(int channelCount)
|
void CAudioInputBuffer::start(const QAudioFormat &format)
|
||||||
{
|
{
|
||||||
m_channelCount = channelCount;
|
m_format = format;
|
||||||
m_buffer.clear();
|
m_buffer.clear();
|
||||||
if (!this->isOpen())
|
if (!this->isOpen())
|
||||||
{
|
{
|
||||||
@@ -59,7 +59,7 @@ namespace BlackCore
|
|||||||
qint64 CAudioInputBuffer::writeData(const char *data, qint64 len)
|
qint64 CAudioInputBuffer::writeData(const char *data, qint64 len)
|
||||||
{
|
{
|
||||||
m_buffer.append(data, static_cast<int>(len));
|
m_buffer.append(data, static_cast<int>(len));
|
||||||
const int byteCount = 1920 * m_channelCount;
|
const int byteCount = 1920 * m_format.channelCount();
|
||||||
while (m_buffer.size() > byteCount)
|
while (m_buffer.size() > byteCount)
|
||||||
{
|
{
|
||||||
// qDebug() << QDateTime::currentMSecsSinceEpoch() << "CAudioInputBuffer::writeData " << m_buffer.size();
|
// qDebug() << QDateTime::currentMSecsSinceEpoch() << "CAudioInputBuffer::writeData " << m_buffer.size();
|
||||||
@@ -91,23 +91,27 @@ namespace BlackCore
|
|||||||
|
|
||||||
m_device = inputDevice;
|
m_device = inputDevice;
|
||||||
|
|
||||||
m_inputFormat.setSampleRate(m_sampleRate);
|
QAudioFormat inputFormat;
|
||||||
m_inputFormat.setChannelCount(1);
|
inputFormat.setSampleRate(m_sampleRate);
|
||||||
m_inputFormat.setSampleSize(16);
|
inputFormat.setChannelCount(1);
|
||||||
m_inputFormat.setSampleType(QAudioFormat::SignedInt);
|
inputFormat.setSampleSize(16);
|
||||||
m_inputFormat.setByteOrder(QAudioFormat::LittleEndian);
|
inputFormat.setSampleType(QAudioFormat::SignedInt);
|
||||||
m_inputFormat.setCodec("audio/pcm");
|
inputFormat.setByteOrder(QAudioFormat::LittleEndian);
|
||||||
|
inputFormat.setCodec("audio/pcm");
|
||||||
|
|
||||||
QAudioDeviceInfo selectedDevice = getLowestLatencyDevice(inputDevice, m_inputFormat);
|
QAudioDeviceInfo selectedDevice = getLowestLatencyDevice(inputDevice, inputFormat);
|
||||||
|
m_inputFormat = inputFormat;
|
||||||
m_audioInput.reset(new QAudioInput(selectedDevice, m_inputFormat));
|
m_audioInput.reset(new QAudioInput(selectedDevice, m_inputFormat));
|
||||||
m_audioInputBuffer.start(m_inputFormat.channelCount());
|
if (!m_audioInputBuffer) { m_audioInputBuffer = new CAudioInputBuffer(this); }
|
||||||
|
else { m_audioInputBuffer->disconnect(); } // make sure disconnected in any case
|
||||||
|
m_audioInputBuffer->start(m_inputFormat);
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
CMacOSMicrophoneAccess::AuthorizationStatus status = m_micAccess.getAuthorizationStatus();
|
CMacOSMicrophoneAccess::AuthorizationStatus status = m_micAccess.getAuthorizationStatus();
|
||||||
if (status == CMacOSMicrophoneAccess::Authorized)
|
if (status == CMacOSMicrophoneAccess::Authorized)
|
||||||
{
|
{
|
||||||
m_audioInput->start(&m_audioInputBuffer);
|
m_audioInput->start(m_audioInputBuffer);
|
||||||
connect(&m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable);
|
connect(m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable);
|
||||||
m_started = true;
|
m_started = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -123,10 +127,12 @@ namespace BlackCore
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
m_audioInput->start(&m_audioInputBuffer);
|
m_audioInput->start(m_audioInputBuffer);
|
||||||
connect(&m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable);
|
connect(m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable);
|
||||||
m_started = true;
|
m_started = true;
|
||||||
#endif
|
#endif
|
||||||
|
const QString format = toQString(m_inputFormat);
|
||||||
|
CLogMessage(this).info(u"Starting: '%1' with: %2") << selectedDevice.deviceName() << format;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInput::stop()
|
void CInput::stop()
|
||||||
@@ -135,7 +141,12 @@ namespace BlackCore
|
|||||||
m_started = false;
|
m_started = false;
|
||||||
if (m_audioInput) { m_audioInput->stop(); }
|
if (m_audioInput) { m_audioInput->stop(); }
|
||||||
m_audioInput.reset();
|
m_audioInput.reset();
|
||||||
m_audioInputBuffer.stop();
|
if (m_audioInputBuffer)
|
||||||
|
{
|
||||||
|
m_audioInputBuffer->stop();
|
||||||
|
m_audioInputBuffer->deleteLater();
|
||||||
|
m_audioInputBuffer = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInput::audioInDataAvailable(const QByteArray &frame)
|
void CInput::audioInDataAvailable(const QByteArray &frame)
|
||||||
@@ -155,7 +166,7 @@ namespace BlackCore
|
|||||||
sample = static_cast<qint16>(value);
|
sample = static_cast<qint16>(value);
|
||||||
|
|
||||||
qint16 sampleInput = qAbs(sample);
|
qint16 sampleInput = qAbs(sample);
|
||||||
m_maxSampleInput = qMax(qAbs(sampleInput), m_maxSampleInput);
|
m_maxSampleInput = qMax(qAbs(sampleInput), m_maxSampleInput);
|
||||||
}
|
}
|
||||||
|
|
||||||
int length;
|
int length;
|
||||||
@@ -186,8 +197,8 @@ namespace BlackCore
|
|||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
void CInput::delayedInitMicrophone()
|
void CInput::delayedInitMicrophone()
|
||||||
{
|
{
|
||||||
m_audioInput->start(&m_audioInputBuffer);
|
m_audioInput->start(m_audioInputBuffer);
|
||||||
connect(&m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable);
|
connect(m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable);
|
||||||
m_started = true;
|
m_started = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -37,10 +37,10 @@ namespace BlackCore
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
//! Inout buffer
|
//! Inout buffer
|
||||||
CAudioInputBuffer(QObject *parent = nullptr);
|
CAudioInputBuffer(QObject *parent);
|
||||||
|
|
||||||
//! Start
|
//! Start
|
||||||
void start(int channelCount);
|
void start(const QAudioFormat &format);
|
||||||
|
|
||||||
//! Stop
|
//! Stop
|
||||||
void stop();
|
void stop();
|
||||||
@@ -57,8 +57,8 @@ namespace BlackCore
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr qint64 frameSize = 960;
|
static constexpr qint64 frameSize = 960;
|
||||||
QByteArray m_buffer;
|
QByteArray m_buffer;
|
||||||
int m_channelCount = 1;
|
QAudioFormat m_format;
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Opus data arguments
|
//! Opus data arguments
|
||||||
@@ -131,10 +131,10 @@ namespace BlackCore
|
|||||||
static constexpr qint64 c_frameSize = 960;
|
static constexpr qint64 c_frameSize = 960;
|
||||||
int m_sampleRate = 0;
|
int m_sampleRate = 0;
|
||||||
|
|
||||||
BlackSound::Codecs::COpusEncoder m_encoder;
|
BlackSound::Codecs::COpusEncoder m_encoder;
|
||||||
QScopedPointer<QAudioInput> m_audioInput;
|
QScopedPointer<QAudioInput> m_audioInput;
|
||||||
BlackMisc::Audio::CAudioDeviceInfo m_device;
|
BlackMisc::Audio::CAudioDeviceInfo m_device;
|
||||||
QAudioFormat m_inputFormat;
|
QAudioFormat m_inputFormat;
|
||||||
|
|
||||||
bool m_started = false;
|
bool m_started = false;
|
||||||
int m_opusBytesEncoded = 0;
|
int m_opusBytesEncoded = 0;
|
||||||
@@ -147,7 +147,7 @@ namespace BlackCore
|
|||||||
const double minDb = -40;
|
const double minDb = -40;
|
||||||
|
|
||||||
uint m_audioSequenceCounter = 0;
|
uint m_audioSequenceCounter = 0;
|
||||||
CAudioInputBuffer m_audioInputBuffer;
|
CAudioInputBuffer *m_audioInputBuffer = nullptr;
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
BlackMisc::CMacOSMicrophoneAccess m_micAccess;
|
BlackMisc::CMacOSMicrophoneAccess m_micAccess;
|
||||||
|
|||||||
Reference in New Issue
Block a user