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


編集:ちなみに、アプリはサウンドパッドです。音を鳴らすことがアプリの唯一の目的です。これについてAppleDocが言っていることは次のとおりです。

このカテゴリは、オーディオの再生が最も重要なアプリケーションに使用します。画面がロックされていて、リング/サイレントスイッチがサイレントに設定されている場合でも、オーディオは再生されます。


編集2:ミュートスイッチをオンにすると、ヘッドホンからも音が再生されません。私はユーザーが王様であることを知っています。ミュートスイッチにはその目的があることを私は知っています。それは問題ではありません。AudioSessionカテゴリをに設定し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);
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);

サウンドを再生するために、iPhone用のシンプルなOpenALベースのサウンドエフェクトプレーヤーであるFinchを使用しました。

于 2010-06-26T17:23:41.677 に答える
1

まだ試していませんが、ロードしたサウンドのプロパティを変更することをお勧めします。

kAudioServicesPropertyIsUISound UInt32値。1は、inSpecifierパラメーターで渡されたシステムサウンドによって指定されたオーディオファイルの場合、システムサウンドサーバーがサウンドエフェクト設定のユーザー設定を尊重し、ユーザーがサウンドエフェクトをオフにするとサイレントになることを意味します。このプロパティはデフォルトで1に設定されています。サウンド設定でのユーザーの設定に関係なく、AudioServicesPlaySystemSoundに渡されたときにシステムサウンドが常に再生されるようにするには、0に設定します。iPhoneOS2.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

あなたは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];
于 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 に答える