40 static void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, |
40 static void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, |
41 DWORD dwParam1, DWORD dwParam2) |
41 DWORD dwParam1, DWORD dwParam2) |
42 { |
42 { |
43 switch (uMsg) { |
43 switch (uMsg) { |
44 case WOM_DONE: |
44 case WOM_DONE: |
45 if (_waveout) FillHeaders(); |
45 if (_waveout != NULL) FillHeaders(); |
46 break; |
46 break; |
47 |
47 default: break; |
48 default: |
|
49 break; |
|
50 } |
48 } |
51 } |
49 } |
52 |
50 |
53 static const char *Win32SoundStart(const char* const* parm) |
51 static const char *Win32SoundStart(const char* const* parm) |
54 { |
52 { |
55 WAVEFORMATEX wfex; |
53 WAVEFORMATEX wfex; |
56 int hz; |
54 wfex.wFormatTag = WAVE_FORMAT_PCM; |
|
55 wfex.nChannels = 2; |
|
56 wfex.wBitsPerSample = 16; |
|
57 wfex.nSamplesPerSec = GetDriverParamInt(parm, "hz", 11025); |
|
58 wfex.nBlockAlign = (wfex.nChannels * wfex.wBitsPerSample) / 8; |
|
59 wfex.nAvgBytesPerSec = wfex.nSamplesPerSec * wfex.nBlockAlign; |
57 |
60 |
58 _bufsize = GetDriverParamInt(parm, "bufsize", 1024); |
61 _bufsize = GetDriverParamInt(parm, "bufsize", 1024); |
59 hz = GetDriverParamInt(parm, "hz", 11025); |
62 |
60 wfex.wFormatTag = WAVE_FORMAT_PCM; |
|
61 wfex.nChannels = 2; |
|
62 wfex.nSamplesPerSec = hz; |
|
63 wfex.nAvgBytesPerSec = hz * 2 * 2; |
|
64 wfex.nBlockAlign = 4; |
|
65 wfex.wBitsPerSample = 16; |
|
66 if (waveOutOpen(&_waveout, WAVE_MAPPER, &wfex, (DWORD_PTR)&waveOutProc, 0, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) |
63 if (waveOutOpen(&_waveout, WAVE_MAPPER, &wfex, (DWORD_PTR)&waveOutProc, 0, CALLBACK_FUNCTION) != MMSYSERR_NOERROR) |
67 return "waveOutOpen failed"; |
64 return "waveOutOpen failed"; |
|
65 |
68 PrepareHeader(&_wave_hdr[0]); |
66 PrepareHeader(&_wave_hdr[0]); |
69 PrepareHeader(&_wave_hdr[1]); |
67 PrepareHeader(&_wave_hdr[1]); |
70 FillHeaders(); |
68 FillHeaders(); |
71 return NULL; |
69 return NULL; |
72 } |
70 } |