[WINEALSA] fix direct sound capabilities to match HW

Robert Reif reif at earthlink.net
Sun Mar 20 14:55:20 CST 2005


Robert Reif wrote:

> Fix direct sound capabilities to match hardware.
>
> Should fix problems related to trying to do 8 bit and mono on
> 16 bit stereo only hardware when using ALSA hw device and
> direct sound hardware acceleration.
>
>  
>
This one should work.

-------------- next part --------------
Index: dlls/winmm/winealsa/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winealsa/audio.c,v
retrieving revision 1.67
diff -u -p -r1.67 audio.c
--- dlls/winmm/winealsa/audio.c	19 Mar 2005 17:11:02 -0000	1.67
+++ dlls/winmm/winealsa/audio.c	20 Mar 2005 20:51:41 -0000
@@ -189,6 +189,7 @@ typedef struct {
 
     /* DirectSound stuff */
     DSDRIVERDESC                ds_desc;
+    DSDRIVERCAPS                ds_caps;
 } WINE_WAVEOUT;
 
 typedef struct {
@@ -231,6 +232,7 @@ typedef struct {
 
     /* DirectSound stuff */
     DSDRIVERDESC                ds_desc;
+    DSCDRIVERCAPS               ds_caps;
 } WINE_WAVEIN;
 
 static WINE_WAVEOUT	WOutDev   [MAX_WAVEOUTDRV];
@@ -817,6 +819,38 @@ LONG ALSA_WaveInit(void)
                 wwo->caps.dwSupport |= WAVECAPS_LRVOLUME;
         }
 
+        if (wwo->caps.dwFormats & (WAVE_FORMAT_1M08  | WAVE_FORMAT_2M08  |
+                                   WAVE_FORMAT_4M08  | WAVE_FORMAT_48M08 |
+                                   WAVE_FORMAT_96M08 | WAVE_FORMAT_1M16  |
+                                   WAVE_FORMAT_2M16  | WAVE_FORMAT_4M16  |
+                                   WAVE_FORMAT_48M16 | WAVE_FORMAT_96M16) )
+            wwo->ds_caps.dwFlags |= DSCAPS_PRIMARYMONO;
+
+        if (wwo->caps.dwFormats & (WAVE_FORMAT_1S08  | WAVE_FORMAT_2S08  |
+                                   WAVE_FORMAT_4S08  | WAVE_FORMAT_48S08 |
+                                   WAVE_FORMAT_96S08 | WAVE_FORMAT_1S16  |
+                                   WAVE_FORMAT_2S16  | WAVE_FORMAT_4S16  |
+                                   WAVE_FORMAT_48S16 | WAVE_FORMAT_96S16) )
+            wwo->ds_caps.dwFlags |= DSCAPS_PRIMARYSTEREO;
+
+        if (wwo->caps.dwFormats & (WAVE_FORMAT_1M08  | WAVE_FORMAT_2M08  |
+                                   WAVE_FORMAT_4M08  | WAVE_FORMAT_48M08 |
+                                   WAVE_FORMAT_96M08 | WAVE_FORMAT_1S08  |
+                                   WAVE_FORMAT_2S08  | WAVE_FORMAT_4S08  |
+                                   WAVE_FORMAT_48S08 | WAVE_FORMAT_96S08) )
+            wwo->ds_caps.dwFlags |= DSCAPS_PRIMARY8BIT;
+
+        if (wwo->caps.dwFormats & (WAVE_FORMAT_1M16  | WAVE_FORMAT_2M16  |
+                                   WAVE_FORMAT_4M16  | WAVE_FORMAT_48M16 |
+                                   WAVE_FORMAT_96M16 | WAVE_FORMAT_1S16  |
+                                   WAVE_FORMAT_2S16  | WAVE_FORMAT_4S16  |
+                                   WAVE_FORMAT_48S16 | WAVE_FORMAT_96S16) )
+            wwo->ds_caps.dwFlags |= DSCAPS_PRIMARY16BIT;
+
+        wwo->ds_caps.dwMinSecondarySampleRate = DSBFREQUENCY_MIN;
+        wwo->ds_caps.dwMaxSecondarySampleRate = DSBFREQUENCY_MAX;
+        wwo->ds_caps.dwPrimaryBuffers = 1;
+
         ALSA_WodNumDevs++;
     }
 
@@ -933,7 +967,7 @@ LONG ALSA_WaveInit(void)
 
         ALSA_WidNumDevs++;
     }
-    
+
     return 0;
 }
 
@@ -2013,7 +2047,7 @@ static DWORD wodGetVolume(WORD wDevID, L
 
     if (!wwo->ctl)
         return MMSYSERR_NOTSUPPORTED;
- 
+
     count = snd_ctl_elem_info_get_count(wwo->playback_einfo);
     min = snd_ctl_elem_info_get_min(wwo->playback_einfo);
     max = snd_ctl_elem_info_get_max(wwo->playback_einfo);
@@ -2612,25 +2646,7 @@ static HRESULT WINAPI IDsDriverImpl_GetC
 {
     IDsDriverImpl *This = (IDsDriverImpl *)iface;
     TRACE("(%p,%p)\n",iface,pCaps);
-    memset(pCaps, 0, sizeof(*pCaps));
-
-    pCaps->dwFlags = DSCAPS_PRIMARYMONO;
-    if ( WOutDev[This->wDevID].caps.wChannels == 2 )
-        pCaps->dwFlags |= DSCAPS_PRIMARYSTEREO;
-
-    if ( WOutDev[This->wDevID].caps.dwFormats & (WAVE_FORMAT_1S08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_4S08 ) )
-	pCaps->dwFlags |= DSCAPS_PRIMARY8BIT;
-
-    if ( WOutDev[This->wDevID].caps.dwFormats & (WAVE_FORMAT_1S16 | WAVE_FORMAT_2S16 | WAVE_FORMAT_4S16))
-	pCaps->dwFlags |= DSCAPS_PRIMARY16BIT;
-
-    pCaps->dwPrimaryBuffers = 1;
-    TRACE("caps=0x%X\n",(unsigned int)pCaps->dwFlags);
-    pCaps->dwMinSecondarySampleRate = DSBFREQUENCY_MIN;
-    pCaps->dwMaxSecondarySampleRate = DSBFREQUENCY_MAX;
-
-    /* the other fields only apply to secondary buffers, which we don't support
-     * (unless we want to mess with wavetable synthesizers and MIDI) */
+    memcpy(pCaps, &(WOutDev[This->wDevID].ds_caps), sizeof(DSDRIVERCAPS));
     return DS_OK;
 }
 


More information about the wine-devel mailing list