stream time is faster than right time when use RtAudio::Api::WINDOWS_WASAPI, but use RtAudio::Api::WINDOWS:DS is right, HERE IS MY CODE:
ret = ReadFile(playback->handle, outputBuffer, nBufferFrames * playback->pWfx->nBlockAlign, &dwReadBytes, NULL);
if (ret == FALSE || dwReadBytes == 0)
return 1;
return 0;
TCHAR* pszFile = _T("D:\\Music\\Love Story.wav");
if ((hFile = CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
{
_tprintf(_T("%s: unable to open file '%s'\n"), argv[0], pszFile);
ExitProcess(1);
}
//check file is a wav file
readChunk(hFile, (void*)riff, 4);
riff[4] = '\0';
if (strncmp(riff, "RIFF", 4) == 0)
{
_tprintf(_T("file '%s' is a wave file.\r\n"), pszFile);
readChunk(hFile, (void*)&len, 4);
readChunk(hFile, (void*)wave, 4);
readChunk(hFile, (void*)fmt, 4);
readChunk(hFile, (void*)&struct_len, 4);
readChunk(hFile, (void*)&wfx, struct_len);
readChunk(hFile, (void*)data, 4);
readChunk(hFile, (void*)&data_len, 4);
}
else
{
_tprintf(_T("file '%s' is a raw file.\r\n"), pszFile);
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
wfx.nSamplesPerSec = 44100;
wfx.wBitsPerSample = 16;
wfx.nChannels = 2;
wfx.cbSize = 0;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nBlockAlign = (wfx.wBitsPerSample * wfx.nChannels) >> 3;
wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;
}
printf("WAVEFORMATEX.wFormatTag=%d\r\n", wfx.wFormatTag);
printf("WAVEFORMATEX.nChannels=%d\r\n", wfx.nChannels);
printf("WAVEFORMATEX.nSamplesPerSec=%d\r\n", wfx.nSamplesPerSec);
printf("WAVEFORMATEX.nAvgBytesPerSec=%d\r\n", wfx.nAvgBytesPerSec);
printf("WAVEFORMATEX.nBlockAlign=%d\r\n", wfx.nBlockAlign);
printf("WAVEFORMATEX.wBitsPerSample=%d\r\n", wfx.wBitsPerSample);
RtAudio audio(RtAudio::Api::WINDOWS_WASAPI);
try
{
RtAudio::StreamParameters param;
param.deviceId = audio.getDefaultOutputDevice();
param.nChannels = wfx.nChannels;
param.firstChannel = 0;
unsigned int bufferSize = 1024;
RtAudioFormat format = 0;
switch (wfx.wBitsPerSample)
{
case 8:
format = RTAUDIO_SINT8;
break;
case 16:
format = RTAUDIO_SINT16;
break;
case 24:
format = RTAUDIO_SINT24;
break;
case 32:
format = RTAUDIO_SINT32;
break;
}
playback_t playback;
playback.handle = hFile;
playback.pWfx = &wfx;
playback.pAudio = &audio;
RtAudio::StreamOptions options;
options.flags = RTAUDIO_HOG_DEVICE | RTAUDIO_SCHEDULE_REALTIME | RTAUDIO_MINIMIZE_LATENCY;
audio.openStream(¶m, NULL, format, wfx.nSamplesPerSec, &bufferSize, (RtAudioCallback)saw,
(void*)&playback, &options, NULL);
printf("bufferSize=%d\n", bufferSize);
audio.startStream();
}
catch (RtAudioError& e)
{
e.printMessage();
goto exit;
}
while (audio.isStreamRunning())
{
printf("latency=%ld, time=%3.2f\n", audio.getStreamLatency(), audio.getStreamTime());
Sleep(50);
}
try
{
if (audio.isStreamOpen())
audio.stopStream();
}
catch (RtAudioError& e)
{
e.printMessage();
}
CloseHandle(hFile);
return 0;