2

ストアにオーディオ アプリがあります。iOS 4.0 より前のバージョンの iPhone OS では問題なく動作します。アプリを新しい iOS マルチタスク機能に準拠させることから始めて、新しいバージョンに取り組んでいます。(私の iPhone には iOS 4.0 があり、最新の xCode と SDK にアップグレードしました。)

結果はショーストッパーでした。

o iPhone にアプリをインストールしてデバッガーで実行するか、iPhone の電源を切った後にアプリを起動すると、アプリは問題なく動作します。アプリが前回実行された時間。

o ホーム ボタンを押してバックグラウンドからアプリを再起動しようとすると、オーディオ (a および 1-n オーディオ ストリームのミックス) が、私だけが認識できる途切れ途切れの音で出てきます。

o 音声がきれいなうちに iPhone に電話をかけた場合、電話に出るか拒否することができます。どちらの場合も、アプリは正常に戻り、正常に再生されます。

バックグラウンド モードでは何も再生しようとしていないことに注意してください。私は単に物事を止めて、尋ねられたら元に戻したいだけです。

テクノロジー: すべてのオーディオ ロジックは RemoteIO を使用します。(私はいつかかなり洗練された信号処理を行う計画を持っています。)

疑似コードの説明はご容赦ください。実際のコードの一部はかなり広範です。

MainViewController:

o viewDidLoad - 特別なことは何もありません

o didBecomeActive は、自分自身をオーディオ セッション デリゲートとして設定します。AudioSessionCategory を MediaPlayback に設定します。AudioSessionActive を設定します。プレーヤーを作成します (以下を参照)。以前に再生されていたサウンドを再開します。

o willResignActive 再生中の状態を保存します。stopAllSounds; プレーヤーを停止します。オーディオ セッションを非アクティブに設定します。

o didEnterBackground - なし (メソッドは登録されていますが、コンテンツはありません。)

o willEnterForeground - なし (メソッドは登録されていますが、コンテンツはありません。)

Player の概要 - 私のクラス: Player はシングルトンです。didBecomeActive で、シングルトン インスタンスが破棄され、新しいインスタンスが作成されていることを確認します。シングルトンをインスタンス化すると、実際に AudioUnit が開始されます。

コンストラクター setupRemoteIO; AudioOutputUnitStart を開始します。AudioOutputUnitStop を停止します。プレーヤーは通常のものをコールバックします。

>

ここに私の MainViewController からのいくつかのメソッドがあります:

(void)willResignActive:(NSNotification *)note {
    [ self saveState ];
    [ [ NaturePlayer getInstance ] stopAllSounds ];
    [ [ NaturePlayer getInstance ] stop ];
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: NO error: &activationError]; 
    [NaturePlayer destroy];

}

- (void)didBecomeActive:(NSNotification *)note {
    [ self setupAudioSession ];

    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; 
    [ self restartSounds ];
    [ self setViewState ];
}

- (void)didEnterBackground:(NSNotification *)note {
    int xxx = 1;
}

- (void)willEnterForeground:(NSNotification *)note {
    int xxx = 1;
}

- (void) applicationWillTerminate: (NSNotification*) notification {
    int xxx = 1;
}

以下は NaturePlayer のメソッドです。

/**
 * Stop the playback process.
 */
void NaturePlayerDelegate::stop() {
    if (isPlaying_) {
        AudioOutputUnitStop(outputUnit_);
        isPlaying_ = FALSE ;        
    }

}

私はチェックしました:stop()が呼び出され、次にAudioOutputUnitStop()を呼び出します。またチェック: AudioOutputUnitStop のドキュメントには、すべてのアクティビティが完了するまでブロックすると書かれています。

4

3 に答える 3

0

コード内でAudioUnitsを初期化および非初期化していますか?最近、AudioUnitが作成および破棄されてから、アプリを離れてアプリに戻ると、途切れが発生するという問題を発見しました。

AudioUnitsを初期化しないことで、アプリケーションでこれを修正することができました。

私の問題と私のAudioUnitコードに関する詳細情報。

于 2011-05-25T23:33:51.077 に答える
0

オーディオ コードの詳細がなければ、なんとも言えません。ただし、Player オブジェクトのティアダウン コードを調べて、オーディオ ユニットとオーディオ セッションが完全に停止していること (バッファ コールバック スレッドがドレインされていること) を確認してから解放することをお勧めします。

于 2010-09-12T16:47:50.077 に答える
0

私のプロジェクトでも同じ問題がありました。アプリを一時停止する前にボタン クリックから AudioOutputUnitStop() を呼び出し、アプリの再開時に AudioOutputUnitStart() を呼び出しても、問題がないことがわかりました。しかし、viewDidUnload ハンドラから、または UIApplicationWillResignActiveNotification への応答として AudioOutputUnitStop() を自動的に呼び出した場合、上記のフィードバックのような音が途切れ途切れになりました。

また、オーディオ ユニットを手動で停止してアプリを一時停止すると、割り込みリスナーが呼び出されることにも気付きました。しかし、オーディオ ユニットがまだ実行されている間にアプリを中断すると、割り込みリスナーは呼び出されませんでした。割り込みリスナーは、オーディオ ユニットを停止することになっているため、あまり効果がありません。

これを数時間追跡した後、オーディオユニットなしでタスクを完了する方法を見つけ、アプリから削除しました。ですから、完全な答えはありません。しかし、うまくいけば、これらの手がかりが誰かを助けるでしょう. 将来これをやり直す必要があるかもしれないので、ここに戻って、他の誰かがそれを理解しているかどうかを確認します.

于 2011-08-05T01:40:36.657 に答える