Вопрос по ios, audio – Как использовать kAudioSessionProperty_OverrideCategoryMixWithOthers

7

Я хотел бы, чтобы приложение виртуального инструмента могло использоваться (через MIDI-клавиатуру), когда приложение находится в фоновом режиме. Это прекрасно работает, если для UIBackgroundModes установлено значение & quot; audio & quot; и устанавливают категорию AudioSessions в AVAudioSessionCategoryPlayback. Кроме того, чтобы разрешить микширование с приложением Music player, я установил свойство kAudioSessionProperty_OverrideCategoryMixWithOthers.

Для экономии энергии аккумулятора рекомендуется разрешить пользователю отключать фоновую работу, если она не нужна. Поэтому в моем приложении есть переключатель для переключения между категорией AVAudioSessionCategoryAmbient и категорией AVAudioSessionCategoryPlayback (с kAudioSessionProperty_OverrideCategoryMixWithOthers). Код такой (обработка ошибок опущена):

<code>NSString *category = supportsBackgroundOperation ? AVAudioSessionCategoryPlayback : AVAudioSessionCategoryAmbient;

[session setCategory:category error:nil];

if (category == AVAudioSessionCategoryPlayback) {
    UInt32 allowMixing = true;
    AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);
}
</code>

Теперь проблема: предположим, что приложение Музыка играет в фоновом режиме. Пользователь играет на виртуальном инструменте на переднем плане (через MIDI-клавиатуру), чтобы сопровождать музыкальный проигрыватель, и решает запустить еще одно приложение, скажем, слайд-шоу, чтобы получить удовольствие от игры на инструменте. Таким образом он / она идет в представление настроек моего приложения и активирует фоновую операцию. Затем приведенный выше код выполняется. Бум, приложение Музыка замолкает. Насколько я понимаю, свойство kAudioSessionProperty_OverrideCategoryMixWithOthers можно установить толькоafter установка категории, но когда я устанавливаю категорию в AVAudioSessionCategoryPlayback, музыкальный проигрыватель отключается системой, прежде чем у меня появляется возможность установить kAudioSessionProperty_OverrideCategoryMixWithOthers.

Это было случается? Можно ли что-нибудь сделать? Я пытался деактивировать / активировать сеанс до / после изменения категории, но это привело к другим неприятностям.

Markus

Ваш Ответ

3   ответа
-6

Я должен не согласиться с M0rph3v5.

Единственное допустимое значение для параметра withOptions:AVAudioSessionInterruptionOptionShouldResume

Попробуйте это в xcode. Вы получите ошибку компиляции, если будете использовать что-либо другое, кроме AVAudioSessionInterruptionOptionShouldResume.
16

Вы можете достичь этого. Принцип состоит в том, чтобы сначала деактивировать аудио сеанс, настроить все свойства аудио сеанса, а затем активный аудио сеанс. Таким образом, музыка, воспроизводимая в другом приложении, не будет заглушена.

// Initialize audio session
AVAudioSession *audioSession = [AVAudioSession sharedInstance];

// Active your audio session
[audioSession setActive: NO error: nil];

// Set audio session category
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

// Modifying Playback Mixing Behavior, allow playing music in other apps
OSStatus propertySetError = 0;
UInt32 allowMixing = true;

propertySetError = AudioSessionSetProperty (
                       kAudioSessionProperty_OverrideCategoryMixWithOthers,
                       sizeof (allowMixing),
                       &allowMixing);

// Active your audio session
[audioSession setActive: YES error: nil];

Это решение работает для меня. Но из вашего описания вы упомянули, что вы пытались активировать / деактивировать сеанс до / после изменения категории, но привели к другим проблемам. Вы делали деактивацию / активацию точно так же, как указано выше? Если да, предоставьте больше информации о других проблемах и, возможно, я смогу помочь.

Сначала я передаю NO в setActive, чтобы деактивировать аудиосеанс, затем изменяю свойство и, наконец, передаю YES в setActive, чтобы снова активировать аудиосеанс.
Спасибо за вашу помощь, и мне жаль, что мой ответ "немного" поздно. Я столкнулся с той же проблемой в другом приложении (с другой категорией аудио, AVAudioSessionCategoryPlayAndRecord). Оказалось, что причина не в том, как я настроил и активировал сеанс, а в том, что я инициализировал звуковой график перед настройкой свойств сеанса. Когда я сначала устанавливаю свойства сеанса (смешиваюсь с другими), затем создаю звуковой график, а через некоторое время устанавливаю сеанс активным, тогда звук других приложений не отключается. masi
Почему вы передаете НЕТ setActive? В соответствии с документами: «Параметры beActive Используйте YES, чтобы активировать аудиосеанс вашего приложения, или« NO », чтобы деактивировать его.»developer.apple.com/library/ios/#documentation/AVFoundation/…  или я что-то упустил?
17

Начиная с iOS 6.0 вы можете использовать

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];
И вернемся к не смешиванию:[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:0 error:nil];

Похожие вопросы