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

При нажатии кнопки просто измените фоновое изображение кнопки и метку. Измените свойство аудио сеанса в фоновом потоке.

Другие вопросы по тегам