From 7b368076baf46881afe97794e3fe0ff1872c0bff Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 13 Oct 2019 15:38:41 +0200 Subject: [PATCH] [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 --- src/blackcore/afv/audio/input.cpp | 49 +++++++++++++++++++------------ src/blackcore/afv/audio/input.h | 16 +++++----- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/blackcore/afv/audio/input.cpp b/src/blackcore/afv/audio/input.cpp index 7d5c49f6d..afe38a920 100644 --- a/src/blackcore/afv/audio/input.cpp +++ b/src/blackcore/afv/audio/input.cpp @@ -34,9 +34,9 @@ namespace BlackCore this->setObjectName("CAudioInputBuffer"); } - void CAudioInputBuffer::start(int channelCount) + void CAudioInputBuffer::start(const QAudioFormat &format) { - m_channelCount = channelCount; + m_format = format; m_buffer.clear(); if (!this->isOpen()) { @@ -59,7 +59,7 @@ namespace BlackCore qint64 CAudioInputBuffer::writeData(const char *data, qint64 len) { m_buffer.append(data, static_cast(len)); - const int byteCount = 1920 * m_channelCount; + const int byteCount = 1920 * m_format.channelCount(); while (m_buffer.size() > byteCount) { // qDebug() << QDateTime::currentMSecsSinceEpoch() << "CAudioInputBuffer::writeData " << m_buffer.size(); @@ -91,23 +91,27 @@ namespace BlackCore m_device = inputDevice; - m_inputFormat.setSampleRate(m_sampleRate); - m_inputFormat.setChannelCount(1); - m_inputFormat.setSampleSize(16); - m_inputFormat.setSampleType(QAudioFormat::SignedInt); - m_inputFormat.setByteOrder(QAudioFormat::LittleEndian); - m_inputFormat.setCodec("audio/pcm"); + QAudioFormat inputFormat; + inputFormat.setSampleRate(m_sampleRate); + inputFormat.setChannelCount(1); + inputFormat.setSampleSize(16); + inputFormat.setSampleType(QAudioFormat::SignedInt); + 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_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 CMacOSMicrophoneAccess::AuthorizationStatus status = m_micAccess.getAuthorizationStatus(); if (status == CMacOSMicrophoneAccess::Authorized) { - m_audioInput->start(&m_audioInputBuffer); - connect(&m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable); + m_audioInput->start(m_audioInputBuffer); + connect(m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable); m_started = true; return; } @@ -123,10 +127,12 @@ namespace BlackCore return; } #else - m_audioInput->start(&m_audioInputBuffer); - connect(&m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable); + m_audioInput->start(m_audioInputBuffer); + connect(m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable); m_started = true; #endif + const QString format = toQString(m_inputFormat); + CLogMessage(this).info(u"Starting: '%1' with: %2") << selectedDevice.deviceName() << format; } void CInput::stop() @@ -135,7 +141,12 @@ namespace BlackCore m_started = false; if (m_audioInput) { m_audioInput->stop(); } m_audioInput.reset(); - m_audioInputBuffer.stop(); + if (m_audioInputBuffer) + { + m_audioInputBuffer->stop(); + m_audioInputBuffer->deleteLater(); + m_audioInputBuffer = nullptr; + } } void CInput::audioInDataAvailable(const QByteArray &frame) @@ -155,7 +166,7 @@ namespace BlackCore sample = static_cast(value); qint16 sampleInput = qAbs(sample); - m_maxSampleInput = qMax(qAbs(sampleInput), m_maxSampleInput); + m_maxSampleInput = qMax(qAbs(sampleInput), m_maxSampleInput); } int length; @@ -186,8 +197,8 @@ namespace BlackCore #ifdef Q_OS_MAC void CInput::delayedInitMicrophone() { - m_audioInput->start(&m_audioInputBuffer); - connect(&m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable); + m_audioInput->start(m_audioInputBuffer); + connect(m_audioInputBuffer, &CAudioInputBuffer::frameAvailable, this, &CInput::audioInDataAvailable); m_started = true; } #endif diff --git a/src/blackcore/afv/audio/input.h b/src/blackcore/afv/audio/input.h index 3c2bc2c36..04d7042a9 100644 --- a/src/blackcore/afv/audio/input.h +++ b/src/blackcore/afv/audio/input.h @@ -37,10 +37,10 @@ namespace BlackCore public: //! Inout buffer - CAudioInputBuffer(QObject *parent = nullptr); + CAudioInputBuffer(QObject *parent); //! Start - void start(int channelCount); + void start(const QAudioFormat &format); //! Stop void stop(); @@ -57,8 +57,8 @@ namespace BlackCore private: static constexpr qint64 frameSize = 960; - QByteArray m_buffer; - int m_channelCount = 1; + QByteArray m_buffer; + QAudioFormat m_format; }; //! Opus data arguments @@ -131,10 +131,10 @@ namespace BlackCore static constexpr qint64 c_frameSize = 960; int m_sampleRate = 0; - BlackSound::Codecs::COpusEncoder m_encoder; - QScopedPointer m_audioInput; + BlackSound::Codecs::COpusEncoder m_encoder; + QScopedPointer m_audioInput; BlackMisc::Audio::CAudioDeviceInfo m_device; - QAudioFormat m_inputFormat; + QAudioFormat m_inputFormat; bool m_started = false; int m_opusBytesEncoded = 0; @@ -147,7 +147,7 @@ namespace BlackCore const double minDb = -40; uint m_audioSequenceCounter = 0; - CAudioInputBuffer m_audioInputBuffer; + CAudioInputBuffer *m_audioInputBuffer = nullptr; #ifdef Q_OS_MAC BlackMisc::CMacOSMicrophoneAccess m_micAccess;