PlaySystemSound с включенным отключением звука - PullRequest
8 голосов
/ 17 июня 2010

Я знаю, я должен установить для AudioSession категорию «Воспроизведение», которая разрешает звук даже при включенном выключении звука. Это то, что я делаю, но звук все равно отключается при включении.

 UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
 AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), &sessionCategory);

 SystemSoundID soundID;
 NSString *path = [[NSBundle mainBundle] pathForResource:soundString ofType:@"wav"];    

 AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID);
 AudioServicesPlaySystemSound (soundID);


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

Используйте эту категорию для приложения чье воспроизведение звука имеет первичное важность. Ваш аудио играет даже с экран заблокирован и с Переключатель «Звонок / Без звука» установлен в бесшумный режим.


РЕДАКТИРОВАТЬ 2 : при включенном выключении звука звук не воспроизводится даже через наушники. Я знаю, что пользователь король . Я знаю, что выключатель звука имеет свое назначение. Дело не в этом. Я пытаюсь получить ответ на тот факт, что установка категории AudioSession на kAudioSessionCategory_MediaPlayback не дает ожидаемого результата.


РЕДАКТИРОВАТЬ 3 : следуя совету Джонатана Уотмофа, я установил свойство AudioServices kAudioServicesPropertyIsUISound, но все равно не повезло. Я что-то упустил?

// set the session property
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), &sessionCategory);

// creates soundID
SystemSoundID soundID;
NSString *path = [[NSBundle mainBundle] pathForResource:soundString ofType:@"wav"];    
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID);

// Jonathan Watmough suggestion
UInt32 flag = 0;
AudioServicesSetProperty(kAudioServicesPropertyIsUISound, sizeof(UInt32), &soundID, sizeof(UInt32), &flag);

AudioServicesPlaySystemSound (soundID);

Ответы [ 5 ]

4 голосов
/ 26 июня 2010

Хорошо, чтобы добавить ответ Джонатана Уотмофа, действительно, кажется, невозможно позволить AudioServicesSystemSound перезаписать переключатель отключения звука.В итоге я использовал OpenAL для воспроизведения звуков, которые будут прекрасно воспроизводиться после указанной вами категории аудио-сеанса.Вот как я настраиваю аудио сеанс:

AudioSessionInitialize(NULL, NULL, NULL, NULL);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), &sessionCategory);
AudioSessionSetActive(YES);

Для воспроизведения звуков я использовал Finch , простой проигрыватель звуковых эффектов на базе OpenAL для iPhone.

1 голос
/ 17 июня 2010

Я еще не пробовал, но вы можете изменить свойство загруженного звука:

kAudioServicesPropertyIsUISound Значение UInt32, где 1 означает, что для аудиофайла, заданного системным звуком, переданным в параметре inSpecifier, сервер System Sound учитывает пользовательские настройки в настройке Sound Effects и молчит, когда пользователь отключает звуковые эффекты. . Это свойство установлено в 1 по умолчанию. Установите значение 0, чтобы системный звук всегда воспроизводился при передаче в AudioServicesPlaySystemSound, независимо от настроек пользователя в настройках звука . Доступный в iPhone OS 2.0 и позже. Объявлено в AudioServices.h.

Я ожидаю, что, сделав все остальное правильно, установив для свойства значение 0, система сообщит, что ваш звук - это звук приложения, а не звук «UI» и, следовательно, может быть отключен.

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

Я построил пример SysSound и добавил следующий код, чтобы установить флаг, как вы сделали выше, и он вообще не играет на немом.

 // Set the sound to always play
    int setTo0 = 0;
    AudioServicesSetProperty( kAudioServicesPropertyIsUISound,0,nil,
                             4,&setTo0 );
0 голосов
/ 19 августа 2013

Я использую приведенный ниже код для решения моей проблемы

AudioSessionInitialize(NULL, NULL, NULL, NULL); UInt32   
sessionCategory = kAudioSessionCategory_MediaPlayback;    
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory),
&sessionCategory); AudioSessionSetActive(YES);
0 голосов
/ 24 июня 2010

Я не могу найти это явно упомянутым в документах, но я ожидаю, что AudioServicesPlaySystemSound () игнорирует вашу конфигурацию аудио сеанса.

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

NSError *err;
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:&err];
[session setActive:YES error:&err];

NSString *path = [[NSBundle mainBundle] pathForResource:@"Basso" ofType:@"aiff"];    
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&err];
[player prepareToPlay];
[player play];
0 голосов
/ 18 июня 2010

Вы звоните setActive: ошибка: для AVAudioSession где-то правильно? Вот код, который я использую для инициализации. Но я не использую системные звуки, я использую AVAudioPlayer для воспроизведения звуков.

avSession = [AVAudioSession sharedInstance];    // init session, important

// allow other audio to mix, such as iPod
const UInt32 categoryProp = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(categoryProp), &categoryProp);

UInt32 category = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);

// Allow our audio to mix with any iPod audio that is playing
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(setProperty_YES), &setProperty_YES);

[avSession setActive:YES error:nil];
...