[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-patches
mailing list