2011-10-27 34 views
8

何週間も実際に何が起こったのか把握しようとしていましたが、なぜ中断後に再生を続けることができないのかわからないので、おそらくあなたは答えを知っています。 AudioSessionSetActive(TRUE)は、アプリがバックグラウンドで再生され、別のアプリに入っている場合、再アクティブ化中に常に '!cat'を返します。これはkAudioSessionIncompatibleCategoryです。それはうまく動作し、私のアプリで中断したときに再生を続ける。中断後にAudioSessionSetActiveが失敗する

オリジナルのコードでは、実際にすべてのAudioSessionとAudioQueue呼び出しがエラーを意味する場合はOSStatusを出力するマクロにラップされていますが、読みやすくするために削除しました。また、[self pause]は一時停止をトグルするだけなので、基本的にはupauseでAudioQueueStart(audioQueue、NULL)を呼び出しますが、AudioSessionが失敗した場合は動作しません。

オーディオセッションの初期化コード:

AudioSessionInitialize(NULL, NULL, _audioSessionInterruptionListener, self); 
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); 
AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, _audioSessionPropertyListener, self); 
AudioSessionSetActive(TRUE); 

割り込みハンドラコード:

- (void)handleInterruptionChangeToState:(AudioQueuePropertyID)inInterruptionState 
{ 
    if(inInterruptionState == kAudioSessionBeginInterruption) 
    { 

     NSLog(@"+Interruption"); 

     if(self.state == NX_STATE_PLAY) 
     { 
      [self pause]; 
      AudioSessionSetActive(FALSE); 

      isPausedByInterruption = YES; 
     } 
    } 
    else if(inInterruptionState == kAudioSessionEndInterruption) 
    { 
     if(isPausedByInterruption) 
     { 
      AudioSessionSetActive(TRUE); 
      [self pause]; 

      isPausedByInterruption = FALSE; 
     } 

     NSLog(@"-Interruption"); 
    } 
} 

、それは問題を解決するために何とかつもり助けだ場合には、このストリーマソースコードはここhttps://bitbucket.org/and/amaudiostreamer/src/122de41fe6c0/AMAudioStreamer/AMAudioStreamer/Classes/NxAudioStreamer.m見つけることができます。..

答えて

0

でAudioSessionを有効にしてくださいelseの場合は

AVAudioSession *session = [AVAudioSession sharedInstance]; 
NSError *error = nil; 

[session setCategory: AVAudioSessionCategoryPlayback error: &error]; 
if (error != nil) 
    NSLog(@"Failed to set category on AVAudioSession"); 

// AudioSession and AVAudioSession calls can be used interchangeably 
OSStatus result = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, RouteChangeListener, self); 
if (result) NSLog(@"Could not add property listener! %d\n", result); 

BOOL active = [session setActive: YES error: nil]; 
if (!active) 
    NSLog(@"Failed to set category on AVAudioSession"); 

しかし、私のケースでは何が起こったのかは、私がバックグラウンドにいたときにセッションが得られなかったためです。しかし、AppleのaurioTouch exampleを分析して、AppDelegateファイルを通過し、同じ問題を説明する(void)rioInterruptionListenerメソッドを分析しようとします。

オーディオのライブストリーミングを使用していますか?私はquestion's answerを調べることをお勧めします。そこでは、キューの開始の問題は、私の答えで与えられたエラーを処理することによって解決されます。

いずれかお役に立てば幸いです。

+0

期待通りに動作しませんし、よりファッショナブルな方法で同じエラーが表示されます: "AVAudioSessionでカテゴリを設定できませんでした。操作を完了できませんでした(OSStatusエラー560161140)。"私はrioInterruptionListenerを分析しようとします。私はちょっとしたことを逃したと思います。 – Andy

+0

それから私はまずあなたが私の質問の答えでその事を試しなければならないと信じています。しかしここでは、正確な問題を得るのは難しいでしょう。コードを修正する場所を正確に特定する必要があります。私がやったとき、これは私のための挑戦でした...幸運のあなたに...あなたが問題を解決できることを願って... – DShah

0

kAudioSessionEndInterruptionがコードにヒットすることも、ヒットしないこともあります。再生状態を制御するための信頼できる方法ではなく、オーディオセッションをコード内でオフにしないでください。あなたのケースでは、AudioSessionSetActive(FALSE)をコメントアウトするだけで役立ちます。

+0

