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.
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; }