[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:
Klaus Basan
2019-10-13 15:38:41 +02:00
parent e76bbbbca3
commit 7b368076ba
2 changed files with 38 additions and 27 deletions

View File

@@ -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

View File

@@ -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;