AVAudioSession / переключение выходов Audio Session Services

Хорошо, моя AVAudioSession определена следующим образом (да, смесь вызовов c и obj-c). Также обратите внимание, что приложение имеет звук в фоновом режиме, потому что при записи оно должно продолжаться, пока приложение находится в фоновом режиме:

[(AVAudioSession *)[AVAudioSession sharedInstance] setDelegate: self];
// Allow the app sound to continue to play when the screen is locked.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
//Turn off automatic gain on the microphone
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeMeasurement error:nil];
//Turn on the ability to mix with others
UInt32 doSetProperty = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);

//Activate the audio session
[[AVAudioSession sharedInstance] setActive:YES error:nil];

В приложении есть несколько различных опций для аудио (запрограммированы только первые два):

Обычный: нет звука из приложения, поэтому не связывайтесь с внешним звукомТолько запись с микрофона гарнитуры: не должна иметь регулировки усиления и не связываться с внешним звуком (который будет воспроизводиться через гарнитуру)Воспроизведение музыки из приложения без записи: остановка внешнего звука и воспроизведение через токовый выход (динамик или гарнитура)Воспроизведение музыки из приложения и запись на микрофон гарнитуры: отключайте звук снаружи, записывайте и воспроизводите только через гарнитуру

Запись хорошо работает на переднем и заднем плане, и я добавлю игру позже. Однако я только сегодня вечером заметил, что если на громкоговорителе уже воспроизводится звук (Pandora), и я захожу в свое приложение и активирую режим записи, то он переключает Pandora на воспроизведение через громкоговоритель телефона, и даже после отключения аудиосессии и приложение находится в фоновом режиме (но не принудительно закрывается), звук продолжает воспроизводиться через динамик телефона, пока я не принудительно закрою приложение.

//Deactivate the audio session
[[AVAudioSession sharedInstance] setActive:NO error:nil];

С другой стороны, если гарнитура включена, и музыка воспроизводится через гарнитуру, когда приложение запускается в режиме записи, тогда существует только короткая пауза, и музыка продолжает воспроизводиться с той же громкостью (правильно, без приглушения) ,

Я не вижу причин, по которым маршрут должен меняться, когда я активирую аудио сеанс без гарнитуры, и почему он не меняется обратно, когда сеанс деактивирован. Особенно переходя на динамик телефона! Есть ли что-то, что я делаю неправильно, или мне просто нужно определить AVAudioSession по-разному, в зависимости от того, что пользователь хочет сделать (вместо общего воспроизведения + записи и измерения режима)? И даже если мне нужно определить его отдельно для разных вариантов использования. Например, звук всегда будет проходить через гарнитуру, если приложение записывает, а если приложение не записывает, то звук выводит либо гарнитуру, либо громкоговоритель (в зависимости от того, подключен ли пользователь к гарнитуре или нет). т.е. нормальное поведение).

дополнительные детали

Хорошо, я попытался переключить весь код c и заметил в документах записку о kAudioSessionProperty_OverrideAudioRoute

kAudioSessionOverrideAudioRoute_None
Указывает, для категории kAudioSessionCategory_PlayAndRecord, что выходной звук должен идти на приемник. Это аудио выход по умолчанию для этой категории.

Затем я попытался установить это свойство (эти свойства) тремя различными способами:

kAudioSessionProperty_OverrideAudioRoute с kAudioSessionOverrideAudioRoute_Speaker продолжает воспроизведение аудио, но переключает его через ресивер и показывает маршрут как ReceiverAndMicrophonekAudioSessionProperty_OverrideCategoryDefaultToSpeaker с kAudioSessionOverrideAudioRoute_Speaker останавливает воспроизводимое в данный момент аудио и показывает маршрут как SpeakerAndMicrophonekAudioSessionProperty_OverrideCategoryDefaultToSpeaker со значением 1 делает то же самое, что и kAudioSessionOverrideAudioRoute_Speaker

Поэтому в основном документы говорят, что по умолчанию стоит переключиться на приемник. Тем не менее, независимо от того, что я делаю, я не могу сохранить выходной сигнал динамика и поддерживать воспроизведение внешнего звука.

Ответы на вопрос(1)

Ваш ответ на вопрос