I have found CWave class and modified if for own purposes.
CWave class is found on the link
CWave - A Simple C++ Class to Manipulate WAV Files
It seems the formula is
if(local_work_time.GetSeconds()>=1)
Sleep(1);
else
{
HRESULT hr;
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(mt));
hr = local_main_dialog->web_camera_dialog->pAudioGrabber->GetConnectedMediaType(&mt);
if (SUCCEEDED(hr))
{
if(mt.formattype==FORMAT_WaveFormatEx)
{
WAVEFORMATEX *wave_format_ex = (WAVEFORMATEX *)mt.pbFormat;
if(wave_format_ex!=NULL)
{
DWORD chunk_playing_time =
1000 *
wave_format_ex->nAvgBytesPerSec/
wave_format_ex->nSamplesPerSec/
wave_format_ex->nChannels/
(wave_format_ex->wBitsPerSample>>3)/
(wave_format_ex->nBlockAlign>>1)
;
Sleep(chunk_playing_time);
}
}
_FreeMediaType(mt);
}
else
Sleep(1000/CONST_AUDIO_PACKETS_PER_SECOND); }
Here is the playback after getting th stream from the netwotk:
{
CWave local_wave;
local_wave.Load(received_microphone_stream);
ULARGE_INTEGER zero_size = {0,0};
received_microphone_stream->SetSize(zero_size);
{
LARGE_INTEGER liBeggining = { 0 };
received_microphone_stream->Seek(liBeggining, STREAM_SEEK_SET, NULL);
}
local_wave.Play();
{
if(local_wave.IsValid()==TRUE)
{
DWORD chunk_playing_time =
1000 *
local_wave.GetSize()/
local_wave.GetSampleRate()/
local_wave.GetChannels()/
(local_wave.GetBitsPerSample()>>3);
Sleep(chunk_playing_time+100);
}
}
}
Next improvement will be playing and waiting for end of playing in worker thread:
local_wave.Play();
{
if(local_wave.IsValid()==TRUE)
{
DWORD chunk_playing_time =
1000 *
local_wave.GetSize()/
local_wave.GetSampleRate()/
local_wave.GetChannels()/
(local_wave.GetBitsPerSample()>>3);
Sleep(chunk_playing_time+100);
}
}