Многоканальная обработка WAV-файлов с помощью C - PullRequest
0 голосов
/ 13 января 2019

Я хочу создать инструмент, который может воспроизводить файл 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));

Я использую структуру, называемую waveformatex, когда тег форматирования равен 1, и использую структуру воспроизведения, аналогичную приведенному выше коду, и приведенный выше код является кодом для воспроизведения, когда файл является многоканальным WAV-файлом.

Независимо от того, какой метод я использую, я хочу воспроизвести многоканальный WAV-файл. Может кто-нибудь помочь с этой проблемой ..?

Спасибо.

...