2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Configuration of network devices
4 * FILE: dll/directx/dsound_new/dsound.c
5 * PURPOSE: Handles DSound initialization
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
12 HINSTANCE dsound_hInstance
;
13 LPFILTERINFO RootInfo
= NULL
;
15 static INTERFACE_TABLE InterfaceTable
[] =
18 &CLSID_DirectSoundPrivate
,
22 &CLSID_DirectSoundCapture
,
45 GetDeviceID(LPCGUID pGuidSrc
, LPGUID pGuidDest
)
47 ULONG DeviceID
= ULONG_MAX
, Flags
;
51 if (!pGuidSrc
|| !pGuidDest
)
54 return DSERR_INVALIDPARAM
;
58 ASSERT(!IsEqualGUID(pGuidSrc
, &GUID_NULL
));
60 if (IsEqualGUID(&DSDEVID_DefaultPlayback
, pGuidSrc
) ||
61 IsEqualGUID(&DSDEVID_DefaultVoicePlayback
, pGuidSrc
))
63 Result
= waveOutMessage(UlongToHandle(WAVE_MAPPER
), DRVM_MAPPER_PREFERRED_GET
, (DWORD_PTR
)&DeviceID
, (DWORD_PTR
)&Flags
);
64 if (Result
!= MMSYSERR_NOERROR
|| DeviceID
== ULONG_MAX
)
67 DPRINT1("Failed to get DRVM_MAPPER_PREFERRED_GET, using device 0\n");
71 if (!FindDeviceByMappedId(DeviceID
, &Filter
, TRUE
))
73 /* device not found */
74 return DSERR_INVALIDPARAM
;
77 /* copy device guid */
78 RtlMoveMemory(pGuidDest
, &Filter
->DeviceGuid
[1], sizeof(GUID
));
81 else if (IsEqualGUID(&DSDEVID_DefaultCapture
, pGuidSrc
) ||
82 IsEqualGUID(&DSDEVID_DefaultVoiceCapture
, pGuidSrc
))
84 Result
= waveInMessage(UlongToHandle(WAVE_MAPPER
), DRVM_MAPPER_PREFERRED_GET
, (DWORD_PTR
)&DeviceID
, (DWORD_PTR
)&Flags
);
85 if (Result
!= MMSYSERR_NOERROR
|| DeviceID
== ULONG_MAX
)
88 DPRINT1("Failed to get DRVM_MAPPER_PREFERRED_GET, for record using device 0\n");
92 if (!FindDeviceByMappedId(DeviceID
, &Filter
, FALSE
))
94 /* device not found */
95 return DSERR_INVALIDPARAM
;
98 /* copy device guid */
99 RtlMoveMemory(pGuidDest
, &Filter
->DeviceGuid
[0], sizeof(GUID
));
103 if (!FindDeviceByGuid(pGuidSrc
, &Filter
))
106 return DSERR_INVALIDPARAM
;
122 LPOLESTR pStr
, pStr2
;
124 HRESULT hres
= E_OUTOFMEMORY
;
125 IClassFactory
* pcf
= NULL
;
132 for (i
= 0; InterfaceTable
[i
].riid
; i
++)
134 if (IsEqualIID(InterfaceTable
[i
].riid
, rclsid
))
136 pcf
= IClassFactory_fnConstructor(InterfaceTable
[i
].lpfnCI
, NULL
, NULL
);
143 StringFromIID(rclsid
, &pStr
);
144 StringFromIID(riid
, &pStr2
);
145 DPRINT("No Class Available for %ws IID %ws\n", pStr
, pStr2
);
147 CoTaskMemFree(pStr2
);
149 return CLASS_E_CLASSNOTAVAILABLE
;
152 hres
= IClassFactory_QueryInterface(pcf
, riid
, ppv
);
153 IClassFactory_Release(pcf
);
169 case DLL_PROCESS_ATTACH
:
170 dsound_hInstance
= hInstDLL
;
172 DPRINT("NumDevs %u\n", waveOutGetNumDevs());
173 if (EnumAudioDeviceInterfaces(&RootInfo
) != S_OK
)
175 DPRINT("EnumAudioDeviceInterfaces failed\n");
178 DPRINT1("EnumAudioDeviceInterfaces %p %u\n", RootInfo
, waveOutGetNumDevs());
180 DisableThreadLibraryCalls(dsound_hInstance
);