2

特定の場所にオーディオ フィードバックがある iOS アプリを持っていますが、ユーザーがバックグラウンドで再生している他の音楽をこれで再生できるようにしたいと考えています。さらに、アプリのオーディオがミュート スイッチを尊重するようにします。開発者のドキュメントによると、この機能はすべて AVAudioSession アンビエント カテゴリで有効にする必要があります。これは私が使用しているコードです:

if (!hasInitialisedAudioSession) {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryAmbient error:NULL];

    [session setActive:YES error:NULL];

    hasInitialisedAudioSession = YES;
}

コードは問題なく実行されており、実際にアプリのサウンドを iPod の音楽で再生できます。ただし、ミュート スイッチを尊重することはできません。Objective-C 呼び出しの代わりに、このコードを同様の C オーディオ呼び出し (AudioSessionSetProperty のようなもの) に交換しようとしましたが、同じ結果が得られます。ドキュメントには、そうすべきだと書かれています。

何か案は?助けてくれてありがとう :)

4

1 に答える 1

0

どうにか解決できたと思いますが、それは私のアプリとはまったく関係がなく、iPod アプリとはまったく関係がないことがわかりました。私のアプリは、iPod が再生されていないときと同じようにミュート スイッチに従い、iPod が再生できるようにします。ただし、iPod の再生中はアプリがミュート スイッチに反応しなくなるので、iPod がデバイスのオーディオ設定に対して行っていることだと思います。本当に時間を使いたいのであれば、おそらくそれを回避する方法もあるでしょうが、iPod が再生されていないときにミュート スイッチに従う限り、それで十分です。

編集: これを回避するには、この関数を使用してミュート スイッチが手動でオンになっているかどうかを判断し、結果が YES の場合はサウンドを再生しないでください。ただし、中央のオーディオ マネージャー クラスがない場合は、少し面倒かもしれません。Apple がこの動作をドキュメントで公開できればいいのですが。

- (BOOL)deviceIsSilenced
{
    #if TARGET_IPHONE_SIMULATOR
    // return NO in simulator. Code causes crashes for some reason.
    return NO;
    #endif

    CFStringRef state;
    UInt32 propertySize = sizeof(CFStringRef);
    AudioSessionInitialize(NULL, NULL, NULL, NULL);
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);

    return (CFStringGetLength(state) <= 0);
}
于 2011-04-07T01:03:23.240 に答える