2010-06-17 26 views
8

我知道,我必须将AudioSession设置为“播放”类别,即使静音开关打开时也允许使用音频。这就是我所做的,但开关打开时,声音仍会消失。PlaySystemSound与静音开关

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。播放声音是应用程序的唯一目的。下面是苹果文件说一下:

使用此类别的应用程序 其音频播放是首要 重要性。即使 屏幕锁定并且 铃声/静音开关设置为无声,您的音频也会播放。


编辑2:与静音开关,声音甚至不会通过耳机播放。 我知道用户是王。我知道静音开关有其目的。这不是问题。我试图得到一个答案,将AudioSession类别设置为kAudioSessionCategory_MediaPlayback没有预期的结果。


编辑3:以下乔纳森Watmough的建议下,我设置了AudioServiceskAudioServicesPropertyIsUISound财产,但仍然没有运气。我错过了什么吗?

// 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); 
+0

显得完全是恶意的,当用户静音自己的手机来播放声音。如果系统级别的东西不这样做,为什么你的应用程序。除非你的应用程序是“核反应堆崩溃警告”,否则我认为没有理由为什么应该允许你的应用程序中断会议,婚礼或有噪音的葬礼。 – 2010-06-17 02:26:49

+0

从Apple Doc:“将此类别用于音频播放非常重要的应用程序。即使屏幕锁定并且Ring/Silent开关设置为无声,您的音频仍会播放。” – samvermette 2010-06-17 02:28:41

+0

那么什么归类为您的首要重要?我想在一天结束时他们已经打开你的应用程序,因为我忘记了你的应用程序不能在没有打开它的情况下执行操作,但即使它们的手机静音并且听不到任何似乎期望的行为的噪声,它仍然可以。 – 2010-06-17 02:31:48

回答

4

好上添加乔纳森Watmough的答案,事实上,它似乎并不可能让AudioServicesSystemSound覆盖静音开关。我最终做的是使用OpenAL来播放声音,这将在您指定的音频会话类别后播放。下面是我设置的音频会议:

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

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

+0

谢谢你的回答。我做了一个测试,你是对的,使用芬奇使用O即使使用kAudioSessionCategory_MediaPlayback设置了静音,penAL也能让您播放声音(如此常数的文档中所述)。 – yonel 2011-03-18 17:07:13

1

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

kAudioServicesPropertyIsUISound 一个UInt32的值,其中1 意味着,对于音频文件由在inSpecifier参数中传递的系统声音指定,System Sound服务器尊重Sound Effects首选项中的用户设置,并在用户关闭音效时保持沉默。 默认情况下,此属性设置为1。 无论用户在声音首选项中的设置如何,系统声音在传递到AudioServicesPlaySystemSound时始终播放时设置为0。 适用于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

认为这是它,但没有:(请参阅我原来的帖子编辑3 – samvermette 2010-06-17 15:58:35

+0

是的,这是我的想法。请强调这一事实的答案,它不能用SystemSound(建议OpenAL)完成,所以我可以接受你的答案。非常感谢您的帮助! – samvermette 2010-06-18 19:10:00

+0

这段代码是错误的。您需要传递一个SystemSoundID作为第二个和第三个参数。 – matt 2011-01-08 19:54:28

0

你打电话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

我找不到它在文档中明确提到,但我期望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

我正在播放不应该与AVAudioPlayer一起播放的超级短音。AudioServicesPlaySystemSound或OpenAL是2合适的声音引擎可以播放短暂的声音 – samvermette 2010-06-24 06:37:39

+0

那么你不能使用AudioServicesPlaySystemSound作为“系统”来控制会话混音选项,包括静音。我看不出一种方法来规避这种情况,尽管它有时可以非常方便 – Crufty 2010-06-25 07:36:53

0

我使用下面的代码来解决我的问题

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