私は循環バッファーでオーディオを記録する簡単なiOSアプリケーションを作成しています。つまり、オーディオは連続的に記録されますが、メモリ内の最後の15個のバッファのみが保持されます。Audio Queue Servicesコールバック:AudioStreamPacketDescriptionをコピーできません。
私はAudioInputCallback
から取得するすべてのデータをコピーすることによって、次の操作を行います。
void AudioInputCallback(
void *inUserData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp *inStartTime,
UInt32 inNumberPacketDescriptions,
const AudioStreamPacketDescription *inPacketDescs)
これは素晴らしい作品と私は録画を停止した後、私は、ファイルにすべての私のバッファを保存するとき、私は正しくAIF
ファイルを記録することができます。したがって、他のバッファへのデータのコピーが正しく機能します。
しかし、可変パケットを使用するM4A
を使用すると、同じルーチンが動作しないという問題があります。私はAudioFileWritePackets
メソッドをコールバックに入れても正しく動作しますが、後でそれを使用してバッファリングされたデータを保存すると失敗します。
これはデータconst AudioStreamPacketDescription *inPacketDescs
によって発生していることが判明しました。コールバック関数自体(記録中)のコピーを自分のコピーに変更すると、すぐに失敗します。しかし、データそのものは同じです。それはすぐに失敗しますinPacketDescs
するのではなく、ときにitem.inPacketDescs
を使用して、しかし
item.inPacketDescs = (AudioStreamPacketDescription *)(malloc(sizeof(AudioStreamPacketDescription)));
item.inPacketDescs->mDataByteSize = inPacketDescs->mDataByteSize;
item.inPacketDescs->mStartOffset = inPacketDescs->mStartOffset;
item.inPacketDescs->mVariableFramesInPacket = inPacketDescs->mVariableFramesInPacket;
:
struct AudioStreamPacketDescription {
SInt64 mStartOffset;
UInt32 mVariableFramesInPacket;
UInt32 mDataByteSize;
};
typedef struct AudioStreamPacketDescription AudioStreamPacketDescription;
は、私は次のメソッドを使用して私のコードでコピーを作成します。
この
は形式です。そして、これらの3つのフィールドのデータは同じですが。 (私はデバッガを使ってチェックした)。今は少し外れています。私は、提供された変数がconst
であることを知っているので、これはいくつか意味のある目的があることを恐れています。つまり、AudioFileWritePackets
には同じメモリアドレスが必要ですか?それは驚くほど愚かなことですが、私はもう本当に知りません。
これを引き起こしていることに関するアイデアはありますか?循環バッファに別々に保存する方法のアイデア?
これはあなたのために働いたのかは、あなたはまだテストだけを更新する[0]値ここ –
そうでもありませんか?私は 'AudioStreamPacketDescription'サイズの' inNumberPacketDescriptions'の量をコピーします。そのサイズは1つ以上です – Peterdk