2013-04-26 2 views
8

Я следовал методу, который заботится о своем состоянии динамика:Невозможно управлять спикером на IPad

AudioSession.h

enum { 
    kAudioSessionOverrideAudioRoute_None = 0, 
    kAudioSessionOverrideAudioRoute_Speaker = 'spkr' 
}; 

MyClass

@synthesize speakerEnabled; 

... 

- (void)setSpeakerEnabled:(BOOL)enable { 
speakerEnabled = enable; 
if(enable) { 
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute 
          , sizeof (audioRouteOverride) 
          , &audioRouteOverride); 
} else { 
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; 
    AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute 
          , sizeof (audioRouteOverride) 
          , &audioRouteOverride); 
} 
} 

Однако работает только на iPhone, для iPad - ничего не происходит.

  • При нажатии на кнопку: Speaker On, я вхожу в if(enable) и AudioSessionSetProperty получает kAudioSessionOverrideAudioRoute_Speaker;

  • При нажатии на кнопку: Speaker Off, я вхожу в else и AudioSessionSetProperty получает kAudioSessionOverrideAudioRoute_None;

Я начал отлаживать и не находить разницу между устройствами.

У меня iPad2 iOS 6.1.

Я что-то пропустил?

пожалуйста, помогите мне

Редактировать

Как LombaX говорит, что я добавил на применение запуска AVAudioSession категории:

NSError *err = nil; 
    BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&err]; 

    if(!success){ 
     [MyLogger logc:MyLoggerLog format:"%@",[err localizedDescription]]; 
    } 

success = YES

все еще не работает.

+0

'AudioSessionSetProperty' имеет возвращаемое значение, вы это проверить? – Sulthan

+0

Да, возвращает 'OSStatus = 0' только –

+0

Каково возвращаемое значение вызова setCategory? И, если это НЕТ, относительная ошибка – LombaX

ответ

8

Я думаю, вы поняли использование этого свойства. Вы надеетесь включить/отключить динамик. Это не совсем цель kAudioSessionProperty_OverrideAudioRoute. Скорее, это влияет на выходной звук маршрутизации, довольно ограниченным образом.

Это различные возможные выходные маршруты Avaiable на iPhone

extern const CFStringRef kAudioSessionOutputRoute_LineOut   
extern const CFStringRef kAudioSessionOutputRoute_Headphones    
extern const CFStringRef kAudioSessionOutputRoute_BluetoothHFP   
extern const CFStringRef kAudioSessionOutputRoute_BluetoothA2DP  
extern const CFStringRef kAudioSessionOutputRoute_BuiltInReceiver 
extern const CFStringRef kAudioSessionOutputRoute_BuiltInSpeaker  
extern const CFStringRef kAudioSessionOutputRoute_USBAudio    
extern const CFStringRef kAudioSessionOutputRoute_HDMI    
extern const CFStringRef kAudioSessionOutputRoute_AirPlay 

Это только можно маршруты - то, что на самом деле имеется контекстно-зависимой. Apple строго ограничивает вашу способность определять эти маршруты в приложении, так как это то, что пользователь должен контролировать в соответствии с устройством. Большинство из них определяются неявным образом при подключении/отключении оборудования (наушники, USB, HDMI, линейный выход), и Apple не хочет, чтобы ваше приложение было бесполезно с ожиданиями пользователей здесь.

Airplay можно выбрать с помощью MPVolumeView's routeButton, если контекст мультимедиа верен (и доступен для трансляции). Bluetooth можно руководствоваться OverrideCategoryEnableBluetoothInput (which controls both input and output)

В частности, обратите внимание, что kAudioSessionOutputRoute_BuiltInReceiver находится динамик низкого уровня на iPhone вы держите к уху, когда сделать телефонный звонок. Это маршрут вывода звука по умолчанию для iPhone, если внешнее устройство (например, наушники) не подключено. kAudioSessionOutputRoute_BuiltInSpeaker - громкий динамик громкой связи в нижней части телефона.

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

key: kAudioSessionProperty_OverrideAudioRoute 
values: kAudioSessionOverrideAudioRoute_Speaker 
     : kAudioSessionOverrideAudioRoute_None 

Определяет, будет ли переопределить нормальное аудио маршрута звуковой сессии категории в.

key: kAudioSessionProperty_OverrideCategoryDefaultToSpeaker 
values: TRUE 
     : FALSE 

Указывает, следует ли маршрут аудио на динамик (вместо того, чтобы приемник), когда нет другого аудио маршрута, например, гарнитуру, не подключена.

Оба эти устройства предназначены только для использования в категории аудиозаписей kAudioSessionCategory_PlayAndRecord.

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

iPad, не имеющий телефона, не имеет типа динамика BuiltInReceiver. Это маршрут по умолчанию, при отсутствии подключенных гаджетов или трансляции, это то же самое BuiltInSpeaker. Поэтому переопределение не имеет никакого эффекта.

Предполагая, что вы действительно пытаетесь отключить звук в своем приложении, как вы это достигаете, это зависит от многих других аспектов вашего дизайна приложения. Если вы хотите отключить устройство , Apple предпочла бы, чтобы пользователь контролировал его с помощью переключателя «звонок/тихий». Кажется, у них не было бы другого пути:

У меня был ответ от Apple на это. Они сказали, что они этого не делают и никогда не предоставляли метод обнаружения аппаратного переключателя отключения звука и не намерены это делать.https://stackoverflow.com/a/8009073/1375695

«Установки динамика является overide для устройства, а не для данного звука»
http://lists.apple.com/archives/coreaudio-api/2009/Mar/msg00300.html

+0

Спасибо за «очистить» мой разум. Я не гуру iOS :) и ваше описание ясное. В любом случае, если этот способ не работает на iPad, я могу использовать обходное решение, по крайней мере, для отключения громкоговорителя, как установленный том 0 и наоборот 100% при нажатии? –

+0

@MaximShoustin, это зависит от вашего дизайна - например, если вы используете AVAudioPlayer, вы можете установить свойство 'volume' равным 0 – foundry

+0

Я использую протокол SIP и показываю видео/аудио с другого устройства (кодек x264) –

2

Вы пытались установить категорию звука перед воспроизведением? Я помню, у меня была та же проблема, некоторое время назад, и нашел это решение (настроить категорию)

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 

я не нашел ничего о документации, я думаю, что на IPad вы должны установить категорию, потому что iPhone и iPad отличается детализацией: на iPhone левый аппаратный переключатель может отключить динамик. На iPad один и тот же переключатель используется для блокировки вращения.

Try и дайте мне знать

EDIT:

полезная ссылка:

http://developer.apple.com/library/ios/#documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Cookbook/Cookbook.html

Смежные вопросы