[WINEALSA] fix SB16 PCI crash

Robert Reif reif at earthlink.net
Sun Jun 5 09:22:00 CDT 2005


Fix a problem where actual sample rate doesn't exactly match requested.
-------------- next part --------------
Index: dlls/winmm/winealsa/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winealsa/audio.c,v
retrieving revision 1.80
diff -p -u -r1.80 audio.c
--- dlls/winmm/winealsa/audio.c	29 May 2005 20:02:05 -0000	1.80
+++ dlls/winmm/winealsa/audio.c	5 Jun 2005 14:18:39 -0000
@@ -324,6 +324,12 @@ static const char * getFormat(WORD wForm
     return unknown;
 }
 
+/* Allow 1% deviation for sample rates (some ES137x cards) */
+static BOOL NearMatch(int rate1, int rate2)
+{
+    return (((100 * (rate1 - rate2)) / rate1) == 0);
+}
+
 static DWORD bytes_to_mmtime(LPMMTIME lpTime, DWORD position,
                              WAVEFORMATPCMEX* format)
 {
@@ -1928,7 +1934,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVE
 	snd_pcm_close(pcm);
         return WAVERR_BADFORMAT;
     }
-    if (rate != wwo->format.Format.nSamplesPerSec) {
+    if (!NearMatch(rate, wwo->format.Format.nSamplesPerSec)) {
         if (dwFlags & WAVE_DIRECTSOUND) {
             WARN("changed sample rate from %ld Hz to %d Hz\n", wwo->format.Format.nSamplesPerSec, rate);
             wwo->format.Format.nSamplesPerSec = rate;
@@ -3411,7 +3417,7 @@ static DWORD widOpen(WORD wDevID, LPWAVE
 	snd_pcm_close(pcm);
         return WAVERR_BADFORMAT;
     }
-    if (rate != wwi->format.Format.nSamplesPerSec) {
+    if (!NearMatch(rate, wwi->format.Format.nSamplesPerSec)) {
 	ERR("Rate doesn't match (requested %ld Hz, got %d Hz)\n", wwi->format.Format.nSamplesPerSec, rate);
 	snd_pcm_close(pcm);
         return WAVERR_BADFORMAT;


More information about the wine-patches mailing list