注:このプロジェクトのコード ベース全体が非常に大きいため、意味のある量を投稿すると、この質問がローカライズされすぎてしまいます。コードを必要最小限に絞り込もうとしました。誰かが私の問題を直接解決してくれるとは思っていませんが、役立つ、または興味をそそる回答には賛成票を投じます。
このプロジェクトでは、変更されたバージョンの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);
hasBytes
YES
しかし、がCFReadStreamRead
呼び出されて実行が停止すると、アプリケーションはクラッシュせず、エキサイティングに停止するだけです。CFReadStreamRead
呼び出しの下のブレークポイントはヒットせASReadStreamCallBack
ず、再度呼び出されません。
私はこれを引き起こす可能性のあるものに途方に暮れています.私の最善の推測は、スレッドが終了していることですか? しかし、方法と理由が私がSOに尋ねている理由です。
誰もこの動作を見たことがありますか? どうすればそれを追跡できますか、それを解決する方法についてのアイデアは大歓迎です!
コメントを介して要求された追加情報
- これは 100% 再現可能です
CFReadStreamHasBytesAvailable
デバッグのために私が追加しましたが、削除しても効果はありません