Я работаю над тем, чтобы пытаться читать необработанные данные .wav и выводить их на динамики, в основном для самостоятельных экспериментов и обучения. Вторая причина, по которой я хочу получить данные самостоятельно, заключается в том, что я могу проанализировать их, чтобы попытаться разделить высоту тона, возможно, создать эквалайзер или визуализацию какого-либо рода. Пока у меня есть чтение данных из файла, работающего, проверка заголовка и еще много чего, но затем я перехожу к WaveOut, и он начинает портиться. Конечно, мой код в настоящее время является скорее спагетти-кодом, но это скорее начальный тест, чтобы увидеть, могу ли я это сделать или нет. Насколько я могу сказать прямо сейчас, моя программа аварийно завершает работу в waveOutWrite (), и я, честно говоря, понятия не имею, почему, и я не могу найти хороших примеров того, как заставить WaveOut работать. Вот соответствующий бит:
BYTE *sound=(BYTE*)malloc(sizeof(BYTE)*data_size);
readByte(&in,data_size,sound);
cout<<"Loaded. Now playing...\n";
HWAVEOUT waveOut;
WAVEFORMATEX wF={format_tag,channels,sample_rate,byteRate,block_align,bits_per_sample,0};
MMRESULT result;
waveOutOpen(&waveOut,WAVE_MAPPER,&wF,0,0,CALLBACK_NULL);
WAVEHDR hdr;
ZeroMemory(&hdr,sizeof(WAVEHDR));
hdr.dwBufferLength=data_size;
hdr.lpData=(LPSTR)&sound;
waveOutPrepareHeader(waveOut,&hdr,sizeof(WAVEHDR));
waveOutWrite(waveOut,&hdr,sizeof(WAVEHDR));//Crashes here, no crash if commented out. No sound either way.
Sleep(500);
while(waveOutUnprepareHeader(waveOut,&hdr,sizeof(WAVEHDR))==WAVERR_STILLPLAYING)
Sleep(100);
waveOutClose(waveOut);
Мне удалось найти то, что было не так, для всех, кто проходит через это. Данные, которые я извлекал, были просто звуковыми данными, за исключением заголовка. Моя проблема в том, что для этого требуется заголовок поверх звуковых данных, который составляет еще 44 байта. То, что я должен был сделать, это увеличить размер массива этими 44 байтами, вернуть заголовок обратно в начало и изменить эту строку:
hdr.lpData=(LPSTR)&sound;
к этому:
hdr.lpData=(LPSTR)sound;
Теперь, благодаря моему разбору заголовка, я также могу правильно выбрать битрейт на лету, рассчитать длину песни и делать с ней разные вещи.