From b5a55492a63cb2cda75d6f980acb7fc5ae8dfc22 Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Tue, 28 Apr 2020 13:18:52 +0200 Subject: CoreAudio: Don't apply audio category if it is not needed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If just devices are requested, no need to apply any categories with activation of audio device. Postpone setting category and activating audio until actual playing is requested. Categories/options for input devices: AVAudioSessionCategoryPlayAndRecord with AVAudioSessionCategoryOptionMixWithOthers For output: AVAudioSessionCategoryAmbient with no options. Pick-to: 5.15 Fixes: QTBUG-83776 Change-Id: I9364bdea2882bc23039817207eca62b311841ba6 Reviewed-by: Tor Arne Vestbø --- src/plugins/coreaudio/coreaudiodeviceinfo.mm | 13 ------------- src/plugins/coreaudio/coreaudioinput.mm | 5 +++++ src/plugins/coreaudio/coreaudiooutput.mm | 7 +++++++ src/plugins/coreaudio/coreaudiosessionmanager.mm | 5 ----- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/plugins/coreaudio/coreaudiodeviceinfo.mm b/src/plugins/coreaudio/coreaudiodeviceinfo.mm index 594ea225b..2cc99f5f9 100644 --- a/src/plugins/coreaudio/coreaudiodeviceinfo.mm +++ b/src/plugins/coreaudio/coreaudiodeviceinfo.mm @@ -60,11 +60,6 @@ CoreAudioDeviceInfo::CoreAudioDeviceInfo(const QByteArray &device, QAudio::Mode m_deviceId = AudioDeviceID(deviceID); #else //iOS m_device = device; - if (mode == QAudio::AudioInput) { - if (CoreAudioSessionManager::instance().category() != CoreAudioSessionManager::PlayAndRecord) { - CoreAudioSessionManager::instance().setCategory(CoreAudioSessionManager::PlayAndRecord); - } - } #endif } @@ -336,14 +331,6 @@ QList CoreAudioDeviceInfo::availableDevices(QAudio::Mode mode) } } #else //iOS - if (mode == QAudio::AudioInput) { - if (CoreAudioSessionManager::instance().category() != CoreAudioSessionManager::PlayAndRecord) { - CoreAudioSessionManager::instance().setCategory(CoreAudioSessionManager::PlayAndRecord); - } - } - - CoreAudioSessionManager::instance().setActive(true); - if (mode == QAudio::AudioOutput) return CoreAudioSessionManager::instance().outputDevices(); if (mode == QAudio::AudioInput) diff --git a/src/plugins/coreaudio/coreaudioinput.mm b/src/plugins/coreaudio/coreaudioinput.mm index f7d511d27..7f305168f 100644 --- a/src/plugins/coreaudio/coreaudioinput.mm +++ b/src/plugins/coreaudio/coreaudioinput.mm @@ -483,6 +483,11 @@ CoreAudioInput::~CoreAudioInput() bool CoreAudioInput::open() { +#if defined(Q_OS_IOS) + CoreAudioSessionManager::instance().setCategory(CoreAudioSessionManager::PlayAndRecord, CoreAudioSessionManager::MixWithOthers); + CoreAudioSessionManager::instance().setActive(true); +#endif + if (m_isOpen) return true; diff --git a/src/plugins/coreaudio/coreaudiooutput.mm b/src/plugins/coreaudio/coreaudiooutput.mm index caa4a1abb..b8addc1cf 100644 --- a/src/plugins/coreaudio/coreaudiooutput.mm +++ b/src/plugins/coreaudio/coreaudiooutput.mm @@ -549,6 +549,13 @@ OSStatus CoreAudioOutput::renderCallback(void *inRefCon, AudioUnitRenderActionFl bool CoreAudioOutput::open() { +#if defined(Q_OS_IOS) + // Set default category to Ambient (implies MixWithOthers). This makes sure audio stops playing + // if the screen is locked or if the Silent switch is toggled. + CoreAudioSessionManager::instance().setCategory(CoreAudioSessionManager::Ambient, CoreAudioSessionManager::None); + CoreAudioSessionManager::instance().setActive(true); +#endif + if (m_errorCode != QAudio::NoError) return false; diff --git a/src/plugins/coreaudio/coreaudiosessionmanager.mm b/src/plugins/coreaudio/coreaudiosessionmanager.mm index 923a1942f..6c86f0753 100644 --- a/src/plugins/coreaudio/coreaudiosessionmanager.mm +++ b/src/plugins/coreaudio/coreaudiosessionmanager.mm @@ -38,7 +38,6 @@ ****************************************************************************/ #include "coreaudiosessionmanager.h" - #import #import @@ -215,10 +214,6 @@ CoreAudioSessionManager::CoreAudioSessionManager() : QObject(0) { m_sessionObserver = [[CoreAudioSessionObserver alloc] initWithAudioSessionManager:this]; - setActive(true); - // Set default category to Ambient (implies MixWithOthers). This makes sure audio stops playing - // if the screen is locked or if the Silent switch is toggled. - setCategory(CoreAudioSessionManager::Ambient, CoreAudioSessionManager::None); } CoreAudioSessionManager::~CoreAudioSessionManager() -- cgit v1.2.3