我想制作一个可以播放wav
文件的工具。
幸运的是,我找到了一个很好的例子,可以很好地播放单声道或立体声wav文件。
但是我真正需要的是一个可以播放多通道wav文件的工具。
我发现多通道wav文件的格式标签为65534(表示可扩展波形格式),并且该格式具有更多的标头信息,因此我只是在我的代码中添加了waveformatexx:
waveFormatExt.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
waveFormatExt.Format.nAvgBytesPerSec = riffFormat.nAvgBytesPerSec;
waveFormatExt.Format.nBlockAlign = riffFormat.nBlockAlign;
waveFormatExt.Format.nChannels = riffFormat.nChannels;
waveFormatExt.Format.nSamplesPerSec = riffFormat.nSamplesPerSec;
waveFormatExt.Format.wFormatTag = riffFormat.wFormatTag;
waveFormatExt.Format.wBitsPerSample = riffFormat.wBitsPerSample;
waveFormatExt.dwChannelMask = extFormat.dwChannelMask;
waveFormatExt.SubFormat = extFormat.SubFormat;
waveFormatExt.Samples.wSamplesPerBlock = extFormat.wSamplesPerBlock;
waveFormatExt.Samples.wValidBitsPerSample = extFormat.wValidBitsPerSample;
waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveFormatExt, (DWORD)WaveOutProc, (DWORD)lpWaveData, CALLBACK_FUNCTION);
{
dwDelay = (riffFormat.wBitsPerSample / 8) * riffFormat.nSamplesPerSec * riffFormat.nChannels;
_tprintf(TEXT("bytesPerSec = %d\n"), dwDelay);
dwDelay = riffData.dwChunkSize / dwDelay;
_tprintf(TEXT("TotalSec = %d (%02d:%02d)\n"), dwDelay, (dwDelay / 60), (dwDelay % 60));
waveHeader.lpData = (LPVOID)lpWaveData;
waveHeader.dwBufferLength = riffData.dwChunkSize;
waveHeader.dwBytesRecorded = 0;
waveHeader.dwFlags = 0L;
waveHeader.dwLoops = 0L;
waveHeader.dwUser = 0;
waveHeader.lpNext = NULL;
waveHeader.reserved = 0L;
waveOutPrepareHeader(hWaveOut, &waveHeader, sizeof(WAVEHDR));
{
waveOutWrite(hWaveOut, &waveHeader, sizeof(WAVEHDR));
Sleep(dwDelay * 1000 + 1000);
}
waveOutUnprepareHeader(hWaveOut, &waveHeader, sizeof(WAVEHDR));
当formattag为1时,我使用称为Waveformatex的结构,并使用类似于上述代码的播放结构,并且上面的代码是当文件是多通道wav文件时用于播放的代码。
无论使用哪种方法,我都想播放一个多通道的wav文件。 任何人都可以帮助解决这个问题。
谢谢。