ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

enum.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.