Здравствуйте. Написал небольшую программку записывающую звук с микрофона и проигрывающую его. Проблема в том, что воспроизводится только левый канал.
Переделывал для проигрывания готового wav файла(стерео), всё равно воспроизводит только левый канал.
В чём может быть ошибка? (Пишу в Visual Studio под Windows)
Код | #include "stdafx.h"
#include <iostream> #include <windows.h> #include <mmsystem.h> #include <fstream>
#pragma comment(lib,"winmm.lib")
using namespace std;
int sampleRate = 44100;
short int *waveIn;
void main() { //Формат данных WAVEFORMATEX pFormat; pFormat.wFormatTag = WAVE_FORMAT_PCM; pFormat.nChannels = 2; //Стерео - 2 канала pFormat.wBitsPerSample = 16; pFormat.nSamplesPerSec = sampleRate; pFormat.nAvgBytesPerSec = sampleRate * pFormat.nChannels * pFormat.wBitsPerSample / 8; pFormat.nBlockAlign = pFormat.nChannels * pFormat.wBitsPerSample / 8; pFormat.cbSize = 0;
waveIn = new short int[pFormat.nAvgBytesPerSec * 2];
memset(waveIn,0,pFormat.nAvgBytesPerSec * 2); //Запись звука в буфер waveIn HWAVEIN hWaveIn; WAVEHDR waveInHdr;
waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat, NULL, NULL, WAVE_FORMAT_DIRECT);
waveInHdr.lpData = (LPSTR)waveIn; waveInHdr.dwBufferLength = pFormat.nAvgBytesPerSec * 2; waveInHdr.dwBytesRecorded = 0; waveInHdr.dwUser = 0L; waveInHdr.dwFlags = 0L; waveInHdr.dwLoops = 0L;
waveInPrepareHeader(hWaveIn, &waveInHdr, sizeof(WAVEHDR));
waveInAddBuffer(hWaveIn, &waveInHdr, sizeof(WAVEHDR));
waveInStart(hWaveIn);
do{} while(waveInUnprepareHeader(hWaveIn, &waveInHdr, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING);
waveInClose(hWaveIn); //Воспроизведение из буфера waveIn HWAVEOUT hWaveOut; WAVEHDR WaveOutHdr;
waveOutOpen(&hWaveOut, WAVE_MAPPER, &pFormat, NULL, NULL, WAVE_FORMAT_DIRECT);
WaveOutHdr.lpData = (LPSTR)waveIn; WaveOutHdr.dwBufferLength = pFormat.nAvgBytesPerSec * 2; WaveOutHdr.dwBytesRecorded = 0; WaveOutHdr.dwUser = 0L; WaveOutHdr.dwFlags = 0L; WaveOutHdr.dwLoops = 1L;
waveOutPrepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR));
waveOutSetVolume(hWaveOut, 0xFFFF);
waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR));
do{} while(waveOutUnprepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING); waveOutClose(hWaveOut);
delete[] waveIn;
system("pause"); }
|
|