From c11f4be5c15f5958760afcbbad6e54c90dd2dff8 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Wed, 11 Jul 2018 19:14:24 -0300 Subject: [PATCH 1/9] Make louder android mic --- libraries/audio-client/src/AudioClient.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index a6f0416a30..f325fe1273 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -482,6 +482,12 @@ bool nativeFormatForAudioDevice(const QAudioDeviceInfo& audioDevice, audioFormat.setSampleType(QAudioFormat::SignedInt); audioFormat.setByteOrder(QAudioFormat::LittleEndian); +#if defined(Q_OS_ANDROID) + if (audioDevice == QAudioDeviceInfo::defaultInputDevice()) { + audioFormat.setSampleRate(44100); + } +#endif + if (!audioDevice.isFormatSupported(audioFormat)) { qCWarning(audioclient) << "The native format is" << audioFormat << "but isFormatSupported() failed."; return false; From e039ef172958f5ba6b0273a5290aef2dee1951e3 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Thu, 12 Jul 2018 18:12:53 -0300 Subject: [PATCH 2/9] Use 24000Hz sample rate for Samsung only --- libraries/audio-client/CMakeLists.txt | 5 ++++- libraries/audio-client/src/AudioClient.cpp | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/libraries/audio-client/CMakeLists.txt b/libraries/audio-client/CMakeLists.txt index d419a2fb7a..6ca7962c39 100644 --- a/libraries/audio-client/CMakeLists.txt +++ b/libraries/audio-client/CMakeLists.txt @@ -1,5 +1,8 @@ set(TARGET_NAME audio-client) -setup_hifi_library(Network Multimedia) +if (ANDROID) + set(PLATFORM_QT_COMPONENTS AndroidExtras) +endif () +setup_hifi_library(Network Multimedia ${PLATFORM_QT_COMPONENTS}) link_hifi_libraries(audio plugins) include_hifi_library_headers(shared) include_hifi_library_headers(networking) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index f325fe1273..b405a9f5ca 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -52,6 +52,10 @@ #include "AudioLogging.h" #include "AudioHelpers.h" +#if defined(Q_OS_ANDROID) +#include +#endif + const int AudioClient::MIN_BUFFER_FRAMES = 1; const int AudioClient::MAX_BUFFER_FRAMES = 20; @@ -483,8 +487,9 @@ bool nativeFormatForAudioDevice(const QAudioDeviceInfo& audioDevice, audioFormat.setByteOrder(QAudioFormat::LittleEndian); #if defined(Q_OS_ANDROID) - if (audioDevice == QAudioDeviceInfo::defaultInputDevice()) { - audioFormat.setSampleRate(44100); + QAndroidJniObject brand = QAndroidJniObject::getStaticObjectField("android/os/Build", "BRAND"); + if (audioDevice == QAudioDeviceInfo::defaultInputDevice() && brand.toString().contains("samsung", Qt::CaseInsensitive)) { + audioFormat.setSampleRate(24000); } #endif From d8af12152b6d1c29c6140be2ea74eb3e8f27fc27 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Fri, 13 Jul 2018 11:20:23 -0300 Subject: [PATCH 3/9] Add comment to explain the workaround --- libraries/audio-client/src/AudioClient.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index b405a9f5ca..b97ff77ad1 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -487,6 +487,8 @@ bool nativeFormatForAudioDevice(const QAudioDeviceInfo& audioDevice, audioFormat.setByteOrder(QAudioFormat::LittleEndian); #if defined(Q_OS_ANDROID) + // Using the HW sample rate (AUDIO_INPUT_FLAG_FAST) in some samsung phones causes a low volume at input stream + // Changing the sample rate forces a resampling that (in samsung) amplifies +18 dB QAndroidJniObject brand = QAndroidJniObject::getStaticObjectField("android/os/Build", "BRAND"); if (audioDevice == QAudioDeviceInfo::defaultInputDevice() && brand.toString().contains("samsung", Qt::CaseInsensitive)) { audioFormat.setSampleRate(24000); From c8a168c273f2a0f75a350230a2796b7f5fc23129 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Fri, 13 Jul 2018 16:48:28 -0300 Subject: [PATCH 4/9] Fix audio choppy. --- libraries/audio-client/src/AudioClient.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index b97ff77ad1..5a83286f3b 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -664,6 +664,7 @@ void AudioClient::stop() { switchOutputToAudioDevice(QAudioDeviceInfo(), true); #if defined(Q_OS_ANDROID) _checkInputTimer.stop(); + disconnect(&_checkInputTimer, &QTimer::timeout, 0, 0); #endif } From d230a634b27250693928abdf225871b7109f57b9 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Thu, 19 Jul 2018 14:50:40 -0300 Subject: [PATCH 5/9] Fix connects. Set down MIN_READS_TO_CONSIDER_INPUT_ALIVE to 10 --- libraries/audio-client/src/AudioClient.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 5a83286f3b..161cf162b1 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -64,7 +64,7 @@ static const int RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES = 100; #if defined(Q_OS_ANDROID) static const int CHECK_INPUT_READS_MSECS = 2000; -static const int MIN_READS_TO_CONSIDER_INPUT_ALIVE = 100; +static const int MIN_READS_TO_CONSIDER_INPUT_ALIVE = 10; #endif static const auto DEFAULT_POSITION_GETTER = []{ return Vectors::ZERO; }; @@ -239,7 +239,7 @@ AudioClient::AudioClient() : // start a thread to detect any device changes _checkDevicesTimer = new QTimer(this); - connect(_checkDevicesTimer, &QTimer::timeout, [this] { + connect(_checkDevicesTimer, &QTimer::timeout, this, [this] { QtConcurrent::run(QThreadPool::globalInstance(), [this] { checkDevices(); }); }); const unsigned long DEVICE_CHECK_INTERVAL_MSECS = 2 * 1000; @@ -247,7 +247,7 @@ AudioClient::AudioClient() : // start a thread to detect peak value changes _checkPeakValuesTimer = new QTimer(this); - connect(_checkPeakValuesTimer, &QTimer::timeout, [this] { + connect(_checkPeakValuesTimer, &QTimer::timeout, this, [this] { QtConcurrent::run(QThreadPool::globalInstance(), [this] { checkPeakValues(); }); }); const unsigned long PEAK_VALUES_CHECK_INTERVAL_MSECS = 50; @@ -648,9 +648,7 @@ void AudioClient::start() { qCDebug(audioclient) << "The closest format available is" << outputDeviceInfo.nearestFormat(_desiredOutputFormat); } #if defined(Q_OS_ANDROID) - connect(&_checkInputTimer, &QTimer::timeout, [this] { - checkInputTimeout(); - }); + connect(&_checkInputTimer, &QTimer::timeout, this, &AudioClient::checkInputTimeout); _checkInputTimer.start(CHECK_INPUT_READS_MSECS); #endif } @@ -1572,9 +1570,7 @@ bool AudioClient::switchInputToAudioDevice(const QAudioDeviceInfo inputDeviceInf #if defined(Q_OS_ANDROID) if (_audioInput) { _shouldRestartInputSetup = true; - connect(_audioInput, &QAudioInput::stateChanged, [this](QAudio::State state) { - audioInputStateChanged(state); - }); + connect(_audioInput, &QAudioInput::stateChanged, this, &AudioClient::audioInputStateChanged); } #endif _inputDevice = _audioInput->start(); From 988acdb3f9c0c44560e0e0c24771947d4343cd2b Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Thu, 19 Jul 2018 18:53:03 -0300 Subject: [PATCH 6/9] Set output sample rate at 24000 (with testing purposes only) --- libraries/audio-client/src/AudioClient.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 161cf162b1..8c0862f184 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -490,7 +490,7 @@ bool nativeFormatForAudioDevice(const QAudioDeviceInfo& audioDevice, // Using the HW sample rate (AUDIO_INPUT_FLAG_FAST) in some samsung phones causes a low volume at input stream // Changing the sample rate forces a resampling that (in samsung) amplifies +18 dB QAndroidJniObject brand = QAndroidJniObject::getStaticObjectField("android/os/Build", "BRAND"); - if (audioDevice == QAudioDeviceInfo::defaultInputDevice() && brand.toString().contains("samsung", Qt::CaseInsensitive)) { + if (brand.toString().contains("samsung", Qt::CaseInsensitive)) { audioFormat.setSampleRate(24000); } #endif @@ -1774,7 +1774,7 @@ bool AudioClient::switchOutputToAudioDevice(const QAudioDeviceInfo outputDeviceI _outputScratchBuffer = new int16_t[_outputPeriod]; // size local output mix buffer based on resampled network frame size - int networkPeriod = _localToOutputResampler->getMaxOutput(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO); + int networkPeriod = _localToOutputResampler ? _localToOutputResampler->getMaxOutput(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO) : AudioConstants::NETWORK_FRAME_SAMPLES_STEREO; _localOutputMixBuffer = new float[networkPeriod]; // local period should be at least twice the output period, From 00e3de4e0ae5c3738a8eb5f8c7aba70733383c07 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Thu, 19 Jul 2018 19:13:28 -0300 Subject: [PATCH 7/9] Revert output sample rate to native rate --- libraries/audio-client/src/AudioClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 8c0862f184..c57360b09f 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -490,7 +490,7 @@ bool nativeFormatForAudioDevice(const QAudioDeviceInfo& audioDevice, // Using the HW sample rate (AUDIO_INPUT_FLAG_FAST) in some samsung phones causes a low volume at input stream // Changing the sample rate forces a resampling that (in samsung) amplifies +18 dB QAndroidJniObject brand = QAndroidJniObject::getStaticObjectField("android/os/Build", "BRAND"); - if (brand.toString().contains("samsung", Qt::CaseInsensitive)) { + if (audioDevice == QAudioDeviceInfo::defaultInputDevice() && brand.toString().contains("samsung", Qt::CaseInsensitive)) { audioFormat.setSampleRate(24000); } #endif From 3c49e7783c767d60e5e6e365adb645bc2e6197c8 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Mon, 23 Jul 2018 14:03:58 -0300 Subject: [PATCH 8/9] Add logs to debug. Revert later --- libraries/audio-client/src/AudioClient.cpp | 1 + libraries/audio/src/InboundAudioStream.cpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index c57360b09f..fa44367d47 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1639,6 +1639,7 @@ void AudioClient::audioInputStateChanged(QAudio::State state) { void AudioClient::checkInputTimeout() { #if defined(Q_OS_ANDROID) if (_audioInput && _inputReadsSinceLastCheck < MIN_READS_TO_CONSIDER_INPUT_ALIVE) { + qDebug() << "[CHOPPY-AUDIO] " << _inputReadsSinceLastCheck << " < MIN_READS_TO_CONSIDER_INPUT_ALIVE"; _audioInput->stop(); } else { _inputReadsSinceLastCheck = 0; diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 7645a674e4..cf4ad25f1b 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -138,6 +138,7 @@ int InboundAudioStream::parseData(ReceivedMessage& message) { // handle this packet based on its arrival status. switch (arrivalInfo._status) { case SequenceNumberStats::Unreasonable: { + qDebug() << "[CHOPPY-AUDIO] Unreasonable lostAudioData"; lostAudioData(1); break; } @@ -147,6 +148,7 @@ int InboundAudioStream::parseData(ReceivedMessage& message) { // also result in allowing the codec to interpolate lost data. Then // fall through to the "on time" logic to actually handle this packet int packetsDropped = arrivalInfo._seqDiffFromExpected; + qDebug() << "[CHOPPY-AUDIO] Early lostAudioData " << packetsDropped; lostAudioData(packetsDropped); // fall through to OnTime case @@ -181,6 +183,7 @@ int InboundAudioStream::parseData(ReceivedMessage& message) { // Since the data in the stream is using a codec that we aren't prepared for, // we need to let the codec know that we don't have data for it, this will // allow the codec to interpolate missing data and produce a fade to silence. + qDebug() << "[CHOPPY-AUDIO] !pcm lostAudioData 1"; lostAudioData(1); } From f24cfebe88eb36c22bcfdf230e7941e2c0f72111 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Tue, 24 Jul 2018 14:57:48 -0300 Subject: [PATCH 9/9] Revert "Add logs to debug. Revert later" This reverts commit 3c49e7783c767d60e5e6e365adb645bc2e6197c8. --- libraries/audio-client/src/AudioClient.cpp | 1 - libraries/audio/src/InboundAudioStream.cpp | 3 --- 2 files changed, 4 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index fa44367d47..c57360b09f 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1639,7 +1639,6 @@ void AudioClient::audioInputStateChanged(QAudio::State state) { void AudioClient::checkInputTimeout() { #if defined(Q_OS_ANDROID) if (_audioInput && _inputReadsSinceLastCheck < MIN_READS_TO_CONSIDER_INPUT_ALIVE) { - qDebug() << "[CHOPPY-AUDIO] " << _inputReadsSinceLastCheck << " < MIN_READS_TO_CONSIDER_INPUT_ALIVE"; _audioInput->stop(); } else { _inputReadsSinceLastCheck = 0; diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index cf4ad25f1b..7645a674e4 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -138,7 +138,6 @@ int InboundAudioStream::parseData(ReceivedMessage& message) { // handle this packet based on its arrival status. switch (arrivalInfo._status) { case SequenceNumberStats::Unreasonable: { - qDebug() << "[CHOPPY-AUDIO] Unreasonable lostAudioData"; lostAudioData(1); break; } @@ -148,7 +147,6 @@ int InboundAudioStream::parseData(ReceivedMessage& message) { // also result in allowing the codec to interpolate lost data. Then // fall through to the "on time" logic to actually handle this packet int packetsDropped = arrivalInfo._seqDiffFromExpected; - qDebug() << "[CHOPPY-AUDIO] Early lostAudioData " << packetsDropped; lostAudioData(packetsDropped); // fall through to OnTime case @@ -183,7 +181,6 @@ int InboundAudioStream::parseData(ReceivedMessage& message) { // Since the data in the stream is using a codec that we aren't prepared for, // we need to let the codec know that we don't have data for it, this will // allow the codec to interpolate missing data and produce a fade to silence. - qDebug() << "[CHOPPY-AUDIO] !pcm lostAudioData 1"; lostAudioData(1); }