1

注:このプロジェクトのコード ベース全体が非常に大きいため、意味のある量を投稿すると、この質問がローカライズされすぎてしまいます。コードを必要最小限に絞り込もうとしました。誰かが私の問題を直接解決してくれるとは思っていませんが、役立つ、または興味をそそる回答には賛成票を投じます。

このプロジェクトでは、変更されたバージョンのAudioStreamerを使用して、デバイス (iPhone) にローカルに保存されているオーディオ ファイルを再生します。

ストリームは、このコードを使用して現在のループで設定およびスケジュールされます (私の知る限り、標準の AudioStreamer プロジェクトから変更されていません)。

CFStreamClientContext context = {0, self, NULL, NULL, NULL};
CFReadStreamSetClient(
                          stream,
                          kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
                          ASReadStreamCallBack,
                          &context);
CFReadStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);

ASReadStreamCallBack呼び出し:

- (void)handleReadFromStream:(CFReadStreamRef)aStream
               eventType:(CFStreamEventType)eventType

AudioStreamer オブジェクトでは、ストリームが次のコードを使用して読み取られるまで、これはすべて正常に機能します。

BOOL hasBytes = NO;  //Added for debugging
hasBytes = CFReadStreamHasBytesAvailable(stream);
        
length = CFReadStreamRead(stream, bytes, kAQDefaultBufSize);

hasBytesYESしかし、がCFReadStreamRead呼び出されて実行が停止すると、アプリケーションはクラッシュせず、エキサイティングに停止するだけです。CFReadStreamRead呼び出しの下のブレークポイントはヒットせASReadStreamCallBackず、再度呼び出されません。

私はこれを引き起こす可能性のあるものに途方に暮れています.私の最善の推測は、スレッドが終了していることですか? しかし、方法と理由が私がSOに尋ねている理由です。

誰もこの動作を見たことがありますか? どうすればそれを追跡できますか、それを解決する方法についてのアイデアは大歓迎です!

コメントを介して要求された追加情報

  1. これは 100% 再現可能です
  2. CFReadStreamHasBytesAvailableデバッグのために私が追加しましたが、削除しても効果はありません
4

2 に答える 2

2

まず、それは?CFReadStreamScheduleWithRunLoop()と同じスレッドで実行されていると思います。CFReadStreamRead()

このスレッドは実行ループを処理していますか?これを怠ったことが私の主な疑いです。CFRunLoopRun()このスレッドのようなまたは同等の呼び出しがありますか?

通常、ストリームを非同期で読み取るために別のスレッドを生成する理由はないため、スレッドの設計について少し混乱しています。ここには本当にバックグラウンドスレッドが含まれていますか?また、通常CFReadStreamRead()はクライアントのコールバックに含まれます(kCFStreamEventHasBytesAvailableイベントを受信したとき(リンクされたコードにあるように見えます)が、ASReadStreamCallBack呼び出されないことを示唆しています。AudioStreamerをどのように変更しましたか?

于 2012-04-16T16:26:18.880 に答える
0

ストリーム ポインタが何らかの理由で破損している可能性があります。バイトが利用可能な場合、CFReadStreamRead は確実にブロックされません (ローカル ファイルの場合、数ミリ秒以上ブロックされることはありません)。ストリームの作成に使用するコードを提供できますか?

または、CFReadStreams はメッセージを非同期に送信しますが、実行ループが処理されていないためにブロックされている可能性があります (可能性は低いです)。

必要に応じて、 https: //code.google.com/p/audjustable/ でホストされている Matt の AudioStreamer に触発された AudioPlayer をアップロードしました。ローカル ファイル (および HTTP) をサポートします。私はそれがあなたが望んでいたことをしていると思います(HTTPだけでなくファイルをストリーミングします)。

于 2012-06-06T15:29:22.867 に答える