私は16ビット、24ビットのパック、32ビットなどのPCMデータの配列を持っています。それは32または64ビット浮動小数点である可能性があります。これは、現在、チャンネルによって、次にフレームごとにインデックス付けされた「ボイド**」マトリックスとして格納されています。目標は、指定された構造に合わせてデータを操作することなく、私のライブラリが任意のPCM形式を取り込み、バッファリングできるようにすることです。 A/DコンバータがインターリーブされたPCMの24ビットのパックドアレイを吐き出したら、それを正常に受け入れる必要があります。私はまた、16ビットのインターリーブされていない、上記のフォーマットの任意の順列をサポートする必要があります。float、int32、int16などへのVoid *配列キャスト
私は実行時にビット深度などの情報を知っています。コードを複製しないで効率的にコードを作成しようとしています。私が必要とするのは、マトリックスをキャストし、PCMデータをマトリックスに入れ、それを後で取り出すという効果的な方法です。
32ビットと16ビットの符号付きPCMのそれぞれに対してint32_tまたはint16_tにキャストすることができますが、おそらくは32ビット、8ビットのバイトシステムでもint32_tに24ビットPCMを格納する必要があります。
誰もデータをこの配列に入れて後で引き出すことをお勧めしますか?
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に移植しなければならないと、処理が煩雑になります。
誰でも便利なマクロを共有してもらえますか?
おかげで、
に役立ちます。 「テンプレートなし」のことは、あなたのツールチェーンの制限、プロジェクトに対する他の制限、または個人的な好みですか? –
データはどうしていますか?あなたがしているのは、生のデータをバッファして後で取り除くだけであれば、実際にキャスティングを行う必要があるということは、疑問からは明らかではありません。 – Kylotan
@Anon、OPが条件付きブランチで保護された複製された構文を受け入れないとすれば、私はおそらく実行可能なサイズの問題がテンプレート上で赤いフラグを立てていると推測します。 (テンプレート関数はswitch ... caseよりも大きな実行結果になるので) – YeenFei