2012-01-08 8 views
3

私は循環バッファーでオーディオを記録する簡単な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には同じメモリアドレスが必要ですか?それは驚くほど愚かなことですが、私はもう本当に知りません。

これを引き起こしていることに関するアイデアはありますか?循環バッファに別々に保存する方法のアイデア?

答えて

2

inPacketDescsは、arrayAudioStreamPackedDescriptionであることがわかります。 したがって、最初の値だけをコピーできませんでした。

ソリューション:

AudioStreamPacketDescription * test = (AudioStreamPacketDescription *)(malloc(inNumberPacketDescriptions * sizeof(AudioStreamPacketDescription))); 
    memcpy(test, inPacketDescs, inNumberPacketDescriptions * sizeof(AudioStreamPacketDescription)); 
+0

これはあなたのために働いたのかは、あなたはまだテストだけを更新する[0]値ここ –

+0

そうでもありませんか?私は 'AudioStreamPacketDescription'サイズの' inNumberPacketDescriptions'の量をコピーします。そのサイズは1つ以上です – Peterdk

関連する問題