У меня проблема при попытке добиться плавного воспроизведения звука с помощью waveOutWrite (). Мои данные включают в себя множество блоков adpcmdata, которые были получены с камеры, после декодирования каждого блока adpcm я воспроизводил его с помощью waveOutWrite (). Первый блок воспроизводится успешно (по крайней мере, я слышал), но у меня есть проблема, когда я играю за следующий блок, в котором существует разрыв между этими блоками. Я пытался вызвать sleep () после использования waveOutWrite (), но это не нормально. Кто-нибудь может сказать мне, как я получаю гладко в этом случае? Есть проблема с воспроизведением звука?
for (i = 0, i < MaxBlockData, i++)
BYTE * pcmBuff = new BYTE[length*8];
memset(pcmBuff, 0, length*8);
G726 g726;
int pcmDataSize = 0;
g726.SetRate(g726.Rate32kBits);
g726.SetLaw(g726.PCM16);
pcmDataSize = g726.Decode(pcmBuff, adpcmData[i], 0, length*8); /decode adcmData PCM 16
if(pcmDataSize > 0)
{
int sampleRate = 8000;
CHAR* waveIn = new CHAR[pcmDataSize];
HWAVEIN hWaveIn;
WAVEHDR WaveInHdr;
MMRESULT result;
HWAVEOUT hWaveOut;
WAVEFORMATEX pFormat;
pFormat.wFormatTag = WAVE_FORMAT_PCM;
pFormat.nChannels = 1;
pFormat.nSamplesPerSec = sampleRate;
pFormat.nAvgBytesPerSec = 2 * sampleRate;
pFormat.nBlockAlign = 2;
pFormat.wBitsPerSample = 16;
pFormat.cbSize = 0;
result = waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat, 0, 0, WAVE_FORMAT_DIRECT);
if(result != MMSYSERR_NOERROR)
{
char fault[256];
waveInGetErrorTextA(result, fault, 256);
MessageBoxA(NULL, fault, "Failed to open waveform input device.", MB_OK | MB_ICONEXCLAMATION);
return;
}
WaveInHdr.lpData = (LPSTR)waveIn;
WaveInHdr.dwBufferLength = pcmDataSize;
WaveInHdr.dwBytesRecorded = 0;
WaveInHdr.dwUser = 0;
WaveInHdr.dwFlags = 0;
WaveInHdr.dwLoops = 0;
waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
memcpy(WaveInHdr.lpData, pcmBuff, pcmDataSize);
if(waveOutOpen(&hWaveOut, WAVE_MAPPER, &pFormat, 0, 0, WAVE_FORMAT_DIRECT))
{
MessageBoxA(NULL, "Failed to replay", NULL, MB_OK | MB_ICONEXCLAMATION );
}
waveOutWrite(hWaveOut, &WaveInHdr, sizeof(WaveInHdr));
Sleep((pcmDataSize/sampleRate ) * 1000); //Sleep for as long as there was recorded
waveOutUnprepareHeader(hWaveOut, &WaveInHdr, sizeof(WAVEHDR));
waveInUnprepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
waveInClose(hWaveIn);
waveOutClose(hWaveOut);
WaveInHdr.lpData = NULL;
delete []waveIn;
}
}
Спасибо, что прочитали мой вопрос.