1 #ifndef PRECOMP_H 2 #define PRECOMP_H 3 4 #define COBJMACROS 5 #define NONAMELESSUNION 6 #define NONAMELESSSTRUCT 7 8 #include <windows.h> 9 #include <setupapi.h> 10 #include <mmddk.h> 11 #include <objbase.h> 12 #include <olectl.h> 13 #include <unknwn.h> 14 #include <dsound.h> 15 #include <dsconf.h> 16 #include <vfwmsgs.h> 17 #include <setupapi.h> 18 #define YDEBUG 19 #include <debug.h> 20 #include <ks.h> 21 #include <ksmedia.h> 22 #include <limits.h> 23 #include <stdio.h> 24 25 #include "resource.h" 26 27 28 /* factory method */ 29 typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject); 30 31 /* factory table */ 32 typedef struct 33 { 34 REFIID riid; 35 LPFNCREATEINSTANCE lpfnCI; 36 } INTERFACE_TABLE; 37 38 39 typedef struct tagFILTERINFO 40 { 41 SP_DEVINFO_DATA DeviceData; 42 WCHAR DevicePath[MAX_PATH]; 43 HANDLE hFilter; 44 ULONG PinCount; 45 PULONG Pin; 46 GUID DeviceGuid[2]; 47 ULONG MappedId[2]; 48 49 struct tagFILTERINFO *lpNext; 50 }FILTERINFO, *LPFILTERINFO; 51 52 #define INIT_GUID(guid, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ 53 guid.Data1 = l; guid.Data2 = w1; guid.Data3 = w2; \ 54 guid.Data4[0] = b1; guid.Data4[1] = b2; guid.Data4[2] = b3; \ 55 guid.Data4[3] = b4; guid.Data4[4] = b5; guid.Data4[5] = b6; \ 56 guid.Data4[6] = b7; guid.Data4[7] = b8; 57 58 typedef enum 59 { 60 PIN_TYPE_NONE = 0, 61 PIN_TYPE_PLAYBACK = 1, 62 PIN_TYPE_RECORDING = 2 63 }PIN_TYPE; 64 65 /* globals */ 66 extern HINSTANCE dsound_hInstance; 67 extern LPFILTERINFO RootInfo; 68 69 /* classfactory.c */ 70 71 IClassFactory * 72 IClassFactory_fnConstructor( 73 LPFNCREATEINSTANCE lpfnCI, 74 PLONG pcRefDll, 75 REFIID riidInst); 76 77 78 /* devicelist.c */ 79 80 HRESULT 81 EnumAudioDeviceInterfaces( 82 LPFILTERINFO *OutRootInfo); 83 84 BOOL 85 FindDeviceByGuid( 86 LPCGUID pGuidSrc, 87 LPFILTERINFO *Filter); 88 89 BOOL 90 FindDeviceByMappedId( 91 IN ULONG DeviceID, 92 LPFILTERINFO *Filter, 93 BOOL bPlayback); 94 95 ULONG 96 GetPinIdFromFilter( 97 LPFILTERINFO Filter, 98 BOOL bCapture, 99 ULONG Offset); 100 101 /* directsound.c */ 102 103 HRESULT 104 CALLBACK 105 NewDirectSound( 106 IUnknown* pUnkOuter, 107 REFIID riid, 108 LPVOID* ppvObject); 109 110 111 /* misc.c */ 112 113 VOID 114 PerformChannelConversion( 115 PUCHAR Buffer, 116 ULONG BufferLength, 117 PULONG BytesRead, 118 ULONG OldChannels, 119 ULONG NewChannels, 120 ULONG BitsPerSample, 121 PUCHAR Result, 122 ULONG ResultLength, 123 PULONG BytesWritten); 124 125 BOOL 126 SetPinFormat( 127 IN HANDLE hPin, 128 IN LPWAVEFORMATEX WaveFormatEx); 129 130 BOOL 131 CreateCompatiblePin( 132 IN HANDLE hFilter, 133 IN DWORD PinId, 134 IN BOOL bLoop, 135 IN LPWAVEFORMATEX WaveFormatEx, 136 OUT LPWAVEFORMATEX WaveFormatOut, 137 OUT PHANDLE hPin); 138 139 140 DWORD 141 SyncOverlappedDeviceIoControl( 142 IN HANDLE Handle, 143 IN DWORD IoControlCode, 144 IN LPVOID InBuffer, 145 IN DWORD InBufferSize, 146 OUT LPVOID OutBuffer, 147 IN DWORD OutBufferSize, 148 OUT LPDWORD BytesTransferred OPTIONAL); 149 150 DWORD 151 PrimaryDirectSoundBuffer_Write( 152 LPDIRECTSOUNDBUFFER8 iface, 153 LPVOID Buffer, 154 DWORD BufferSize); 155 156 157 DWORD 158 OpenPin( 159 HANDLE hFilter, 160 ULONG PinId, 161 LPWAVEFORMATEX WaveFormatEx, 162 PHANDLE hPin, 163 BOOL bLoop); 164 165 DWORD 166 OpenFilter( 167 IN LPCWSTR lpFileName, 168 IN PHANDLE OutHandle); 169 170 DWORD 171 GetFilterPinCount( 172 IN HANDLE hFilter, 173 OUT PULONG NumPins); 174 175 DWORD 176 GetFilterPinCommunication( 177 IN HANDLE hFilter, 178 IN ULONG PinId, 179 OUT PKSPIN_COMMUNICATION Communication); 180 181 DWORD 182 GetFilterPinDataFlow( 183 IN HANDLE hFilter, 184 IN ULONG PinId, 185 OUT PKSPIN_DATAFLOW DataFlow); 186 187 /* primary.c */ 188 189 HRESULT 190 PrimaryDirectSoundBuffer_GetPosition( 191 LPDIRECTSOUNDBUFFER8 iface, 192 LPDWORD pdwCurrentPlayCursor, 193 LPDWORD pdwCurrentWriteCursor); 194 195 VOID 196 PrimaryDirectSoundBuffer_SetState( 197 LPDIRECTSOUNDBUFFER8 iface, 198 KSSTATE State); 199 200 HRESULT 201 NewPrimarySoundBuffer( 202 LPDIRECTSOUNDBUFFER8 *OutBuffer, 203 LPFILTERINFO Filter, 204 DWORD dwLevel, 205 DWORD dwFlags); 206 207 HRESULT 208 PrimaryDirectSoundBuffer_SetFormat( 209 LPDIRECTSOUNDBUFFER8 iface, 210 LPWAVEFORMATEX pcfxFormat, 211 BOOL bLooped); 212 213 VOID 214 PrimaryDirectSoundBuffer_AcquireLock( 215 LPDIRECTSOUNDBUFFER8 iface); 216 217 VOID 218 PrimaryDirectSoundBuffer_ReleaseLock( 219 LPDIRECTSOUNDBUFFER8 iface); 220 221 /* secondary.c */ 222 223 HRESULT 224 NewSecondarySoundBuffer( 225 LPDIRECTSOUNDBUFFER8 *OutBuffer, 226 LPFILTERINFO Filter, 227 DWORD dwLevel, 228 LPCDSBUFFERDESC lpcDSBufferDesc, 229 LPDIRECTSOUNDBUFFER8 PrimaryBuffer); 230 231 /* property.c */ 232 HRESULT 233 CALLBACK 234 NewKsPropertySet( 235 IUnknown* pUnkOuter, 236 REFIID riid, 237 LPVOID* ppvObject); 238 239 /* capture.c */ 240 241 HRESULT 242 CALLBACK 243 NewDirectSoundCapture( 244 IUnknown* pUnkOuter, 245 REFIID riid, 246 LPVOID* ppvObject); 247 248 249 /* capturebuffer.c */ 250 HRESULT 251 NewDirectSoundCaptureBuffer( 252 LPDIRECTSOUNDCAPTUREBUFFER8 *OutBuffer, 253 LPFILTERINFO Filter, 254 LPCDSCBUFFERDESC lpcDSBufferDesc); 255 256 /* notify.c */ 257 VOID 258 DoNotifyPositionEvents( 259 LPDIRECTSOUNDNOTIFY iface, 260 DWORD OldPosition, 261 DWORD NewPosition); 262 263 HRESULT 264 NewDirectSoundNotify( 265 LPDIRECTSOUNDNOTIFY * Notify, 266 BOOL bLoop, 267 BOOL bMix, 268 HANDLE hPin, 269 DWORD BufferSize); 270 271 #endif 272