循環バッファーでオーディオを録音する単純な iOS アプリを作成しています。これは、オーディオを継続的に録音することを意味しますが、メモリには最後の 15 バッファーのみを保持します。
から取得したすべてのデータをコピーすることでこれを行いますAudioInputCallback
。
void AudioInputCallback(
void *inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp *inStartTime,
UInt32 inNumberPacketDescriptions,
const AudioStreamPacketDescription *inPacketDescs)
これはうまく機能AIF
し、記録を停止した後にすべてのバッファをファイルに保存すると、ファイルを正しく記録できます。そのため、他のバッファへのデータのコピーは正しく機能します。
M4A
ただし、可変パケットを使用すると、同じルーチンが機能しないという問題があります。メソッドをコールバックに入れるとAudioFileWritePackets
正しく動作しますが、後で保存されたバッファリングされたデータで使用すると失敗します。
const AudioStreamPacketDescription *inPacketDescs
これは、コールバック関数自体 (そこに記録) でそれを自分のコピーに変更すると、すぐに失敗するというデータが原因であることが判明しました。ただし、データ自体は同一です。
形式は次のとおりです。
struct AudioStreamPacketDescription {
SInt64 mStartOffset;
UInt32 mVariableFramesInPacket;
UInt32 mDataByteSize;
};
typedef struct AudioStreamPacketDescription AudioStreamPacketDescription;
次の方法を使用して、コード内にコピーを作成します。
item.inPacketDescs = (AudioStreamPacketDescription *)(malloc(sizeof(AudioStreamPacketDescription)));
item.inPacketDescs->mDataByteSize = inPacketDescs->mDataByteSize;
item.inPacketDescs->mStartOffset = inPacketDescs->mStartOffset;
item.inPacketDescs->mVariableFramesInPacket = inPacketDescs->mVariableFramesInPacket;
ただし、 のitem.inPacketDescs
代わりにを使用すると、inPacketDescs
すぐに失敗します。そして、これは、これら 3 つのフィールドのデータが同一である間です。(デバッガーで確認しました。)
私は今、選択肢が少しありません。提供された変数は であることがわかりました。これには、同じメモリアドレスである必要がconst
あるなど、意味のある目的があるのではないかと心配しています。AudioFileWritePackets
それは驚くほどばかげているでしょうが、私にはもうよくわかりません。
これを引き起こしている原因についてのアイデアはありますか? 循環バッファに別の方法で保存する方法についてのアイデアはありますか?