1 #include "pa_win_ds_dynlink.h"
2 
3 
4 PaWinDsDSoundEntryPoints paWinDsDSoundEntryPoints = { 0, 0, 0, 0, 0, 0, 0 };
5 
6 
DummyDirectSoundCreate(LPGUID lpcGuidDevice,LPDIRECTSOUND * ppDS,LPUNKNOWN pUnkOuter)7 static HRESULT WINAPI DummyDirectSoundCreate(LPGUID lpcGuidDevice, LPDIRECTSOUND *ppDS, LPUNKNOWN pUnkOuter)
8 {
9     (void)lpcGuidDevice; /* unused parameter */
10     (void)ppDS; /* unused parameter */
11     (void)pUnkOuter; /* unused parameter */
12     return E_NOTIMPL;
13 }
14 
DummyDirectSoundEnumerateW(LPDSENUMCALLBACKW lpDSEnumCallback,LPVOID lpContext)15 static HRESULT WINAPI DummyDirectSoundEnumerateW(LPDSENUMCALLBACKW lpDSEnumCallback, LPVOID lpContext)
16 {
17     (void)lpDSEnumCallback; /* unused parameter */
18     (void)lpContext; /* unused parameter */
19     return E_NOTIMPL;
20 }
21 
DummyDirectSoundEnumerateA(LPDSENUMCALLBACKA lpDSEnumCallback,LPVOID lpContext)22 static HRESULT WINAPI DummyDirectSoundEnumerateA(LPDSENUMCALLBACKA lpDSEnumCallback, LPVOID lpContext)
23 {
24     (void)lpDSEnumCallback; /* unused parameter */
25     (void)lpContext; /* unused parameter */
26     return E_NOTIMPL;
27 }
28 
DummyDirectSoundCaptureCreate(LPGUID lpcGUID,LPDIRECTSOUNDCAPTURE * lplpDSC,LPUNKNOWN pUnkOuter)29 static HRESULT WINAPI DummyDirectSoundCaptureCreate(LPGUID lpcGUID, LPDIRECTSOUNDCAPTURE *lplpDSC, LPUNKNOWN pUnkOuter)
30 {
31     (void)lpcGUID; /* unused parameter */
32     (void)lplpDSC; /* unused parameter */
33     (void)pUnkOuter; /* unused parameter */
34     return E_NOTIMPL;
35 }
36 
DummyDirectSoundCaptureEnumerateW(LPDSENUMCALLBACKW lpDSCEnumCallback,LPVOID lpContext)37 static HRESULT WINAPI DummyDirectSoundCaptureEnumerateW(LPDSENUMCALLBACKW lpDSCEnumCallback, LPVOID lpContext)
38 {
39     (void)lpDSCEnumCallback; /* unused parameter */
40     (void)lpContext; /* unused parameter */
41     return E_NOTIMPL;
42 }
43 
DummyDirectSoundCaptureEnumerateA(LPDSENUMCALLBACKA lpDSCEnumCallback,LPVOID lpContext)44 static HRESULT WINAPI DummyDirectSoundCaptureEnumerateA(LPDSENUMCALLBACKA lpDSCEnumCallback, LPVOID lpContext)
45 {
46     (void)lpDSCEnumCallback; /* unused parameter */
47     (void)lpContext; /* unused parameter */
48     return E_NOTIMPL;
49 }
50 
51 
PaWinDs_InitializeDSoundEntryPoints(void)52 void PaWinDs_InitializeDSoundEntryPoints(void)
53 {
54     paWinDsDSoundEntryPoints.hInstance_ = LoadLibrary("dsound.dll");
55     if( paWinDsDSoundEntryPoints.hInstance_ != NULL )
56     {
57         paWinDsDSoundEntryPoints.DirectSoundCreate =
58                 (HRESULT (WINAPI *)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN))
59                 GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundCreate" );
60         if( paWinDsDSoundEntryPoints.DirectSoundCreate == NULL )
61             paWinDsDSoundEntryPoints.DirectSoundCreate = DummyDirectSoundCreate;
62 
63         paWinDsDSoundEntryPoints.DirectSoundEnumerateW =
64                 (HRESULT (WINAPI *)(LPDSENUMCALLBACKW, LPVOID))
65                 GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundEnumerateW" );
66         if( paWinDsDSoundEntryPoints.DirectSoundEnumerateW == NULL )
67             paWinDsDSoundEntryPoints.DirectSoundEnumerateW = DummyDirectSoundEnumerateW;
68 
69         paWinDsDSoundEntryPoints.DirectSoundEnumerateA =
70                 (HRESULT (WINAPI *)(LPDSENUMCALLBACKA, LPVOID))
71                 GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundEnumerateA" );
72         if( paWinDsDSoundEntryPoints.DirectSoundEnumerateA == NULL )
73             paWinDsDSoundEntryPoints.DirectSoundEnumerateA = DummyDirectSoundEnumerateA;
74 
75         paWinDsDSoundEntryPoints.DirectSoundCaptureCreate =
76                 (HRESULT (WINAPI *)(LPGUID, LPDIRECTSOUNDCAPTURE *, LPUNKNOWN))
77                 GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundCaptureCreate" );
78         if( paWinDsDSoundEntryPoints.DirectSoundCaptureCreate == NULL )
79             paWinDsDSoundEntryPoints.DirectSoundCaptureCreate = DummyDirectSoundCaptureCreate;
80 
81         paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateW =
82                 (HRESULT (WINAPI *)(LPDSENUMCALLBACKW, LPVOID))
83                 GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundCaptureEnumerateW" );
84         if( paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateW == NULL )
85             paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateW = DummyDirectSoundCaptureEnumerateW;
86 
87         paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA =
88                 (HRESULT (WINAPI *)(LPDSENUMCALLBACKA, LPVOID))
89                 GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundCaptureEnumerateA" );
90         if( paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA == NULL )
91             paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA = DummyDirectSoundCaptureEnumerateA;
92     }
93     else
94     {
95         /* initialize with dummy entry points to make live easy when ds isn't present */
96         paWinDsDSoundEntryPoints.DirectSoundCreate = DummyDirectSoundCreate;
97         paWinDsDSoundEntryPoints.DirectSoundEnumerateW = DummyDirectSoundEnumerateW;
98         paWinDsDSoundEntryPoints.DirectSoundEnumerateA = DummyDirectSoundEnumerateA;
99         paWinDsDSoundEntryPoints.DirectSoundCaptureCreate = DummyDirectSoundCaptureCreate;
100         paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateW = DummyDirectSoundCaptureEnumerateW;
101         paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA = DummyDirectSoundCaptureEnumerateA;
102     }
103 }
104 
105 
PaWinDs_TerminateDSoundEntryPoints(void)106 void PaWinDs_TerminateDSoundEntryPoints(void)
107 {
108     if( paWinDsDSoundEntryPoints.hInstance_ != NULL )
109     {
110         /* ensure that we crash reliably if the entry points arent initialised */
111         paWinDsDSoundEntryPoints.DirectSoundCreate = 0;
112         paWinDsDSoundEntryPoints.DirectSoundEnumerateW = 0;
113         paWinDsDSoundEntryPoints.DirectSoundEnumerateA = 0;
114         paWinDsDSoundEntryPoints.DirectSoundCaptureCreate = 0;
115         paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateW = 0;
116         paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA = 0;
117 
118         FreeLibrary( paWinDsDSoundEntryPoints.hInstance_ );
119         paWinDsDSoundEntryPoints.hInstance_ = NULL;
120     }
121 }