Hi.
I've noticed the winealsa does not handle alsa XRUNs. In the case of XRUN application hangs.
That's happened because return value of snd_pcm_avail_update() is not checked.
For example: wavein.c 175 DWORD bytes; 180 /* read all the fragments accumulated so far */ 181 frames = snd_pcm_avail_update(wwi->pcm); 182 bytes = snd_pcm_frames_to_bytes(wwi->pcm, frames);
waveout.c 476 DWORD availInQ; 479 availInQ = snd_pcm_avail_update(wwo->pcm); 482 if (availInQ > 0) {
The snd_pcm_avail_update() returns a _signed_ type and it really does return negative number -EPIPE in the case of XRUN.
More over, any return value of less than period_size may indicate XRUN state too. The snd_pcm_state() may help then.
Th dsoutput.c and dscapture.c do exactly the same wrong thigs.
BTW, using DWORD type causes problems. Following fragment is from wavein.c too:
177 DWORD read; 181 frames = snd_pcm_avail_update(wwi->pcm); 182 bytes = snd_pcm_frames_to_bytes(wwi->pcm, frames); 193 read = wwi->read(wwi->pcm, lpWaveHdr->lpData + 194 bytesRead = snd_pcm_frames_to_bytes(wwi->pcm, 197 if (bytesRead != (DWORD) -1)
This is obviously will not work as expected.
I hope someone will fix these issues :)
Regards, Tim.