禁用所有程序声音

时间:2009-07-18 13:37:51

标签: iphone

我想设置一个设置来禁用来自我的程序的所有声音。我知道我可以设置一个全局的ivar并为每个声音写if语句,但我希望我可以在appdelegate中设置一些禁用所有程序声音的东西。

我玩了几场游戏,让你可以关闭游戏声音。

我正在使用AVAudioPlayer获取更长的剪辑和基本的音频服务系统声音用于短片。

1 个答案:

答案 0 :(得分:0)

你用什么来播放声音?我认为您可以通过停用音频会话来禁用声音 - 请参阅AudioSessionSetActive


更新:是的,你是对的。我刚刚尝试停用音频会话,声音似乎还在继续。没关系。您可以使用布尔标志方法,并且不需要在每个声音周围都有条件。我在游戏中使用SFX的方式是通过一个单独的类,一种观察模型并为各种游戏事件创建声音的“视图”。这样,您可以在设计中保持清晰的关注点分离,并且当您想要关闭声音时,只需将声音类与模型断开即可。代码看起来有点像这样:

@implementation Model

- (void) stepBy: (double) seconds
{
     [player doSomething];
     if (player.isDead)
        [self sendNotification:@selector(playerHasDied:) withObject:player];
}

@end

声音观点:

@implementation SFX

- (void) playerHasDied: (id) player
{
    [aarghSound play];
}

@end

当然,你必须实施实际的观察部分。您可以使用NSNotificationCenter或使用观察者数组编写自己的调度代码:

@implementation Model

- (void) addObserver: (id) object
{
    [observers addObject:object];
}

- (void) sendNotification: (SEL) message
{
    for (id observer in observers)
        if ([observer respondsToSelector:message])
            [observer performSelector:message];
}

@end

SFX视图已连接到模型:

Model *model = [[Model alloc] init];
SFX *sounds = [[SFX alloc] init];
[model addObserver:sounds];

如果要禁用所有声音,只需断开SFX与模型的连接;停止观察。如果在游戏开始之前声音被禁用,您甚至不必分配SFX类 - 这样可以节省时间,性能和内存。