Here is some code. Note that I am not only querying/setting the default ampmix device but at the same time, also the default audio device. Strictly speaking that is not necessary but a sensible descriptive name is only given to the audio device (during installation) and not the ampmix device. I am going the extra mile to query the ampmix device from the audio device via the audio device's first connector. Again, that is not strictly necessary.
MRESULT EXPENTRY SettingsPageProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
CHAR retBuff[256];
CHAR ListBoxString[MAX_DEVICE_NAME+MAX_ALIAS_NAME+16];
MCI_SYSINFO_PARMS sysParms;
MCI_SYSINFO_DEFAULTDEVICE defDevice;
MCI_SYSINFO_QUERY_NAME devName;
MCI_SYSINFO_CONPARAMS wavConnectors;
ULONG rc;
switch(msg)
{
case WM_INITDLG:
{
ULONG numDevices=0;
CHAR *endPtr = NULL;
PDEVINFO pDevInfo = NULL;
ULONG i=0;
HWND hwndListBox = WinWindowFromID(hwnd,ID_LISTBOX);
memset(retBuff,0,sizeof(retBuff));
memset(&sysParms,0,sizeof(sysParms));
sysParms.usDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO;
sysParms.pszReturn = retBuff;
sysParms.ulRetSize = sizeof(retBuff)-1;
rc = mciSendCommand(0,MCI_SYSINFO, MCI_SYSINFO_QUANTITY | MCI_WAIT,&sysParms,0);
numDevices = strtoul(sysParms.pszReturn,&endPtr,10);
pDevInfo = (PDEVINFO)calloc(numDevices,sizeof(DEVINFO));
WinSetWindowPtr(hwnd,QWL_USER,pDevInfo);
if (!pDevInfo) {
return MRFROMLONG(FALSE);
} /* endif */
for (i=0;i<numDevices;i++) {
/*device numbers are 1-based (1: first device) */
memset(&sysParms,0,sizeof(sysParms));
sysParms.usDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO;
sysParms.ulNumber = i+1;
sysParms.pszReturn = retBuff;
sysParms.ulRetSize = sizeof(retBuff)-1;
rc = mciSendCommand(0,MCI_SYSINFO, MCI_SYSINFO_INSTALLNAME | MCI_WAIT,&sysParms,0);
memset(&sysParms,0,sizeof(&sysParms));
sysParms.pszReturn = retBuff;
sysParms.ulRetSize = sizeof(retBuff)-1;
sysParms.ulItem = MCI_SYSINFO_QUERY_NAMES;
sysParms.pSysInfoParm = &devName;
memset(&devName,0,sizeof(devName));
strcpy(devName.szInstallName,sysParms.pszReturn);
rc = mciSendCommand(0,MCI_SYSINFO,MCI_SYSINFO_ITEM | MCI_WAIT,&sysParms,0);
strcpy(pDevInfo[i].szWaveInstallName,devName.szInstallName);
strcpy(pDevInfo[i].szWaveAliasName,devName.szAliasName);
memset(&sysParms,0,sizeof(sysParms));
sysParms.pszReturn = retBuff;
sysParms.ulRetSize = sizeof(retBuff)-1;
sysParms.ulItem = MCI_SYSINFO_QUERY_CONNECTORS;
sysParms.pSysInfoParm = &wavConnectors;
memset(&wavConnectors,0,sizeof(wavConnectors));
strcpy(wavConnectors.szInstallName,sysParms.pszReturn);
rc = mciSendCommand(0,MCI_SYSINFO,MCI_SYSINFO_ITEM | MCI_WAIT,&sysParms,0);
if (MCI_WAVE_STREAM_CONNECTOR == wavConnectors.ConnectorList[0].usConnectType) {
memset(&sysParms,0,sizeof(sysParms));
sysParms.pszReturn = retBuff;
sysParms.ulRetSize = sizeof(retBuff)-1;
sysParms.ulItem = MCI_SYSINFO_QUERY_NAMES;
sysParms.pSysInfoParm = &devName;
memset(&devName,0,sizeof(devName));
strcpy(devName.szInstallName,wavConnectors.ConnectorList[0].szToInstallName);
rc = mciSendCommand(0,MCI_SYSINFO,MCI_SYSINFO_ITEM | MCI_WAIT,&sysParms,0);
strcpy(pDevInfo[i].szAmpInstallName,devName.szInstallName);
strcpy(pDevInfo[i].szAmpAliasName,devName.szAliasName);
} /* endif */
sprintf(ListBoxString,"%s (%s)",pDevInfo[i].szWaveAliasName,pDevInfo[i].szAmpAliasName);
WinSendMsg(hwndListBox,LM_INSERTITEM,MPFROMSHORT(i),MPFROMP(ListBoxString));
WinSendMsg(hwndListBox,LM_SETITEMHANDLE,MPFROMSHORT(i),MPFROMLONG((ULONG)(pDevInfo+i)));
memset(&sysParms,0,sizeof(sysParms));
sysParms.pszReturn = retBuff;
sysParms.ulRetSize = sizeof(retBuff)-1;
sysParms.ulItem = MCI_SYSINFO_QUERY_DEFAULT;
sysParms.pSysInfoParm = &defDevice;
memset(&defDevice,0,sizeof(defDevice));
defDevice.usDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO;
rc = mciSendCommand(0,MCI_SYSINFO,MCI_SYSINFO_ITEM | MCI_WAIT,&sysParms,0);
if (0 == strcmp(defDevice.szInstallName,pDevInfo[i].szWaveInstallName)) {
WinSendMsg(hwndListBox,LM_SELECTITEM,MPFROMSHORT(i),MPFROMSHORT(TRUE));
}
} /* endfor */
return MRFROMLONG(TRUE);
}
break;
case WM_CONTROL:
{
if (LN_ENTER == SHORT2FROMMP(mp1)) {
HWND hwndListBox = HWNDFROMMP(mp2);
SHORT i = SHORT1FROMMR(WinSendMsg(hwndListBox,LM_QUERYSELECTION,MPFROMSHORT(0),MPVOID));
PDEVINFO pDevInfo = (PDEVINFO)PVOIDFROMMR(WinSendMsg(hwndListBox,LM_QUERYITEMHANDLE,MPFROMSHORT(i),MPVOID));
if (!pDevInfo) {
return MRFROMLONG(0);
} /* endif */
memset(&sysParms,0,sizeof(sysParms));
sysParms.pszReturn = retBuff;
sysParms.ulRetSize = sizeof(retBuff)-1;
sysParms.ulItem = MCI_SYSINFO_SET_DEFAULT;
sysParms.pSysInfoParm = &defDevice;
strcpy(defDevice.szInstallName,pDevInfo->szWaveInstallName);
defDevice.usDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO;
rc = mciSendCommand(0,MCI_SYSINFO,MCI_SYSINFO_ITEM | MCI_WAIT,&sysParms,0);
memset(&sysParms,0,sizeof(sysParms));
sysParms.pszReturn = retBuff;
sysParms.ulRetSize = sizeof(retBuff)-1;
sysParms.ulItem = MCI_SYSINFO_SET_DEFAULT;
sysParms.pSysInfoParm = &defDevice;
strcpy(defDevice.szInstallName,pDevInfo->szAmpInstallName);
defDevice.usDeviceType = MCI_DEVTYPE_AUDIO_AMPMIX;
rc = mciSendCommand(0,MCI_SYSINFO,MCI_SYSINFO_ITEM | MCI_WAIT,&sysParms,0);
}
return MRFROMLONG(0);
}
break;