7

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

[(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]; 

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

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

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

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

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

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

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

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

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

Итак, я попытался установить это свойство (эти свойства) в 3 различными способами:

  • kAudioSessionProperty_OverrideAudioRoute с kAudioSessionOverrideAudioRoute_Speaker продолжает играть аудио, но переключает его через приемник, и показывает маршрут как ReceiverAndMicrophone
  • kAudioSessionProperty_OverrideCategoryDefaultToSpeaker с kAudioSessionOverrideAudioRoute_Speaker останавливает текущий воспроизводимый звук, и показывает маршрут как SpeakerAndMicrophone
  • kAud ioSessionProperty_OverrideCategoryDefaultToSpeaker со значением 1 делает то же самое, как kAudioSessionOverrideAudioRoute_Speaker

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

+0

Привет ... У вас есть решение? Я столкнулся с такой же проблемой. –

ответ

8

По-видимому, порядок настройки свойств имеет значение, хотя об этом не упоминается в документах. Для тех, кто находит это в конечном итоге, вот что работает:

//Init and set the interrupt listener. last parameter is passed to interruptlistener 
AudioSessionInitialize(NULL, NULL, interruptlistener, NULL); 

//Allow the app sound to continue to play when the screen is locked. 
UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); 

//Force current audio out through speaker 
UInt32 routeSpeaker = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(routeSpeaker), &routeSpeaker); 

//Turn on the ability to mix with others 
UInt32 doSetProperty = 1; 
AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);