PCM データの配列があります。16 ビット、24 ビット パック、32 ビットなどです。符号付きまたは符号なし、32 ビットまたは 64 ビット浮動小数点のいずれかです。現在、void**
マトリックスとして格納されており、最初にチャネルごと、次にフレームごとにインデックスが付けられています。目標は、指定された構造に合わせてデータを操作する必要なく、ライブラリが任意の PCM 形式を取り込んでバッファリングできるようにすることです。A/D コンバーターがインターリーブされた PCM の 24 ビットにパックされた配列を出力した場合、それを適切に受け入れる必要があります。また、16 ビットの非インターリーブ、および上記の形式の順列もサポートする必要があります。
実行時のビット深度やその他の情報を把握しており、コードを複製せずに効率的にコーディングしようとしています。私が必要としているのは、行列をキャストし、PCM データを行列に入れ、後でそれを引き出す効果的な方法です。
行列をint32_t
、またはint16_t
32 ビットと 16 ビットの符号付き PCM にそれぞれキャストできます。おそらく、24 ビットの PCMint32_t
を 32 ビット、8 ビットのバイト システムにも格納する必要があります。
データをこの配列に入れ、後で引き出す良い方法を誰かが推奨できますか? 次のような大きなコード セクションは避けたいと思います。
switch (mFormat) {
case 1: // unsigned 8 bit
for (int i = 0; i < mChannels; i++)
framesArray = (uint8_t*)pcm[i];
break;
case 2: // signed 8 bit
for (int i = 0; i < mChannels; i++)
framesArray = (int8_t*)pcm[i];
break;
case 3: // unsigned 16 bit
...
制限: 私は C/C++ で作業しており、テンプレートも RTTI も STL もありません。埋め込まれていると考えてください。これを 16 ビット バイトの DSP に移植しなければならない場合、事態はさらに複雑になります。
誰かが喜んで共有できる便利なマクロを持っていますか?