Звуковой обратный вызов SDL2 ограничен 8 битами?

Прочитав документацию по аудио SDL2 (что довольно прискорбно), я вижу, что доступны различные аудиоформаты, включая беззнаковые и подписанные 8-битные, 16-битные, 32-битные с плавающей запятой. Все идет нормально. Я застрял с использованием SDL для этого проекта, и я хотел бы сделать простой синтез звука в 16 бит. Поэтому я установил формат в своей структуре SDL_AudioSpec на AUDIO_U16SYS, как на этой странице https://wiki.libsdl.org/SDL_AudioSpec

Однако, когда я просматриваю документацию обратного вызова на той же странице (и фактически везде, где я просматривал в Интернете), звуковой буфер в обратном вызове *Uint8:

void SDL_AudioCallback(void*  userdata,
                       Uint8* stream,
                       int    len)

В таком случае я не понимаю, как передать 16-битный звук в SDL. Похоже, что он всегда будет получать аудио как 8-битное, а библиотека просто повышает частоту дискретизации до желаемого битрейта. Но это звучит безумно. Так ли это, или я что-то упускаю. Например, существует ли (каким-то образом) альтернативный прототип обратного вызова, соответствующий, например. AUDIO_U16SYS, или мне нужно использовать другие методы для более высоких битрейтов?


person DanBennett    schedule 20.01.2016    source источник


Ответы (1)


Хотя stream действительно является указателем на 8-битное целое число, вы можете привести его к правильному типу. Это просто общий указатель на поток байтов, как эти байты следует интерпретировать (например, объединение каждых двух байтов в 16-битное слово) зависит от вас.

Итак, в функции обратного вызова просто выполните, например.

Uint16 *stream16 = (Uint16 *) stream;
person Some programmer dude    schedule 20.01.2016
comment
А, отлично. Спасибо за быстрый ответ. Довольно очевидно, когда вы указываете на это, но мой мозг работал медленно. - person DanBennett; 20.01.2016
comment
На самом деле это не вся история - и опять же, ничего в документах, которые я могу найти, не освещает это. Если я переключусь на AUDIO_U16SYS, изменю свои звуковые диапазоны с (0-255) на (0-65535) и использую указанный выше метод указателя приведения, я получу искаженный звук. Вероятно, мне нужно опубликовать больше кода, и, возможно, лучше всего начать новый вопрос на этом этапе. В любом случае спасибо за вашу помощь - это ответ на мой первоначальный вопрос. Я просто еще больше запутался, чем думал :) - person DanBennett; 21.01.2016
comment
Ах! Итак, я пропустил, что параметр len — это длина в байтах буфера. Таким образом, помимо изменения формата, изменения звукового диапазона и приведения потока к 16-битным целым числам, мне также нужно разделить длину буфера на sizeof(Uint16)/sizeof(Uint8). (а то, что len измеряется в байтах, было освещено в документах - я просто пропустил) - person DanBennett; 21.01.2016