3

循環バッファーでオーディオを録音する単純な 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それは驚くほどばかげているでしょうが、私にはもうよくわかりません。

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

4

1 に答える 1

2

のでinPacketDescsあることがわかります。したがって、最初の値のみをコピーすると失敗していました。arrayAudioStreamPackedDescription

解決:

AudioStreamPacketDescription * test = (AudioStreamPacketDescription *)(malloc(inNumberPacketDescriptions * sizeof(AudioStreamPacketDescription)));
    memcpy(test, inPacketDescs, inNumberPacketDescriptions * sizeof(AudioStreamPacketDescription));
于 2012-01-10T10:45:24.393 に答える