Я знаю, я должен установить 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);
Хорошо, чтобы добавить ответ Джонатана Уотмо, действительно, кажется невозможным позволить AudioServicesSystemSound перезаписывать переключатель отключения звука. В итоге я использовал OpenAL для воспроизведения звуков, которые будут воспроизводиться нормально после указанной вами категории Audio Session. Вот как я настраиваю аудиосеанс:
AudioSessionInitialize(NULL, NULL, NULL, NULL);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory), &sessionCategory);
AudioSessionSetActive(YES);
Для воспроизведения звуков я использовал Finch , простой проигрыватель звуковых эффектов на основе OpenAL для iPhone.
Вы вызываете 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];
Я еще не пробовал, но вы можете захотеть изменить свойство загруженного звука:
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 );
Я не могу найти явного упоминания об этом в документации, но я бы ожидал, что 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];