#include #include"waveOutSetPosition.h" void SetPositionUnprepareHeader(HWAVEOUT hwo); static WAVEHDR g_whdr; int waveOutSetPosition(HWAVEOUT hwo,LPWAVEHDR pwh,LPMMTIME pmmt,WOSP *wosp) { DWORD cb; switch(pmmt->wType){ case TIME_BYTES: cb=pmmt->u.cb; break; case TIME_SAMPLES: cb=pmmt->u.sample * wosp->nBlockAlign; break; case TIME_MS: cb=pmmt->u.ms * wosp->nAvgBytesPerSec / 1000; break; default: return -1; } if(cb % wosp->nBlockAlign){ if((cb % wosp->nBlockAlign) <= (wosp->nBlockAlign / 2)){ cb-=(cb % wosp->nBlockAlign); }else{ cb+=(wosp->nBlockAlign - (cb % wosp->nBlockAlign)); } } if(cb<0 || cb >= pwh->dwBufferLength) return -2; waveOutReset(hwo); SetPositionUnprepareHeader(hwo); ZeroMemory(&g_whdr,sizeof(WAVEHDR)); g_whdr.lpData=pwh->lpData + cb; g_whdr.dwBufferLength=pwh->dwBufferLength - cb; g_whdr.dwFlags=WHDR_BEGINLOOP | WHDR_ENDLOOP; g_whdr.dwLoops=1; waveOutPrepareHeader(hwo,&g_whdr,sizeof(WAVEHDR)); waveOutWrite(hwo,&g_whdr,sizeof(WAVEHDR)); return 0; } void SetPositionUnprepareHeader(HWAVEOUT hwo) { if(g_whdr.dwFlags & WHDR_PREPARED){ waveOutUnprepareHeader(hwo,&g_whdr,sizeof(WAVEHDR)); } }