代码之家  ›  专栏  ›  技术社区  ›  samvermette

打开静音开关时播放系统声音

  •  8
  • samvermette  · 技术社区  · 15 年前

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


    编辑 :顺便说一句,这个应用程序是一个音板。播放声音是应用程序的唯一目的。以下是苹果医生对此的看法:

    将此类别用于应用程序 其音频播放为主 重要性。即使使用 屏幕被锁定 响铃/静音开关设置为静音。


    编辑2 :当静音开关打开时,耳机甚至无法播放声音。 我知道用户是国王 . 我知道静音开关有它的作用。这不是问题。我正试图得到一个关于设置 听音 类别到 kAudioSessionCategory_MediaPlayback 没有预期的结果。


    编辑3 :按照乔纳森·瓦莫的建议,我把 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 回复  |  直到 11 年前
        1
  •  4
  •   samvermette    15 年前

    好吧,再加上乔纳森·沃特莫尔的回答,实际上似乎不可能让音频服务系统覆盖静音开关。我最后做的是使用Openal来播放声音,它将按照您指定的音频会话类别播放。以下是如何设置音频会话:

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

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

        2
  •  1
  •   Jonathan Watmough    15 年前

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

    KaudioServicesPropertiesIsound uint32值,其中1 意味着,对于通过Inspector参数传递的系统声音指定的音频文件,系统声音服务器尊重“声音效果”首选项中的用户设置,并且在用户关闭“声音效果”时静音。 . 默认情况下,此属性设置为1。 将其设置为0,以便系统声音在传递到audioservicesplaysystemsound时始终播放,而不考虑用户在“声音首选项”中的设置。 . 适用于iPhone OS 2.0及更高版本。 在audioservices.h.中声明。

    我希望在做了所有其他正确的事情之后,将属性设置为0将告诉系统您的声音是应用程序声音,而不是“用户界面”声音,因此会受到静音的影响。

    编辑:看起来不能用系统声音来完成。如果您通过openal,显然可以使用静音按钮组进行播放。

    我构建了SysSound示例,并添加了以下代码来设置标志,就像上面所做的那样,它根本不在静音状态下播放。

     // Set the sound to always play
        int setTo0 = 0;
        AudioServicesSetProperty( kAudioServicesPropertyIsUISound,0,nil,
                                 4,&setTo0 );
        3
  •  0
  •   progrmr    15 年前

    你在呼唤 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];
    
        4
  •  0
  •   Crufty    15 年前

    我在文档中找不到明确提到的,但我希望audioServicesPlaysSystemsound()忽略您的音频会话配置。

    如果要控制会话混合和其他属性,则需要改用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];
    
        5
  •  0
  •   user1066009    11 年前

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

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