PlaySystemSound静音开启

时间:2010-06-17 02:18:16

标签: iphone audio audiosession

我知道,我必须将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 :按照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);

5 个答案:

答案 0 :(得分:4)

嗯,加上Jonathan Watmough的回答,实际上似乎不可能让AudioServicesSystemSound覆盖静音开关。我最终做的是使用OpenAL来播放声音,这些声音将根据您指定的音频会话类别播放。以下是我设置音频会话的方法:

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

为了播放声音,我使用了Finch,一个简单的基于OpenAL的iPhone音效播放器。

答案 1 :(得分:1)

我还没有尝试过,但您可能想要更改加载声音的属性:

<强> 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 );

答案 2 :(得分:0)

你正在为某个地方的AVAudioSession调用setActive:error:吗?这是我用来初始化的代码。但我没有使用系统声音,我正在使用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];

答案 3 :(得分:0)

我无法在文档中明确提到它,但我希望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];

答案 4 :(得分:0)

我正在使用以下代码来解决我的问题

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