Категория AVAudioSession не работает, как того требует документация - PullRequest
1 голос
/ 06 апреля 2011

У меня есть приложение для iOS, которое в некоторых местах имеет звуковую обратную связь, но я хочу, чтобы любая другая музыка, которую играет пользователь в фоновом режиме, была разрешена для воспроизведения поверх этого. Кроме того, я хочу, чтобы звук в моем приложении соответствовал выключателю звука. Согласно документации разработчика, все эти функции должны быть включены категорией окружения AVAudioSession. Это код, который я использую:

if (!hasInitialisedAudioSession) {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryAmbient error:NULL];

    [session setActive:YES error:NULL];

    hasInitialisedAudioSession = YES;
}

Код выполняется просто отлично, и он действительно позволяет звукам приложения воспроизводиться поверх музыки iPod. Однако он не уважает переключатель отключения звука. Я пытался заменить этот код на похожие аудио-вызовы C (такие как AudioSessionSetProperty) вместо вызовов Objective-C, но я получаю тот же результат - категория сессионных окружающих просто не хочет уважать переключатель отключения звука, несмотря на то, что документация говорит, что это должно быть сделано.

Есть идеи? Спасибо за помощь:)

1 Ответ

0 голосов
/ 07 апреля 2011

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

РЕДАКТИРОВАТЬ:Чтобы обойти это, просто используйте эту функцию, чтобы определить, включен ли переключатель отключения звука вручную, и не воспроизводите свои звуки, если результат - ДА.Хотя может быть немного больно, если у вас нет класса централизованного управления звуком.Было бы неплохо, если бы Apple могла опубликовать это поведение в своей документации.

- (BOOL)deviceIsSilenced
{
    #if TARGET_IPHONE_SIMULATOR
    // return NO in simulator. Code causes crashes for some reason.
    return NO;
    #endif

    CFStringRef state;
    UInt32 propertySize = sizeof(CFStringRef);
    AudioSessionInitialize(NULL, NULL, NULL, NULL);
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);

    return (CFStringGetLength(state) <= 0);
}
...