Я изо всех сил пытался правильно записать данные из аудио буфера в файл волны … Я проверил генерацию синусоидальной волны в файл WAV, и она работает нормально. Однако запись данных аудиобуфера как Int16 в файл wav приводит к постоянному высокому белому шуму. то есть я едва слышу то, что я играл на инструменте (сильно искажено). Аудио буферы берутся из входного буфера ASIO, используя ASIO SDK от Steinberg.
Эта функция вызывается при заполнении каждого входного буфера. Размер буфера составляет 176 сэмплов. Я копирую значение буфера с адреса, возвращенного с него, в указатель, называемый звуком. (Это работает без шума, если я вставлю синусоидальную волну здесь без буферов)
void bufferSwitch(long index, ASIOBool processNow) {for(int i=0; i<176; i++) {
memcpy(sound+soundcount,(Int16 *)bi.buffers[index]+i,2);
soundcount++;
}
}
Заголовок волны выглядит следующим образом. Заголовок работает и хорошо играет с синусоидой.
strcpy(WAV->ChunkID, "RIFF");
WAV->ChunkSize = (uint32_t)size - 8;
strcpy(WAV->RIFFType, "WAVE");
strcpy(Format->ChunkID, "fmt ");
Format->ChunkSize = 16;
Format->CompressionCode = 1;
Format->Channels = 1;
Format->SampleRate = (uint32_t)44100;
Format->SigBitsPerSamp = 16;
Format->BlockAlign = 2;
Format->AvgBytesPerSec = Format->BlockAlign * 44100;
strcpy(Datal->ChunkID, "data");
Datal->ChunkSize = 3 * 44100 *2;
sound = (Int16 *)(Datal + 1);
Тип образца, как указано в GetSampleType () из ASIO SDK, равен 16, то есть Int 16 LSB. Поэтому я использовал Int16 в качестве типа данных для образцов. Когда образцы печатаются с использованием printf, это дает низкие значения между +25 и -25 в каждом образце (это низкие значения, так как значения лежат между +32767 и -32767 в 16-битном pcm wav). Я не понимаю, как генерируется высокий шум. Однако при анализе через Audacity файл имеет много пиков, как и ожидалось из-за шума. Куда я иду не так, и проблема с порядком байтов в этом?
РЕДАКТИРОВАТЬ (решено):
Хорошо, я нашел ошибку. Как я уже говорил, вход и буферы были безупречны. Это была ошибка при записи данных. Ранее я использовал fwrite для записи буферов, которые привели к добавлению байтов мусора в файл. Теперь я использовал ofstream для записи данных, и это работает как по волшебству. Я думаю, что что-то не так с методом fwrite.
Я проверил wav-файл из шестнадцатеричного редактора и обнаружил некоторые интересные события. Данные безупречно записаны до 380 байтов. Затем большие целые числа мусора записываются примерно для 400 байтов. Однако, когда я печатаю значения из указателя, зацикливая его, значения точны.
Решением было использование ofstream для записи в файл вместо использования fwrite.
Других решений пока нет …