Microsoft DirectX 8.1 (C++)

Enumeration of Sound Devices

For an application that is simply going to play sounds through the user's preferred playback device, you don't need to enumerate the available devices. When you create the DirectSound object by calling the DirectSoundCreate8 function, you can specify a default device. For more information, see Creating the DirectSound Object.

If you are looking for a particular kind of device, wish to offer the user a choice of devices, or need to work with two or more devices, you must enumerate the devices available on the system.

Enumeration serves three purposes:

To enumerate devices, you must first set up a callback function that will be called each time DirectSound finds a device. You can do anything you want within this function, and you can give it any name, but you must declare it in the same form as the DSEnumCallback prototype. The callback function must return TRUE if enumeration is to continue, or FALSE otherwise—for instance, after finding a device with the capabilities you need.

The following callback function adds information about each enumerated device to a combo box. Values for the first three parameters are supplied by the device driver. The fourth parameter is passed on from the DirectSoundEnumerate function.

BOOL CALLBACK DSEnumProc(LPGUID lpGUID, 
         LPCTSTR lpszDesc,
         LPCTSTR lpszDrvName, 
         LPVOID lpContext )
{
  HWND hCombo = *(HWND *)lpContext;
  LPGUID lpTemp = NULL;
 
  if ( lpGUID != NULL )
  {
    if (( lpTemp = malloc( sizeof(GUID))) == NULL )
    return( TRUE );
 
    memcpy( lpTemp, lpGUID, sizeof(GUID));
  }
 
  ComboBox_AddString( hCombo, lpszDesc );
  ComboBox_SetItemData( hCombo,
      ComboBox_FindString( hCombo, 0, lpszDesc ),
      lpTemp );
  return( TRUE );
}
 

The enumeration is set in motion when the dialog containing the combo box is initialized:

if FAILED(DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,
    (VOID*)&hCombo))
{
  EndDialog( hDlg, TRUE );
  return( TRUE );
}
 

In this case, the address of the combo box handle is passed into DirectSoundEnumerate, which in turn passes it to the callback function. This parameter can be any 32-bit value that you want to have access to within the callback.

Note   The first device enumerated is always called the Primary Sound Driver, and the lpGUID parameter of the callback is NULL. This device represents the preferred playback device set by the user in Control Panel. It is enumerated separately to make it easy for the application to add "Primary Sound Driver" to a list when presenting the user with a choice of devices. The primary device is also enumerated with its proper name and GUID.