Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenenum.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Configuration of network devices 00004 * FILE: dll/directx/dsound_new/enum.c 00005 * PURPOSE: Handles DSound device enumeration 00006 * 00007 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) 00008 */ 00009 00010 #include "precomp.h" 00011 00012 VOID 00013 LoadResourceString( 00014 UINT ResourceId, 00015 LPVOID Buffer, 00016 UINT ccount, 00017 LPVOID DefaultString, 00018 BOOL bUnicode) 00019 { 00020 if (bUnicode) 00021 { 00022 /* load localized string */ 00023 if (!LoadStringW(dsound_hInstance, ResourceId, (LPWSTR)Buffer, ccount)) 00024 { 00025 /* default device name */ 00026 wcscpy((LPWSTR)Buffer, (LPWSTR)DefaultString); 00027 } 00028 } 00029 else 00030 { 00031 /* load localized string */ 00032 if (!LoadStringA(dsound_hInstance, ResourceId, (LPSTR)Buffer, ccount)) 00033 { 00034 /* default device name */ 00035 strcpy((LPSTR)Buffer, (LPSTR)DefaultString); 00036 } 00037 } 00038 } 00039 00040 00041 BOOL 00042 DoDSoundCallback( 00043 LPDSENUMCALLBACKA lpDSEnumCallbackA, 00044 LPDSENUMCALLBACKW lpDSEnumCallbackW, 00045 LPGUID DeviceGuid, 00046 UINT ResourceId, 00047 LPWSTR ProductName, 00048 LPWSTR DriverName, 00049 LPVOID lpContext) 00050 { 00051 WCHAR Buffer[200] = {0}; 00052 char DriverNameA[200]; 00053 00054 static LPWSTR SoundDriverW = L"Primary Sound Driver"; 00055 static LPWSTR SoundDriverA = L"Primary Sound Driver"; 00056 00057 if (lpDSEnumCallbackW) 00058 { 00059 if (ResourceId) 00060 { 00061 /* load resource string */ 00062 Buffer[0] = 0; 00063 LoadResourceString(ResourceId, (LPVOID)Buffer, sizeof(Buffer)/sizeof(WCHAR), (LPVOID)SoundDriverW, TRUE); 00064 Buffer[(sizeof(Buffer)/sizeof(WCHAR))-1] = '\0'; 00065 } 00066 else 00067 { 00068 /* use passed string */ 00069 ASSERT(ProductName); 00070 wcscpy(Buffer, ProductName); 00071 } 00072 00073 /* perform callback */ 00074 return lpDSEnumCallbackW(DeviceGuid, Buffer, DriverName, lpContext); 00075 } 00076 else 00077 { 00078 if (ResourceId) 00079 { 00080 /* load resource string */ 00081 Buffer[0] = 0; 00082 LoadResourceString(ResourceId, (LPVOID)Buffer, sizeof(Buffer)/sizeof(char), (LPVOID)SoundDriverA, FALSE); 00083 Buffer[(sizeof(Buffer)/sizeof(WCHAR))-1] = 0; 00084 } 00085 else 00086 { 00087 /* use passed string */ 00088 Buffer[0] = 0; 00089 WideCharToMultiByte(CP_ACP, 0, ProductName, -1, (LPSTR)Buffer, sizeof(Buffer) / sizeof(char), NULL, NULL); 00090 Buffer[(sizeof(Buffer)/sizeof(WCHAR))-1] = 0; 00091 } 00092 00093 DriverNameA[0] = 0; 00094 if (ProductName) 00095 { 00096 WideCharToMultiByte(CP_ACP, 0, ProductName, -1, DriverNameA, sizeof(DriverNameA) / sizeof(char), NULL, NULL); 00097 DriverNameA[(sizeof(DriverNameA) / sizeof(char))-1] = 0; 00098 } 00099 00100 return lpDSEnumCallbackA(DeviceGuid, (LPSTR)Buffer, DriverNameA, lpContext); 00101 } 00102 } 00103 00104 00105 HRESULT 00106 DSoundEnumerate( 00107 LPDSENUMCALLBACKA lpDSEnumCallbackA, 00108 LPDSENUMCALLBACKW lpDSEnumCallbackW, 00109 LPVOID lpContext, 00110 BOOL bPlayback) 00111 { 00112 ULONG ResourceId; 00113 BOOL bResult; 00114 LPFILTERINFO CurInfo; 00115 WAVEOUTCAPSW WaveOutCaps; 00116 WAVEINCAPSW WaveInCaps; 00117 00118 if (!RootInfo) 00119 { 00120 EnumAudioDeviceInterfaces(&RootInfo); 00121 } 00122 00123 if (lpDSEnumCallbackA == NULL && lpDSEnumCallbackW == NULL) 00124 { 00125 DPRINT("No callback\n"); 00126 return DSERR_INVALIDPARAM; 00127 } 00128 00129 if (bPlayback) 00130 { 00131 /* use resource id of playback string */ 00132 ResourceId = IDS_PRIMARY_PLAYBACK_DEVICE; 00133 } 00134 else 00135 { 00136 /* use resource id of playback string */ 00137 ResourceId = IDS_PRIMARY_RECORD_DEVICE; 00138 } 00139 00140 if (RootInfo) 00141 { 00142 /* perform first callback */ 00143 bResult = DoDSoundCallback(lpDSEnumCallbackA, lpDSEnumCallbackW, NULL, ResourceId, NULL, L"", lpContext); 00144 if (!bResult) 00145 { 00146 /* callback asked as to stop */ 00147 return DS_OK; 00148 } 00149 00150 /* now iterate through all devices */ 00151 CurInfo = RootInfo; 00152 00153 do 00154 { 00155 if (bPlayback && !IsEqualGUID(&CurInfo->DeviceGuid[1], &GUID_NULL)) 00156 { 00157 RtlZeroMemory(&WaveOutCaps, sizeof(WAVEOUTCAPSW)); 00158 00159 /* sanity check */ 00160 ASSERT(CurInfo->MappedId[1] != ULONG_MAX); 00161 00162 /* get wave out caps */ 00163 waveOutGetDevCapsW((UINT_PTR)CurInfo->MappedId[1], &WaveOutCaps, sizeof(WAVEOUTCAPSW)); 00164 WaveOutCaps.szPname[MAXPNAMELEN-1] = L'\0'; 00165 00166 bResult = DoDSoundCallback(lpDSEnumCallbackA, lpDSEnumCallbackW, &CurInfo->DeviceGuid[1], 0, WaveOutCaps.szPname, L"" /* FIXME */, lpContext); 00167 if (!bResult) 00168 { 00169 /* callback asked as to stop */ 00170 return DS_OK; 00171 } 00172 } 00173 else if (!bPlayback && !IsEqualGUID(&CurInfo->DeviceGuid[0], &GUID_NULL)) 00174 { 00175 RtlZeroMemory(&WaveInCaps, sizeof(WAVEINCAPSW)); 00176 00177 /* sanity check */ 00178 ASSERT(CurInfo->MappedId[1] != ULONG_MAX); 00179 00180 /* get wave in caps */ 00181 waveInGetDevCapsW((UINT_PTR)CurInfo->MappedId[0], &WaveInCaps, sizeof(WAVEINCAPSW)); 00182 WaveInCaps.szPname[MAXPNAMELEN-1] = L'\0'; 00183 00184 bResult = DoDSoundCallback(lpDSEnumCallbackA, lpDSEnumCallbackW, &CurInfo->DeviceGuid[0], 0, WaveInCaps.szPname, L"" /* FIXME */, lpContext); 00185 if (!bResult) 00186 { 00187 /* callback asked as to stop */ 00188 return DS_OK; 00189 } 00190 } 00191 00192 /* move to next entry */ 00193 CurInfo = CurInfo->lpNext; 00194 }while(CurInfo); 00195 } 00196 return DS_OK; 00197 } 00198 00199 HRESULT 00200 WINAPI 00201 DirectSoundEnumerateA( 00202 LPDSENUMCALLBACKA lpDSEnumCallback, 00203 LPVOID lpContext) 00204 { 00205 return DSoundEnumerate(lpDSEnumCallback, NULL, lpContext, TRUE); 00206 } 00207 00208 HRESULT 00209 WINAPI 00210 DirectSoundEnumerateW( 00211 LPDSENUMCALLBACKW lpDSEnumCallback, 00212 LPVOID lpContext ) 00213 { 00214 return DSoundEnumerate(NULL, lpDSEnumCallback, lpContext, TRUE); 00215 } 00216 00217 HRESULT 00218 WINAPI 00219 DirectSoundCaptureEnumerateA( 00220 LPDSENUMCALLBACKA lpDSEnumCallback, 00221 LPVOID lpContext) 00222 { 00223 return DSoundEnumerate(lpDSEnumCallback, NULL, lpContext, FALSE); 00224 } 00225 00226 HRESULT 00227 WINAPI 00228 DirectSoundCaptureEnumerateW( 00229 LPDSENUMCALLBACKW lpDSEnumCallback, 00230 LPVOID lpContext) 00231 { 00232 return DSoundEnumerate(NULL, lpDSEnumCallback, lpContext, FALSE); 00233 } Generated on Sun May 27 2012 04:21:43 for ReactOS by
1.7.6.1
|