PlaySystemSound с бесшумным режимом включают

Я знаю, я должен установить 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);


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

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


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


РЕДАКТИРОВАНИЕ 3: после предложения Jonathan Watmough я установил 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);
8
задан samvermette 17 June 2010 в 15:57
поделиться

4 ответа

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

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

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

4
ответ дан 5 December 2019 в 23:13
поделиться

Вы вызываете setActive: error: где-то для 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];
0
ответ дан 5 December 2019 в 23:13
поделиться

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

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

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

EDIT: Похоже, что это нельзя сделать с системными звуками. Если вы используете OpenAL, вы, очевидно, сможете играть с установленной кнопкой отключения звука.

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

 // Set the sound to always play
    int setTo0 = 0;
    AudioServicesSetProperty( kAudioServicesPropertyIsUISound,0,nil,
                             4,&setTo0 );
1
ответ дан 5 December 2019 в 23:13
поделиться

Я не могу найти явного упоминания об этом в документации, но я бы ожидал, что 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
ответ дан 5 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

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