Получить образец в треморе

Я должен использовать тремор для декодирования ogg vorbis в моем проекте из-за гораздо более простой интеграции (для использования в ESP-32). Его доки говорит:

Он возвращает до указанного количества байтов декодированного звука в формате end-host, подписанный 16-битный формат PCM. Если звук многоканальный, каналы чередуются в выходном буфере.

...

Подпись: long ov_read (OggVorbis_File * vf, char * buffer, int length, int * bitstream);

Теперь я запутался в том, как читать 16-битные подписанные сэмплы из массива char. Должен ли я следовать некоторым советам отсюда Конвертировать 2 символа в 1 int или сделать что-то другое?

1 ответ

Решение

Итерируйте буфер двумя элементами одновременно. Поскольку данные представлены в формате с прямым порядком байтов (согласно документации), вы можете напрямую представить два символа в виде 16-разрядного целого числа со знаком, в данном случае "short"

long numBytesRead = ov_read(vf, buffer, length, bitstream); //length is typically 4096

if( numBytesRead > 0 )
{
    for(int i=0; (i+1)<numBytesRead; i=i+2)
    {
        unsigned char high = (unsigned char)buffer[i];
        unsigned char low = (unsigned char)buffer[i + 1];

        int16_t var = (int16_t)( (low << 8) | high );
        //here var is signed 16 bit integer.
    }
} 
Другие вопросы по тегам