diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c index 4c29b5b8b01..138d7116526 100644 --- a/dlls/dsound/buffer.c +++ b/dlls/dsound/buffer.c @@ -1044,6 +1044,7 @@ HRESULT WINAPI IDirectSoundBufferImpl_Create( dsb->dsb = 0; dsb->dsound = ds; dsb->lpVtbl = &dsbvt; + dsb->iks = NULL; memcpy(&dsb->dsbd, dsbd, sizeof(*dsbd)); if (wfex) @@ -1064,7 +1065,9 @@ HRESULT WINAPI IDirectSoundBufferImpl_Create( else capf |= DSCAPS_SECONDARYMONO; if (wfex->wBitsPerSample==16) capf |= DSCAPS_SECONDARY16BIT; else capf |= DSCAPS_SECONDARY8BIT; + use_hw = (ds->drvcaps.dwFlags & capf) == capf; + TRACE("use_hw = 0x%08x, capf = 0x%08lx, ds->drvcaps.dwFlags = 0x%08lx\n", use_hw, capf, ds->drvcaps.dwFlags); /* FIXME: check hardware sample rate mixing capabilities */ /* FIXME: check app hints for software/hardware buffer (STATIC, LOCHARDWARE, etc) */ diff --git a/dlls/dsound/dsound_main.c b/dlls/dsound/dsound_main.c index bd926c9cf9f..4068fb3612b 100644 --- a/dlls/dsound/dsound_main.c +++ b/dlls/dsound/dsound_main.c @@ -671,37 +671,37 @@ static HRESULT WINAPI IDirectSoundImpl_GetCaps(LPDIRECTSOUND8 iface,LPDSCAPS lpD return DSERR_INVALIDPARAM; } - lpDSCaps->dwFlags = This->drvcaps.dwFlags; + lpDSCaps->dwFlags = This->drvcaps.dwFlags; TRACE("(flags=0x%08lx)\n",lpDSCaps->dwFlags); - /* FIXME: copy caps from This->drv */ - lpDSCaps->dwMinSecondarySampleRate = DSBFREQUENCY_MIN; - lpDSCaps->dwMaxSecondarySampleRate = DSBFREQUENCY_MAX; + lpDSCaps->dwMinSecondarySampleRate = This->drvcaps.dwMinSecondarySampleRate; + lpDSCaps->dwMaxSecondarySampleRate = This->drvcaps.dwMaxSecondarySampleRate; - lpDSCaps->dwPrimaryBuffers = 1; + lpDSCaps->dwPrimaryBuffers = This->drvcaps.dwPrimaryBuffers; - lpDSCaps->dwMaxHwMixingAllBuffers = 0; - lpDSCaps->dwMaxHwMixingStaticBuffers = 0; - lpDSCaps->dwMaxHwMixingStreamingBuffers = 0; + lpDSCaps->dwMaxHwMixingAllBuffers = This->drvcaps.dwMaxHwMixingAllBuffers; + lpDSCaps->dwMaxHwMixingStaticBuffers = This->drvcaps.dwMaxHwMixingStaticBuffers; + lpDSCaps->dwMaxHwMixingStreamingBuffers = This->drvcaps.dwMaxHwMixingStreamingBuffers; - lpDSCaps->dwFreeHwMixingAllBuffers = 0; - lpDSCaps->dwFreeHwMixingStaticBuffers = 0; - lpDSCaps->dwFreeHwMixingStreamingBuffers = 0; + lpDSCaps->dwFreeHwMixingAllBuffers = This->drvcaps.dwFreeHwMixingAllBuffers; + lpDSCaps->dwFreeHwMixingStaticBuffers = This->drvcaps.dwFreeHwMixingStaticBuffers; + lpDSCaps->dwFreeHwMixingStreamingBuffers = This->drvcaps.dwFreeHwMixingStreamingBuffers; - lpDSCaps->dwMaxHw3DAllBuffers = 0; - lpDSCaps->dwMaxHw3DStaticBuffers = 0; - lpDSCaps->dwMaxHw3DStreamingBuffers = 0; + lpDSCaps->dwMaxHw3DAllBuffers = This->drvcaps.dwMaxHw3DAllBuffers; + lpDSCaps->dwMaxHw3DStaticBuffers = This->drvcaps.dwMaxHw3DStaticBuffers; + lpDSCaps->dwMaxHw3DStreamingBuffers = This->drvcaps.dwMaxHw3DStreamingBuffers; - lpDSCaps->dwFreeHw3DAllBuffers = 0; - lpDSCaps->dwFreeHw3DStaticBuffers = 0; - lpDSCaps->dwFreeHw3DStreamingBuffers = 0; + lpDSCaps->dwFreeHw3DAllBuffers = This->drvcaps.dwFreeHw3DAllBuffers; + lpDSCaps->dwFreeHw3DStaticBuffers = This->drvcaps.dwFreeHw3DStaticBuffers; + lpDSCaps->dwFreeHw3DStreamingBuffers = This->drvcaps.dwFreeHw3DStreamingBuffers; - lpDSCaps->dwTotalHwMemBytes = 0; + lpDSCaps->dwTotalHwMemBytes = This->drvcaps.dwTotalHwMemBytes; - lpDSCaps->dwFreeHwMemBytes = 0; + lpDSCaps->dwFreeHwMemBytes = This->drvcaps.dwFreeHwMemBytes; - lpDSCaps->dwMaxContigFreeHwMemBytes = 0; + lpDSCaps->dwMaxContigFreeHwMemBytes = This->drvcaps.dwMaxContigFreeHwMemBytes; + /* driver doesn't have these */ lpDSCaps->dwUnlockTransferRateHwBuffers = 4096; /* But we have none... */ lpDSCaps->dwPlayCpuOverheadSwBuffers = 1; /* 1% */ @@ -1099,7 +1099,7 @@ HRESULT WINAPI DirectSoundCreate8(LPCGUID lpcGUID,LPDIRECTSOUND8 *ppDS,IUnknown *ippDS = NULL; return err; } - (*ippDS)->drvcaps.dwFlags = 0; + ZeroMemory(&(*ippDS)->drvcaps, sizeof((*ippDS)->drvcaps)); if ((woc.dwFormats & WAVE_FORMAT_1M08) || (woc.dwFormats & WAVE_FORMAT_2M08) || (woc.dwFormats & WAVE_FORMAT_4M08) || @@ -1134,6 +1134,9 @@ HRESULT WINAPI DirectSoundCreate8(LPCGUID lpcGUID,LPDIRECTSOUND8 *ppDS,IUnknown } if (ds_emuldriver) (*ippDS)->drvcaps.dwFlags |= DSCAPS_EMULDRIVER; + (*ippDS)->drvcaps.dwMinSecondarySampleRate = DSBFREQUENCY_MIN; + (*ippDS)->drvcaps.dwMaxSecondarySampleRate = DSBFREQUENCY_MAX; + (*ippDS)->drvcaps.dwPrimaryBuffers = 1; } DSOUND_RecalcVolPan(&((*ippDS)->volpan)); diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c index 30adad224c8..708807b6673 100644 --- a/dlls/dsound/propset.c +++ b/dlls/dsound/propset.c @@ -25,12 +25,14 @@ #include #include #ifdef HAVE_UNISTD_H -# include +#include #endif #include #include #include /* Insomnia - pow() function */ +#define NONAMELESSUNION +#define NONAMELESSSTRUCT #include "windef.h" #include "winbase.h" #include "wingdi.h" @@ -43,9 +45,9 @@ #include "wine/windef16.h" #include "wine/debug.h" #include "dsound.h" +#include "dsconf.h" #include "dsdriver.h" #include "dsound_private.h" -#include "dsconf.h" WINE_DEFAULT_DEBUG_CHANNEL(dsound); @@ -103,9 +105,28 @@ static HRESULT WINAPI IKsBufferPropertySetImpl_Get( PULONG pcbReturned ) { ICOM_THIS(IKsBufferPropertySetImpl,iface); - FIXME("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p) stub!\n", + PIDSDRIVERPROPERTYSET ps; + TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n", This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned); + IDsDriver_QueryInterface(This->dsb->hwbuf, &IID_IDsDriverPropertySet, (void **)&ps); + + if (ps) { + DSPROPERTY prop; + HRESULT hres; + + prop.s.Set = *guidPropSet; + prop.s.Id = dwPropID; + prop.s.Flags = 0; /* unused */ + prop.s.InstanceId = (ULONG)This->dsb->dsound; + + hres = IDsDriverPropertySet_Get(ps, &prop, pInstanceData, cbInstanceData, pPropData, cbPropData, pcbReturned); + + IDsDriverPropertySet_Release(ps); + + return hres; + } + return E_PROP_ID_UNSUPPORTED; } @@ -119,8 +140,26 @@ static HRESULT WINAPI IKsBufferPropertySetImpl_Set( ULONG cbPropData ) { ICOM_THIS(IKsBufferPropertySetImpl,iface); + PIDSDRIVERPROPERTYSET ps; + TRACE("(%p,%s,%ld,%p,%ld,%p,%ld)\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData); + + IDsDriver_QueryInterface(This->dsb->hwbuf, &IID_IDsDriverPropertySet, (void **)&ps); + + if (ps) { + DSPROPERTY prop; + HRESULT hres; + + prop.s.Set = *guidPropSet; + prop.s.Id = dwPropID; + prop.s.Flags = 0; /* unused */ + prop.s.InstanceId = (ULONG)This->dsb->dsound; + hres = IDsDriverPropertySet_Set(ps,&prop,pInstanceData,cbInstanceData,pPropData,cbPropData); + + IDsDriverPropertySet_Release(ps); + + return hres; + } - FIXME("(%p,%s,%ld,%p,%ld,%p,%ld), stub!\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData); return E_PROP_ID_UNSUPPORTED; } @@ -131,7 +170,20 @@ static HRESULT WINAPI IKsBufferPropertySetImpl_QuerySupport( PULONG pTypeSupport ) { ICOM_THIS(IKsBufferPropertySetImpl,iface); - FIXME("(%p,%s,%ld,%p) stub!\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport); + PIDSDRIVERPROPERTYSET ps; + TRACE("(%p,%s,%ld,%p)\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport); + + IDsDriver_QueryInterface(This->dsb->hwbuf, &IID_IDsDriverPropertySet, (void **)&ps); + + if (ps) { + HRESULT hres; + + hres = IDsDriverPropertySet_QuerySupport(ps,guidPropSet, dwPropID,pTypeSupport); + + IDsDriverPropertySet_Release(ps); + + return hres; + } return E_PROP_ID_UNSUPPORTED; } @@ -151,8 +203,9 @@ HRESULT WINAPI IKsBufferPropertySetImpl_Create( IKsBufferPropertySetImpl **piks) { IKsBufferPropertySetImpl *iks; + TRACE("(%p,%p)\n",dsb,piks); - iks = (IKsBufferPropertySetImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(*iks)); + iks = (IKsBufferPropertySetImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*iks)); iks->ref = 0; iks->dsb = dsb; dsb->iks = iks; @@ -299,79 +352,86 @@ static HRESULT WINAPI DSPROPERTY_Description1( FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n", debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned); return E_PROP_ID_UNSUPPORTED; - } else { - GetDeviceID(&ppd->DeviceId, &dev_guid); - - if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) || - IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) { - ULONG wod; - int wodn; - TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n"); - ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER; - wodn = waveOutGetNumDevs(); - for (wod = 0; wod < wodn; wod++) { - err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0)); - if (err == DS_OK) { - if (IsEqualGUID( &dev_guid, &guid) ) { - DSDRIVERDESC desc; - ppd->WaveDeviceId = wod; - ppd->Devnode = wod; - err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0)); - if (err == DS_OK) { - strncpy(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA) - 1); - strncpy(ppd->ModuleA, desc.szDrvName, sizeof(ppd->ModuleA) - 1); - MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) ); - MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) ); - break; - } else { - WARN("waveOutMessage failed\n"); - return E_PROP_ID_UNSUPPORTED; - } - } - } else { - WARN("waveOutMessage failed\n"); - return E_PROP_ID_UNSUPPORTED; - } - } - } else if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) || - IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) { - ULONG wid; - int widn; - TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n"); - ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE; - widn = waveInGetNumDevs(); - for (wid = 0; wid < widn; wid++) { - err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0)); - if (err == DS_OK) { - if (IsEqualGUID( &dev_guid, &guid) ) { - DSDRIVERDESC desc; - ppd->WaveDeviceId = wid; - ppd->Devnode = wid; - err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0)); - if (err == DS_OK) { - strncpy(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA) - 1); - strncpy(ppd->ModuleA, desc.szDrvName, sizeof(ppd->ModuleA) - 1); - MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) ); - MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) ); - break; - } else { - WARN("waveInMessage failed\n"); - return E_PROP_ID_UNSUPPORTED; - } - break; - } - } else { - WARN("waveInMessage failed\n"); - return E_PROP_ID_UNSUPPORTED; - } - } - } else { - FIXME("DeviceId=Unknown\n"); - return E_PROP_ID_UNSUPPORTED; - } } ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED; + GetDeviceID(&ppd->DeviceId, &dev_guid); + + if ( IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultPlayback) || + IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultVoicePlayback) ) { + ULONG wod; + int wodn; + TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n"); + ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER; + wodn = waveOutGetNumDevs(); + for (wod = 0; wod < wodn; wod++) { + err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0)); + if (err == DS_OK) { + if (IsEqualGUID( &dev_guid, &guid) ) { + DSDRIVERDESC desc; + ppd->WaveDeviceId = wod; + ppd->Devnode = wod; + err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0)); + if (err == DS_OK) { + PIDSDRIVER drv = NULL; + strncpy(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA) - 1); + strncpy(ppd->ModuleA, desc.szDrvName, sizeof(ppd->ModuleA) - 1); + MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) ); + err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0)); + if (err == DS_OK && drv) + ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD; + break; + } else { + WARN("waveOutMessage failed\n"); + return E_PROP_ID_UNSUPPORTED; + } + } + } else { + WARN("waveOutMessage failed\n"); + return E_PROP_ID_UNSUPPORTED; + } + } + } else if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) || + IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) { + ULONG wid; + int widn; + TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n"); + ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE; + widn = waveInGetNumDevs(); + for (wid = 0; wid < widn; wid++) { + err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0)); + if (err == DS_OK) { + if (IsEqualGUID( &dev_guid, &guid) ) { + DSDRIVERDESC desc; + ppd->WaveDeviceId = wid; + ppd->Devnode = wid; + err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0)); + if (err == DS_OK) { + PIDSCDRIVER drv; + strncpy(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA) - 1); + strncpy(ppd->ModuleA, desc.szDrvName, sizeof(ppd->ModuleA) - 1); + MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) ); + err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0)); + if (err == DS_OK && drv) + ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD; + break; + } else { + WARN("waveInMessage failed\n"); + return E_PROP_ID_UNSUPPORTED; + } + break; + } + } else { + WARN("waveInMessage failed\n"); + return E_PROP_ID_UNSUPPORTED; + } + } + } else { + FIXME("DeviceId=Unknown\n"); + return E_PROP_ID_UNSUPPORTED; + } if (pcbReturned) { *pcbReturned = cbPropData; @@ -417,93 +477,100 @@ static HRESULT WINAPI DSPROPERTY_DescriptionW( FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n", debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned); return E_PROP_ID_UNSUPPORTED; - } else { - GetDeviceID(&ppd->DeviceId, &dev_guid); - - if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) || - IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) { - ULONG wod; - int wodn; - TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n"); - ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER; - wodn = waveOutGetNumDevs(); - for (wod = 0; wod < wodn; wod++) { - err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0)); - if (err == DS_OK) { - if (IsEqualGUID( &dev_guid, &guid) ) { - DSDRIVERDESC desc; - ppd->WaveDeviceId = wod; - err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0)); - if (err == DS_OK) { - /* FIXME: this is a memory leak */ - WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200); - WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200); - WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200); - - MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 ); - MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 ); - MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 ); - - ppd->Description = wDescription; - ppd->Module = wModule; - ppd->Interface = wInterface; - break; - } else { - WARN("waveOutMessage failed\n"); - return E_PROP_ID_UNSUPPORTED; - } - } - } else { - WARN("waveOutMessage failed\n"); - return E_PROP_ID_UNSUPPORTED; - } - } - } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) || - IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) { - ULONG wid; - int widn; - TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n"); - ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE; - widn = waveInGetNumDevs(); - for (wid = 0; wid < widn; wid++) { - err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0)); - if (err == DS_OK) { - if (IsEqualGUID( &dev_guid, &guid) ) { - DSDRIVERDESC desc; - ppd->WaveDeviceId = wid; - err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0)); - if (err == DS_OK) { - /* FIXME: this is a memory leak */ - WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200); - WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200); - WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200); - - MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 ); - MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 ); - MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 ); - - ppd->Description = wDescription; - ppd->Module = wModule; - ppd->Interface = wInterface; - break; - } else { - WARN("waveInMessage failed\n"); - return E_PROP_ID_UNSUPPORTED; - } - break; - } - } else { - WARN("waveInMessage failed\n"); - return E_PROP_ID_UNSUPPORTED; - } - } - } else { - FIXME("DeviceId=Unknown\n"); - return E_PROP_ID_UNSUPPORTED; - } } ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED; + GetDeviceID(&ppd->DeviceId, &dev_guid); + + if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) || + IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) { + ULONG wod; + int wodn; + TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n"); + ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER; + wodn = waveOutGetNumDevs(); + for (wod = 0; wod < wodn; wod++) { + err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0)); + if (err == DS_OK) { + if (IsEqualGUID( &dev_guid, &guid) ) { + DSDRIVERDESC desc; + ppd->WaveDeviceId = wod; + err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0)); + if (err == DS_OK) { + PIDSDRIVER drv = NULL; + /* FIXME: this is a memory leak */ + WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200); + WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200); + WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200); + + MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 ); + MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 ); + MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 ); + + ppd->Description = wDescription; + ppd->Module = wModule; + ppd->Interface = wInterface; + err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0)); + if (err == DS_OK && drv) + ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD; + break; + } else { + WARN("waveOutMessage failed\n"); + return E_PROP_ID_UNSUPPORTED; + } + } + } else { + WARN("waveOutMessage failed\n"); + return E_PROP_ID_UNSUPPORTED; + } + } + } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) || + IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) { + ULONG wid; + int widn; + TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n"); + ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE; + widn = waveInGetNumDevs(); + for (wid = 0; wid < widn; wid++) { + err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDGUID,(DWORD)(&guid),0)); + if (err == DS_OK) { + if (IsEqualGUID( &dev_guid, &guid) ) { + DSDRIVERDESC desc; + ppd->WaveDeviceId = wid; + err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0)); + if (err == DS_OK) { + PIDSCDRIVER drv; + /* FIXME: this is a memory leak */ + WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200); + WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200); + WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200); + + MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 ); + MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 ); + MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 ); + + ppd->Description = wDescription; + ppd->Module = wModule; + ppd->Interface = wInterface; + err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0)); + if (err == DS_OK && drv) + ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD; + break; + } else { + WARN("waveInMessage failed\n"); + return E_PROP_ID_UNSUPPORTED; + } + break; + } + } else { + WARN("waveInMessage failed\n"); + return E_PROP_ID_UNSUPPORTED; + } + } + } else { + FIXME("DeviceId=Unknown\n"); + return E_PROP_ID_UNSUPPORTED; + } if (pcbReturned) { *pcbReturned = cbPropData; diff --git a/dlls/winmm/winealsa/audio.c b/dlls/winmm/winealsa/audio.c index 2e41831f1db..ed3ff75fa4c 100644 --- a/dlls/winmm/winealsa/audio.c +++ b/dlls/winmm/winealsa/audio.c @@ -2009,6 +2009,8 @@ static HRESULT WINAPI IDsDriverImpl_GetCaps(PIDSDRIVER iface, PDSDRIVERCAPS pCap 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) */ diff --git a/dlls/winmm/wineaudioio/audio.c b/dlls/winmm/wineaudioio/audio.c index 25416ec993f..b046eabf9d5 100644 --- a/dlls/winmm/wineaudioio/audio.c +++ b/dlls/winmm/wineaudioio/audio.c @@ -1562,6 +1562,8 @@ static HRESULT WINAPI IDsDriverImpl_GetCaps(PIDSDRIVER iface, PDSDRIVERCAPS pCap pCaps->dwFlags = DSCAPS_PRIMARYMONO | DSCAPS_PRIMARYSTEREO | DSCAPS_PRIMARY8BIT | DSCAPS_PRIMARY16BIT; pCaps->dwPrimaryBuffers = 1; + 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) */ return DS_OK; diff --git a/dlls/winmm/wineoss/audio.c b/dlls/winmm/wineoss/audio.c index 0523cfa1a50..057f4648f75 100644 --- a/dlls/winmm/wineoss/audio.c +++ b/dlls/winmm/wineoss/audio.c @@ -553,7 +553,9 @@ static BOOL OSS_WaveOutInit(OSS_DEVICE* ossdev) /* direct sound caps */ ossdev->ds_caps.dwFlags = 0; ossdev->ds_caps.dwPrimaryBuffers = 1; - + ossdev->ds_caps.dwMinSecondarySampleRate = DSBFREQUENCY_MIN; + ossdev->ds_caps.dwMaxSecondarySampleRate = DSBFREQUENCY_MAX; + if (WINE_TRACE_ON(wave)) { /* Note that this only reports the formats supported by the hardware. * The driver may support other formats and do the conversions in