kAudioSessionOverrideAudioRoute_Speaker проблема
Мне нужно очень быстро запустить аудио-маршрут iphone от динамика к обычному режиму. Я создал аудио-сессию, похожую на этот сайт:
http://atastypixel.com/blog/using-remoteio-audio-unit/
Я создаю приложение, которое может делать VOIP.
Итак, позвольте мне объяснить простую проблему, которая у меня есть. У меня есть кнопка, которая переключается из динамика в обычный режим, например:
if (speakerState) {value = kAudioSessionOverrideAudioRoute_None; error = AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof (значение) и значение); speakerState = false; } else { value = kAudioSessionOverrideAudioRoute_Speaker; error = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(значение) и значение); speakerState = true; }
... у вас есть идея просто включать и выключать динамик.
Вот в чем проблема: когда конечный пользователь БЫСТРО нажимает кнопку, чтобы переключить динамик после примерно 10 нажатий, приложение на некоторое время зависает, как будто оно что-то отпускает, и через 30 секунд возвращается. Мне нужно, чтобы конечный пользователь мог постоянно нажимать на эту кнопку вкл / выкл столько, сколько он хочет.
обновление: я попытался вызвать динамики в фоновом потоке, но все же, если я нажимаю на динамики слишком много раз, он зависает, или я теряю аудио, вот код:
- (void) manageSpeakerState {
OSStatus error;
UInt32 value;
if(speakerState){
value = kAudioSessionOverrideAudioRoute_None;
error = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(value), &value);
speakerBtn.selected = false;
speakerState = false;
}
else {
value = kAudioSessionOverrideAudioRoute_Speaker;
error = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(value), &value);
speakerBtn.selected = true;
speakerState = true;
}
}
// вызывается всякий раз, когда нажимается кнопка динамика.. он включает / выключает динамики -(IBAction) speaker {
[self performSelectorInBackground:@selector(manageSpeakerState) withObject:nil ];
}
ОБНОВЛЕНИЕ: Мой аудио сеанс выполняется в отдельном потоке с использованием pthread и в файле.c. Это может быть проблема параллелизма, поскольку кажется, что когда основной поток связан, эта проблема возникает. Как я могу обновить аудио маршрут в потоке, в котором запущен аудио сеанс?
ОБНОВЛЕНИЕ: у меня та же проблема, что и эта: http://lists.apple.com/archives/coreaudio-api/2012/Jul/msg00129.html
Всякий раз, когда я меняю маршруты (например, динамик или наушники), мои аудиоустройства приостанавливаются, поэтому я читаю пустые вещи в буферы. Это почти как проблема производителя оборудования. Как я могу обойти это? обратные вызовы все еще вызывают, но при переключении маршрутов нет аудиоустройства.
2 ответа
В вашем приложении делегат просто добавьте этот кусок кода.. Я надеюсь, что он работает нормально.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
При нажатии кнопки просто измените фоновое изображение кнопки и метку. Измените свойство аудио сеанса в фоновом потоке.