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
,
26 &CLSID_DirectSoundCapture8
,
53 GetDeviceID(LPCGUID pGuidSrc
, LPGUID pGuidDest
)
55 ULONG DeviceID
= ULONG_MAX
, Flags
;
59 if (!pGuidSrc
|| !pGuidDest
)
62 return DSERR_INVALIDPARAM
;
66 ASSERT(!IsEqualGUID(pGuidSrc
, &GUID_NULL
));
68 if (IsEqualGUID(&DSDEVID_DefaultPlayback
, pGuidSrc
) ||
69 IsEqualGUID(&DSDEVID_DefaultVoicePlayback
, pGuidSrc
))
71 Result
= waveOutMessage(UlongToHandle(WAVE_MAPPER
), DRVM_MAPPER_PREFERRED_GET
, (DWORD_PTR
)&DeviceID
, (DWORD_PTR
)&Flags
);
72 if (Result
!= MMSYSERR_NOERROR
|| DeviceID
== ULONG_MAX
)
75 DPRINT1("Failed to get DRVM_MAPPER_PREFERRED_GET, using device 0\n");
79 if (!FindDeviceByMappedId(DeviceID
, &Filter
, TRUE
))
81 /* device not found */
82 return DSERR_INVALIDPARAM
;
85 /* copy device guid */
86 RtlMoveMemory(pGuidDest
, &Filter
->DeviceGuid
[1], sizeof(GUID
));
89 else if (IsEqualGUID(&DSDEVID_DefaultCapture
, pGuidSrc
) ||
90 IsEqualGUID(&DSDEVID_DefaultVoiceCapture
, pGuidSrc
))
92 Result
= waveInMessage(UlongToHandle(WAVE_MAPPER
), DRVM_MAPPER_PREFERRED_GET
, (DWORD_PTR
)&DeviceID
, (DWORD_PTR
)&Flags
);
93 if (Result
!= MMSYSERR_NOERROR
|| DeviceID
== ULONG_MAX
)
96 DPRINT1("Failed to get DRVM_MAPPER_PREFERRED_GET, for record using device 0\n");
100 if (!FindDeviceByMappedId(DeviceID
, &Filter
, FALSE
))
102 /* device not found */
103 return DSERR_INVALIDPARAM
;
106 /* copy device guid */
107 RtlMoveMemory(pGuidDest
, &Filter
->DeviceGuid
[0], sizeof(GUID
));
111 if (!FindDeviceByGuid(pGuidSrc
, &Filter
))
114 return DSERR_INVALIDPARAM
;
130 LPOLESTR pStr
, pStr2
;
132 HRESULT hres
= E_OUTOFMEMORY
;
133 IClassFactory
* pcf
= NULL
;
140 for (i
= 0; InterfaceTable
[i
].riid
; i
++)
142 if (IsEqualIID(InterfaceTable
[i
].riid
, rclsid
))
144 pcf
= IClassFactory_fnConstructor(InterfaceTable
[i
].lpfnCI
, NULL
, NULL
);
151 StringFromIID(rclsid
, &pStr
);
152 StringFromIID(riid
, &pStr2
);
153 DPRINT("No Class Available for %ws IID %ws\n", pStr
, pStr2
);
155 CoTaskMemFree(pStr2
);
157 return CLASS_E_CLASSNOTAVAILABLE
;
160 hres
= IClassFactory_QueryInterface(pcf
, riid
, ppv
);
161 IClassFactory_Release(pcf
);
177 case DLL_PROCESS_ATTACH
:
178 dsound_hInstance
= hInstDLL
;
180 DPRINT("NumDevs %u\n", waveOutGetNumDevs());
181 if (EnumAudioDeviceInterfaces(&RootInfo
) != S_OK
)
183 DPRINT("EnumAudioDeviceInterfaces failed\n");
186 DPRINT1("EnumAudioDeviceInterfaces %p %u\n", RootInfo
, waveOutGetNumDevs());
188 DisableThreadLibraryCalls(dsound_hInstance
);