8

我知道,我必须将其设置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);
4

5 回答 5

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 音效播放器。

于 2010-06-26T17:23:41.677 回答
1

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

kAudioServicesPropertyIsUISound 一个 UInt32 值,其中 1表示,对于 inSpecifier 参数中传递的系统声音指定的音频文件,系统声音服务器尊重用户在 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 );
于 2010-06-17T15:36:52.623 回答
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];
于 2010-06-18T16:58:07.340 回答
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];
于 2010-06-24T05:17:22.590 回答
0

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

AudioSessionInitialize(NULL, NULL, NULL, NULL); UInt32   
sessionCategory = kAudioSessionCategory_MediaPlayback;    
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,sizeof(sessionCategory),
&sessionCategory); AudioSessionSetActive(YES);
于 2013-08-19T13:08:18.810 回答