Ранее я запутался с этим вопросом. Я сделал это так, как будто я спрашиваю о своей конкретной реализации, но на самом деле мой вопрос касается общей темы. Я вполне уверен, что моя реализация в порядке. Поэтому я переписываю этот вопрос:
WASAPI предоставляет мне информацию об аудиоформате, который звуковой движок принимает в общем режиме. Я знаю ожидаемую разрядность сэмплов, которые я передаю в буфер. Чего я не знаю, так это ожидаемого представления амплитуды сигнала в сэмплах. Например, если звуковой движок ожидает 32-битные сэмплы, означает ли это, что я должен представлять амплитуду синусоидальной волны? так как:
long
в диапазоне[min, max]
unsigned long
в диапазоне[0, max]
float
в диапазоне[min, max]
- или даже что-то вроде
float
в диапазоне[-1, 1]
?
(max = std::numeric_limits<type>::max()
и min = ...::min()
в C++
)
До сих пор я экспериментировал с этим с разными значениями методом проб и ошибок. Кажется, что только когда мои семплы содержат числа max/2
или -min/2
(как long
) чередующиеся (вместе с другими числами), получается звук. Даже числа, близкие к этим (+- несколько целых чисел), дают одинаковые результаты. Когда этих двух чисел (или близких к ним чисел) нет в семплах, то получается тишина, что бы я ни делал.
Это может быть неважно, но я заметил, что битовое представление этих чисел (max/2
и min/2
) (как long
s) идентично IEEE float
битному представлению 2.0
и -2.0
. Мне до сих пор непонятно, почему это так работает.