私はあなたのポイントを参照してください、それは私がオーディオセッションを取得するのに役立ちません私は私のコードからAudioSessionSetActive(FALSE)を削除していますが、私はまだこのようなことを取得しています。( – Andy

0

あなたはAudio Session Programming Guide cookbook sectionListing 7-16 An interruption listener callback functionを見れば、(kAudioSessionCategory_MediaPlaybackを使用して、あなたの状況と互換性があるように思われる)のサンプルコードは、実際にkAudioSessionBeginInterruptionの場合

AudioSessionSetActive(FALSE); 

呼び出しを実行しないと、

AudioSessionSetActive(TRUE); 

kAudioSessionEndInterruptionの場合はコールします。私は本当にあなたがこれをやるべきだとは思わない。 This postもこの問題を説明しているようです(kAudioSessionIncompatibleCategoryを取得する)。これらの呼び出しを両方ともコメントアウトするとどうなりますか?

アプリがバックグラウンドで、フォアグラウンドではなくミステリーのときに問題が発生する理由です。おそらく[自己ポーズ](トグルプレイ状態)が呼び出されているように(おそらくNX_STATE_PLAYを使っているような)状態を追跡し、次に2つの異なるメソッド([セルフポーズ]と[セルフプレイ])を持つべきです。予期しない回数。

+0

[self pause]は2回しか呼び出されませんでしたので、基本的にAudioQueuePauseを中断開始に、AudioQueueStartを中断終了にしました。 '!猫 - :私のログに VERIFY_OSS AudioQueueStart(audioQueue、NULL) - VERIFY_OSS AudioSessionSetActive(真)-12985 – Andy

0

私はそれが私のために働く方法を得た、あなたのリスクを試すことができます。

機能で

void _audioSessionInterruptionListener(void *inClientData, UInt32 inInterruptionState) 

[(NxAudioStreamer*)inClientData handleInterruptionChangeToState:inInterruptionState]; 

audioSessionInterruptionListenerがパラメータとしてinInterruptionStateを持っているので、あなたが直接audioSessionInterruptionListenerでそれを扱うことができるときhandleInterruptionChangeToStateを呼び出す必要を削除しません。あなたは、いくつかの要因に依存し、いくつかの余分な手順を実行する必要がありAudioQueueのAPIを使用している場合はそうaudioSessionInterruptionListener

void _audioSessionInterruptionListener(void *inClientData, UInt32 inInterruptionState) 
{ 
    if(inInterruptionState == kAudioSessionBeginInterruption) 
    { 

        NSLog(@"+Interruption"); 

        if(self.state == NX_STATE_PLAY) 
        { 
            [self pause]; 
            AudioSessionSetActive(FALSE); 

            isPausedByInterruption = YES; 
        } 
    } 
    else if(inInterruptionState == kAudioSessionEndInterruption) 
    { 
        if(isPausedByInterruption) 
        { 
            AudioSessionSetActive(TRUE); 
            [self pause]; 

            isPausedByInterruption = FALSE; 
        } 

        NSLog(@"-Interruption"); 
    } 
} 
+0

私はこれをあきらめたとiOS 3はもう私のために重要ではありませんので、AVFoundationを使用すると考えてくれてありがとう。とにかく答えます – Andy

3

にあなたのを修正。私は決してそれをしていないので、私は専門家に説明を残します:
その問題についてはApple Developer Webサイトにそのトピックに関するビデオがあります。 WWDC 2010セッション412 iPhone OSパート1のオーディオ開発について45分ほどで、そのことについてかなり良い説明があります。

+0

私はまだAudioSessionSetActive(true);を返すことができません;返す!cat、おそらくそれは何を返すかは関係ありません、私がしなければならないことは、再生を続けるだけです。ですから、基本的には、ハードウェアコーデックを使用しながらAudioQueueを処分して再作成する必要があります。これはあなたの返事のおかげで非常に重要です。 – Andy

+0

そのビデオにはたくさんのものがありますが、正しく覚えていれば、AudioSessionカテゴリにセクションがあります。おそらくそこに何かが見つかります。 –

2

アプリの実行中にアラームが表示されると、デバイスの電源ボタンが押されてスリープ状態になるという問題がありました。その後、睡眠から再開した後、私のAudioSessionSetActiveは "this audiosession type can't be used"のようなもので失敗します。 InterruptlistenerにAudioSessionSetActive(true)の前にset audiosessionのプロパティを追加しようとしましたが、運がありません。 は最後に、私は)FTW

retry(~1000 times :) 

を追加

AudioSessionSetActive(true), 

、それは私の問題を解決しました。

+0

私はそれが当時の仕事を完全に管理していなかったと思う、それは全くランダムな行動だった。その後、私はAVFoundationとAVSessionに切り替えました。正に、私はAppleがSDKにバグを持っていたと思うし、このコードがiOS 6でも正しく動作するだろうと推測しているが、それは唯一の仮定だ。 – Andy

関連する問題