現在、一連のUDPパケットで受信したオーディオを再生しようとしています。これらは、次のプロパティを持つPCMフレームにデコードされます。
- 2チャンネル
- インターリーブ
- 単一チャネルのサンプルあたり2バイト(つまり、フレームあたり4バイト)
- サンプルレートは48000です。
すべてのUDPパケットには480フレームが含まれているため、バッファのサイズは480 * 2(チャネル)* 2(チャネルあたりのバイト数)です。
これらのパケットを再生するには、AudioUnitをセットアップする必要があります。だから、私の最初の質問は、AudioUnitのAudioStreamBasicDescription構造体をどのように設定する必要があるかということです。ドキュメントを見ると、インターリーブPCMが許容可能な形式であるかどうかさえわかりません。
これは私がこれまでに得たものです:
struct AudioStreamBasicDescription {
Float64 mSampleRate; //48000
UInt32 mFormatID; //?????
UInt32 mFormatFlags; //?????
UInt32 mBytesPerPacket; //Not sure what "packet" means here
UInt32 mFramesPerPacket; //Same as above
UInt32 mBytesPerFrame; //Same
UInt32 mChannelsPerFrame; //2?
UInt32 mBitsPerChannel; //16?
UInt32 mReserved; //???
};
typedef struct AudioStreamBasicDescription AudioStreamBasicDescription;
次に、設定後、UDPコールバックから実際のAudioUnitレンダリング関数にフレームを取得する方法がわかりません。
現在、ソケットリスナーからのコールバック関数があり、再生したいオーディオを含むint16*バッファーを生成します。私が理解しているように、次の形式のオーディオユニットのレンダリングコールバックも実装する必要があります。
OSStatus RenderFrames(
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
//No idea what I should do here.
return noErr;
}
すべてをまとめると、ソケット受信コールバックが行うべきことは、フレームをデコードし、それらをバッファー構造に入れて、RenderFramesコールバックがそのバッファーからフレームをフェッチして再生できるようにすることだと思います。これは正しいです?もしそうなら、RenderFrames関数で次のフレームをフェッチしたら、実際に再生のために「送信」するにはどうすればよいですか?