Mam szereg danych PCM, może to być 16-bitowy, 24-bitowy, 32-bitowy itp. Może on być podpisany lub unsigned, i może to być 32- lub 64-bitowy zmiennoprzecinkowy. Obecnie jest przechowywany jako macierz "void **", indeksowana według kanału, a następnie według ramki. Celem jest umożliwienie mojej bibliotece przyjęcia dowolnego formatu PCM i buforowanie go, bez konieczności manipulowania danymi w celu dopasowania do wyznaczonej struktury. Jeśli konwerter A/D wypuści 24-bitowe tablice przeplatanych PCM, muszę je przyjąć z wdziękiem. Muszę również obsługiwać 16-bitowe, niezawleczone, jak również dowolną permutację powyższych formatów.Void * array casting to float, int32, int16, itp.
Znam głębokość bitową i inne informacje w czasie wykonywania, a próbuję wydajnie kodować, a nie powielać kodu. Potrzebuję skutecznego sposobu rzucania matrycą, umieszczania danych PCM w macierzy, a następnie wyciągania jej później.
Mogę rzucić matrycę na int32_t, lub int16_t dla odpowiednio 32 i 16 bitowego sygnowanego PCM, prawdopodobnie będę musiał przechowywać 24-bitowe PCM w int32_t również dla 32-bitowych, 8-bitowych systemów.
Czy ktoś może polecić dobry sposób na umieszczenie danych w tej macierzy i wyciągnięcie go później? Chciałbym uniknąć dużych fragmentów kodu, który wygląda tak:
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
...
ograniczeń: Pracuję w języku C/C++, bez szablonów, bez RTTI, bez STL. Myśl osadzony. Sprawy stają się trudniejsze, gdy muszę przenieść to do DSP z 16-bitowymi bajtami.
Czy ktoś ma przydatne makra, które mogą być udostępniane?
Dzięki,
-Griff
myślałem, że to jest dokładnie to, szablony miały problemów do rozwiązania. Czy "brak szablonów" jest ograniczeniem twojego toolchainu, innym ograniczeniem projektu, czy tylko osobistymi preferencjami? –
Co robisz z danymi? Z tego pytania nie wynika wcale, że faktycznie musisz wykonać casting, jeśli wszystko, co robisz, to buforowanie surowych danych i późniejsze przekazanie. – Kylotan
@Anon, biorąc pod uwagę, że OP nie akceptuje zreplikowanej składni chronionej przez gałąź warunkową, prawdopodobnie zgadłbym, że kwestia rozmiaru wykonywalnego podnosi czerwoną flagę na szablonach. (ponieważ funkcja templates powoduje większe pliki wykonywalne niż przełącznik ... case) – YeenFei