From ef0a0d8b86b42962d5b8a114097943168f53c251 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Tue, 5 Jan 2010 22:20:52 +0100 Subject: [PATCH] Revert "dsound: Only initialize one guid for capture and renderer." Reverts b474649e0e9491f938f1daec74cdca01343dd97e. Some games use pointers to the guid rather than copying the guid even after the enumeration function returns. Allocating on the stack breaks those games. --- dlls/dsound/capture.c | 11 ++++--- dlls/dsound/dsound.c | 10 +++--- dlls/dsound/dsound_main.c | 76 ++++++++++++++++++++++---------------------- dlls/dsound/dsound_private.h | 5 +-- dlls/dsound/propset.c | 14 ++++---- 5 files changed, 60 insertions(+), 56 deletions(-) diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c index f2a26bcf76f..26c86b8fac0 100644 --- a/dlls/dsound/capture.c +++ b/dlls/dsound/capture.c @@ -1059,10 +1059,13 @@ static HRESULT DirectSoundCaptureDevice_Initialize( return DSERR_NODRIVER; } - wid = devGUID.Data4[7]; - if (!memcmp(&devGUID, &DSOUND_capture_guid, sizeof(GUID)-1) - && wid < widn) - found = TRUE; + /* enumerate WINMM audio devices and find the one we want */ + for (wid=0; widData4[7] = ds_default_playback; + IsEqualGUID( &DSDEVID_DefaultVoicePlayback, pGuidSrc ) ) { + *pGuidDest = DSOUND_renderer_guids[ds_default_playback]; TRACE("returns %s\n", get_device_id(pGuidDest)); - return DS_OK; + return DS_OK; } if ( IsEqualGUID( &DSDEVID_DefaultCapture, pGuidSrc ) || - IsEqualGUID( &DSDEVID_DefaultVoiceCapture, pGuidSrc ) ) { - *pGuidDest = DSOUND_capture_guid; - pGuidDest->Data4[7] = ds_default_capture; + IsEqualGUID( &DSDEVID_DefaultVoiceCapture, pGuidSrc ) ) { + *pGuidDest = DSOUND_capture_guids[ds_default_capture]; TRACE("returns %s\n", get_device_id(pGuidDest)); - return DS_OK; + return DS_OK; } *pGuidDest = *pGuidSrc; @@ -357,16 +355,17 @@ HRESULT WINAPI DirectSoundEnumerateW( if (devs > 0) { if (GetDeviceID(&DSDEVID_DefaultPlayback, &guid) == DS_OK) { static const WCHAR empty[] = { 0 }; - wod = guid.Data4[7]; - if (wod < devs) { - err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0)); - if (err == DS_OK) { - TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n", - "Primary Sound Driver",desc.szDrvname,lpContext); - MultiByteToWideChar( CP_ACP, 0, "Primary Sound Driver", -1, - wDesc, sizeof(wDesc)/sizeof(WCHAR) ); - if (lpDSEnumCallback(NULL, wDesc, empty, lpContext) == FALSE) - return DS_OK; + for (wod = 0; wod < devs; ++wod) { + if (IsEqualGUID( &guid, &DSOUND_renderer_guids[wod] ) ) { + err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0)); + if (err == DS_OK) { + TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n", + "Primary Sound Driver",desc.szDrvname,lpContext); + MultiByteToWideChar( CP_ACP, 0, "Primary Sound Driver", -1, + wDesc, sizeof(wDesc)/sizeof(WCHAR) ); + if (lpDSEnumCallback(NULL, wDesc, empty, lpContext) == FALSE) + return DS_OK; + } } } } @@ -375,14 +374,13 @@ HRESULT WINAPI DirectSoundEnumerateW( for (wod = 0; wod < devs; ++wod) { err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0)); if (err == DS_OK) { - guid.Data4[7] = wod; TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n", - debugstr_guid(&guid),desc.szDesc,desc.szDrvname,lpContext); + debugstr_guid(&DSOUND_renderer_guids[wod]),desc.szDesc,desc.szDrvname,lpContext); MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDesc, sizeof(wDesc)/sizeof(WCHAR) ); MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wName, sizeof(wName)/sizeof(WCHAR) ); - if (lpDSEnumCallback(&guid, wDesc, wName, lpContext) == FALSE) + if (lpDSEnumCallback(&DSOUND_renderer_guids[wod], wDesc, wName, lpContext) == FALSE) return DS_OK; } } @@ -454,18 +452,19 @@ DirectSoundCaptureEnumerateW( devs = waveInGetNumDevs(); if (devs > 0) { if (GetDeviceID(&DSDEVID_DefaultCapture, &guid) == DS_OK) { - wid = guid.Data4[7]; - if (wid < devs) { - err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0)); - if (err == DS_OK) { - TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n", - "Primary Sound Capture Driver",desc.szDrvname,lpContext); - MultiByteToWideChar( CP_ACP, 0, "Primary Sound Capture Driver", -1, - wDesc, sizeof(wDesc)/sizeof(WCHAR) ); - MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, - wName, sizeof(wName)/sizeof(WCHAR) ); - if (lpDSEnumCallback(NULL, wDesc, wName, lpContext) == FALSE) - return DS_OK; + for (wid = 0; wid < devs; ++wid) { + if (IsEqualGUID( &guid, &DSOUND_capture_guids[wid] ) ) { + err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0)); + if (err == DS_OK) { + TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n", + "Primary Sound Capture Driver",desc.szDrvname,lpContext); + MultiByteToWideChar( CP_ACP, 0, "Primary Sound Capture Driver", -1, + wDesc, sizeof(wDesc)/sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, + wName, sizeof(wName)/sizeof(WCHAR) ); + if (lpDSEnumCallback(NULL, wDesc, wName, lpContext) == FALSE) + return DS_OK; + } } } } @@ -474,14 +473,13 @@ DirectSoundCaptureEnumerateW( for (wid = 0; wid < devs; ++wid) { err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0)); if (err == DS_OK) { - guid.Data4[7] = wid; TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n", - debugstr_guid(&guid),desc.szDesc,desc.szDrvname,lpContext); + debugstr_guid(&DSOUND_capture_guids[wid]),desc.szDesc,desc.szDrvname,lpContext); MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDesc, sizeof(wDesc)/sizeof(WCHAR) ); MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wName, sizeof(wName)/sizeof(WCHAR) ); - if (lpDSEnumCallback(&guid, wDesc, wName, lpContext) == FALSE) + if (lpDSEnumCallback(&DSOUND_capture_guids[wid], wDesc, wName, lpContext) == FALSE) return DS_OK; } } @@ -659,6 +657,8 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) for (i = 0; i < MAXWAVEDRIVERS; i++) { DSOUND_renderer[i] = NULL; DSOUND_capture[i] = NULL; + INIT_GUID(DSOUND_renderer_guids[i], 0xbd6dd71a, 0x3deb, 0x11d1, 0xb1, 0x71, 0x00, 0xc0, 0x4f, 0xc2, 0x00, 0x00 + i); + INIT_GUID(DSOUND_capture_guids[i], 0xbd6dd71b, 0x3deb, 0x11d1, 0xb1, 0x71, 0x00, 0xc0, 0x4f, 0xc2, 0x00, 0x00 + i); } DisableThreadLibraryCalls(hInstDLL); /* Increase refcount on dsound by 1 */ diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h index 33c2f9849f3..1b25ddd3b73 100644 --- a/dlls/dsound/dsound_private.h +++ b/dlls/dsound/dsound_private.h @@ -414,9 +414,10 @@ HRESULT DSOUND_CaptureCreate8(REFIID riid, LPDIRECTSOUNDCAPTURE8 *ppDSC8); #define DSOUND_FREQSHIFT (20) extern DirectSoundDevice* DSOUND_renderer[MAXWAVEDRIVERS]; +extern GUID DSOUND_renderer_guids[MAXWAVEDRIVERS]; + extern DirectSoundCaptureDevice * DSOUND_capture[MAXWAVEDRIVERS]; -extern GUID DSOUND_capture_guid; -extern GUID DSOUND_renderer_guid; +extern GUID DSOUND_capture_guids[MAXWAVEDRIVERS]; HRESULT mmErr(UINT err); void setup_dsound_options(void); diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c index 19a88fb1e08..06456102697 100644 --- a/dlls/dsound/propset.c +++ b/dlls/dsound/propset.c @@ -116,8 +116,7 @@ static HRESULT DSPROPERTY_WaveDeviceMappingW( res = waveOutGetDevCapsW(wod, &capsW, sizeof(capsW)); if (res == MMSYSERR_NOERROR) { if (lstrcmpW(capsW.szPname, ppd->DeviceName) == 0) { - ppd->DeviceId = DSOUND_renderer_guid; - ppd->DeviceId.Data4[7] = wod; + ppd->DeviceId = DSOUND_renderer_guids[wod]; hr = DS_OK; TRACE("found %s for %s\n", debugstr_guid(&ppd->DeviceId), debugstr_w(ppd->DeviceName)); @@ -136,8 +135,7 @@ static HRESULT DSPROPERTY_WaveDeviceMappingW( res = waveInGetDevCapsW(wid, &capsW, sizeof(capsW)); if (res == MMSYSERR_NOERROR) { if (lstrcmpW(capsW.szPname, ppd->DeviceName) == 0) { - ppd->DeviceId = DSOUND_capture_guid; - ppd->DeviceId.Data4[7] = wid; + ppd->DeviceId = DSOUND_capture_guids[wid]; hr = DS_OK; TRACE("found %s for %s\n", debugstr_guid(&ppd->DeviceId), debugstr_w(ppd->DeviceName)); @@ -222,13 +220,13 @@ static HRESULT DSPROPERTY_DescriptionW( wodn = waveOutGetNumDevs(); widn = waveInGetNumDevs(); wid = wod = dev_guid.Data4[7]; - if (!memcmp(&dev_guid, &DSOUND_renderer_guid, sizeof(GUID)-1) + if (!memcmp(&dev_guid, &DSOUND_renderer_guids[0], sizeof(GUID)-1) && wod < wodn) { ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER; ppd->WaveDeviceId = wod; } - else if (!memcmp(&dev_guid, &DSOUND_capture_guid, sizeof(GUID)-1) + else if (!memcmp(&dev_guid, &DSOUND_capture_guids[0], sizeof(GUID)-1) && wid < widn) { ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE; @@ -308,7 +306,7 @@ static HRESULT DSPROPERTY_EnumerateW( wodn = waveOutGetNumDevs(); widn = waveInGetNumDevs(); - data.DeviceId = DSOUND_renderer_guid; + data.DeviceId = DSOUND_renderer_guids[0]; for (i = 0; i < wodn; ++i) { HRESULT hr; @@ -326,7 +324,7 @@ static HRESULT DSPROPERTY_EnumerateW( return S_OK; } - data.DeviceId = DSOUND_capture_guid; + data.DeviceId = DSOUND_capture_guids[0]; for (i = 0; i < widn; ++i) { HRESULT hr; -- 2.11.4.GIT