AAWAVDEV.C

//==========================================================================; 
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright 1992 - 1998 Microsoft Corporation. All Rights Reserved.
//
//--------------------------------------------------------------------------;
//
// aawavdev.c
//
// Description:
// Get and display information on the wave devices installed in the
// system.
//
//
//==========================================================================;

#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include <memory.h>

#include <mmreg.h>
#include <msacm.h>

#include "appport.h"
#include "acmapp.h"

#include "debug.h"


//
// WAVE[IN|OUT]CAPS
//
//
//
PTSTR gaszWaveInOutCapsFormats[32] =
{
TEXT("8M11"), // Bit 0 WAVE_FORMAT_1M08
TEXT("8S11"), // Bit 1 WAVE_FORMAT_1S08
TEXT("16M11"), // Bit 2 WAVE_FORMAT_1M16
TEXT("16S11"), // Bit 3 WAVE_FORMAT_1S16
TEXT("8M22"), // Bit 4 WAVE_FORMAT_2M08
TEXT("8S22"), // Bit 5 WAVE_FORMAT_2S08
TEXT("16M22"), // Bit 6 WAVE_FORMAT_2M16
TEXT("16S22"), // Bit 7 WAVE_FORMAT_2S16
TEXT("8M44"), // Bit 8 WAVE_FORMAT_4M08
TEXT("8S44"), // Bit 9 WAVE_FORMAT_4S08
TEXT("16M44"), // Bit 10 WAVE_FORMAT_4M16
TEXT("16S44"), // Bit 11 WAVE_FORMAT_4S16
NULL, // Bit 12
NULL, // Bit 13
NULL, // Bit 14
NULL, // Bit 15
NULL, // Bit 16
NULL, // Bit 17
NULL, // Bit 18
NULL, // Bit 19
NULL, // Bit 20
NULL, // Bit 21
NULL, // Bit 22
NULL, // Bit 23
NULL, // Bit 24
NULL, // Bit 25
NULL, // Bit 26
NULL, // Bit 27
NULL, // Bit 28
NULL, // Bit 29
NULL, // Bit 30
NULL // Bit 31
};

PTSTR gaszWaveOutCapsSupport[32] =
{
TEXT("Pitch"), // Bit 0 WAVECAPS_PITCH
TEXT("Playback Rate"), // Bit 1 WAVECAPS_PLAYBACKRATE
TEXT("Volume"), // Bit 2 WAVECAPS_VOLUME
TEXT("L/R Volume"), // Bit 3 WAVECAPS_LRVOLUME
TEXT("Sync"), // Bit 4 WAVECAPS_SYNC
NULL, // Bit 5
NULL, // Bit 6
NULL, // Bit 7
NULL, // Bit 8
NULL, // Bit 9
NULL, // Bit 10
NULL, // Bit 11
NULL, // Bit 12
NULL, // Bit 13
NULL, // Bit 14
NULL, // Bit 15
NULL, // Bit 16
NULL, // Bit 17
NULL, // Bit 18
NULL, // Bit 19
NULL, // Bit 20
NULL, // Bit 21
NULL, // Bit 22
NULL, // Bit 23
NULL, // Bit 24
NULL, // Bit 25
NULL, // Bit 26
NULL, // Bit 27
NULL, // Bit 28
NULL, // Bit 29
NULL, // Bit 30
NULL // Bit 31
};




//==========================================================================;
//
//
//
//
//==========================================================================;

//--------------------------------------------------------------------------;
//
// MMRESULT AcmAppWaveInGetDevCaps
//
// Description:
//
//
// Arguments:
// UINT uDevId:
//
// LPWAVEINCAPS pwic:
//
// Return (MMRESULT):
//
//
//--------------------------------------------------------------------------;

MMRESULT FNLOCAL AcmAppWaveInGetDevCaps
(
UINT uDevId,
LPWAVEINCAPS pwic
)
{
MMRESULT mmr;

//
//
//
mmr = waveInGetDevCaps(uDevId, pwic, sizeof(*pwic));
if (MMSYSERR_NOERROR == mmr)
{
//
// because some people shipped drivers without testing.
//
pwic->szPname[SIZEOF(pwic->szPname) - 1] = '\0';
}
else
{
_fmemset(pwic, 0, sizeof(*pwic));

if (MMSYSERR_BADDEVICEID == mmr)
{
return (mmr);
}

if (WAVE_MAPPER == uDevId)
{
lstrcpy(pwic->szPname, TEXT("Default Wave Input Mapper"));
}
else
{
wsprintf(pwic->szPname, TEXT("Bad Wave Input Device %u"), uDevId);
}
}

return (MMSYSERR_NOERROR);
} // AcmAppWaveInGetDevCaps()


//--------------------------------------------------------------------------;
//
// MMRESULT AcmAppWaveOutGetDevCaps
//
// Description:
//
//
// Arguments:
// UINT uDevId:
//
// LPWAVEOUTCAPS pwoc:
//
// Return (MMRESULT):
//
//
//--------------------------------------------------------------------------;

MMRESULT FNLOCAL AcmAppWaveOutGetDevCaps
(
UINT uDevId,
LPWAVEOUTCAPS pwoc
)
{
MMRESULT mmr;

//
//
//
mmr = waveOutGetDevCaps(uDevId, pwoc, sizeof(*pwoc));
if (MMSYSERR_NOERROR == mmr)
{
//
// because some people shipped drivers without testing.
//
pwoc->szPname[SIZEOF(pwoc->szPname) - 1] = '\0';
}
else
{
_fmemset(pwoc, 0, sizeof(*pwoc));

if (MMSYSERR_BADDEVICEID == mmr)
{
return (mmr);
}

if (WAVE_MAPPER == uDevId)
{
lstrcpy(pwoc->szPname, TEXT("Default Wave Output Mapper"));
}
else
{
wsprintf(pwoc->szPname, TEXT("Bad Wave Output Device %u"), uDevId);
}
}

return (MMSYSERR_NOERROR);
} // AcmAppWaveOutGetDevCaps()


//--------------------------------------------------------------------------;
//
// BOOL AcmAppDisplayWaveInDevCaps
//
// Description:
//
//
// Arguments:
// HWND hedit:
//
// UINT uDevId:
//
// LPWAVEINCAPS pwic:
//
// Return (BOOL):
//
//
//--------------------------------------------------------------------------;

BOOL FNLOCAL AcmAppDisplayWaveInDevCaps
(
HWND hedit,
UINT uDevId,
LPWAVEINCAPS pwic,
LPWAVEFORMATEX pwfx
)
{
static TCHAR szDisplayTitle[] = TEXT("[Wave Input Device Capabilities]\r\n");
TCHAR ach[40];
PTSTR psz;
UINT u;
UINT v;
DWORD dw;

SetWindowRedraw(hedit, FALSE);

MEditPrintF(hedit, NULL);
MEditPrintF(hedit, szDisplayTitle);

//
//
//
if (NULL != pwfx)
{
TCHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
TCHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS];
MMRESULT mmr;
HWAVEIN hwi;

//
//
//
AcmAppGetFormatDescription(pwfx, szFormatTag, szFormat);
MEditPrintF(hedit, TEXT("%17s: %s"), (LPTSTR)TEXT("Format"), (LPTSTR)szFormatTag);
MEditPrintF(hedit, TEXT("%17s: %s"), (LPTSTR)TEXT("Attributes"), (LPTSTR)szFormat);


//
//
//
MEditPrintF(hedit, TEXT("~%17s: "), (LPTSTR)TEXT("Recordable"));
mmr = waveInOpen(&hwi, uDevId,
#if (WINVER < 0x0400)
(LPWAVEFORMAT)pwfx,
#else
pwfx,
#endif
0L, 0L, 0L);

if (MMSYSERR_NOERROR == mmr)
{
MEditPrintF(hedit, gszYes);
waveInClose(hwi);
hwi = NULL;
}
else
{
AcmAppGetErrorString(mmr, ach);
MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr);
}


//
//
//
MEditPrintF(hedit, TEXT("~%17s: "), (LPTSTR)TEXT("(Query)"));
mmr = waveInOpen(NULL, uDevId,
#if (WINVER < 0x0400)
(LPWAVEFORMAT)pwfx,
#else
pwfx,
#endif
0L, 0L, WAVE_FORMAT_QUERY);

if (MMSYSERR_NOERROR == mmr)
{
MEditPrintF(hedit, gszYes);
}
else
{
AcmAppGetErrorString(mmr, ach);
MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr);
}


MEditPrintF(hedit, gszNull);
}

//
//
//
MEditPrintF(hedit, TEXT("%17s: %d"), (LPTSTR)TEXT("Device Id"), uDevId);

MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Manufacturer Id"), pwic->wMid);
MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Product Id"), pwic->wPid);
MEditPrintF(hedit, TEXT("%17s: %u.%.02u"), (LPTSTR)TEXT("Driver Version"),
(pwic->vDriverVersion >> 8),
(pwic->vDriverVersion & 0x00FF));
MEditPrintF(hedit, TEXT("%17s: '%s'"), (LPTSTR)TEXT("Device Name"), (LPTSTR)pwic->szPname);
MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Channels"), pwic->wChannels);


//
//
//
//
MEditPrintF(hedit, TEXT("%17s: %.08lXh"), (LPTSTR)TEXT("Standard Formats"), pwic->dwFormats);
for (v = u = 0, dw = pwic->dwFormats; (0L != dw); u++)
{
if ((BYTE)dw & (BYTE)1)
{
psz = gaszWaveInOutCapsFormats[u];
if (NULL == psz)
{
wsprintf(ach, TEXT("Unknown%u"), u);
psz = ach;
}

if (0 == (v % 4))
{
if (v != 0)
{
MEditPrintF(hedit, gszNull);
}
MEditPrintF(hedit, TEXT("~%19s%s"), (LPTSTR)gszNull, (LPTSTR)psz);
}
else
{
MEditPrintF(hedit, TEXT("~, %s"), (LPTSTR)psz);
}

v++;
}

dw >>= 1;
}
MEditPrintF(hedit, gszNull);

SetWindowRedraw(hedit, TRUE);

return (TRUE);
} // AcmAppDisplayWaveInDevCaps()


//--------------------------------------------------------------------------;
//
// BOOL AcmAppDisplayWaveOutDevCaps
//
// Description:
//
//
// Arguments:
// HWND hedit:
//
// UINT uDevId:
//
// LPWAVEOUTCAPS pwoc:
//
// Return (BOOL):
//
//
//--------------------------------------------------------------------------;

BOOL FNLOCAL AcmAppDisplayWaveOutDevCaps
(
HWND hedit,
UINT uDevId,
LPWAVEOUTCAPS pwoc,
LPWAVEFORMATEX pwfx
)
{
static TCHAR szDisplayTitle[] = TEXT("[Wave Output Device Capabilities]\r\n");
TCHAR ach[40];
PTSTR psz;
UINT u;
UINT v;
DWORD dw;

SetWindowRedraw(hedit, FALSE);

//
//
//
MEditPrintF(hedit, NULL);
MEditPrintF(hedit, szDisplayTitle);



//
//
//
if (NULL != pwfx)
{
TCHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
TCHAR szFormat[ACMFORMATDETAILS_FORMAT_CHARS];
MMRESULT mmr;
HWAVEOUT hwo;
DWORD fdwOpen;

fdwOpen = (0 != (WAVECAPS_SYNC & pwoc->dwSupport)) ? 0L : WAVE_ALLOWSYNC;

//
//
//
AcmAppGetFormatDescription(pwfx, szFormatTag, szFormat);
MEditPrintF(hedit, TEXT("%17s: %s"), (LPTSTR)TEXT("Format"), (LPTSTR)szFormatTag);
MEditPrintF(hedit, TEXT("%17s: %s"), (LPTSTR)TEXT("Attributes"), (LPTSTR)szFormat);


//
//
//
MEditPrintF(hedit, TEXT("~%17s: "), (LPTSTR)TEXT("Playable"));
mmr = waveOutOpen(&hwo, uDevId,
#if (WINVER < 0x0400)
(LPWAVEFORMAT)pwfx,
#else
pwfx,
#endif
0L, 0L, fdwOpen);

if (MMSYSERR_NOERROR == mmr)
{
MEditPrintF(hedit, gszYes);
waveOutClose(hwo);
hwo = NULL;
}
else
{
AcmAppGetErrorString(mmr, ach);
MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr);
}

//
//
//
MEditPrintF(hedit, TEXT("~%17s: "), (LPTSTR)TEXT("(Query)"));
mmr = waveOutOpen(NULL, uDevId,
#if (WINVER < 0x0400)
(LPWAVEFORMAT)pwfx,
#else
pwfx,
#endif
0L, 0L, fdwOpen | WAVE_FORMAT_QUERY);

if (MMSYSERR_NOERROR == mmr)
{
MEditPrintF(hedit, gszYes);
}
else
{
AcmAppGetErrorString(mmr, ach);
MEditPrintF(hedit, TEXT("%s, %s (%u)"), (LPTSTR)gszNo, (LPSTR)ach, mmr);
}

MEditPrintF(hedit, gszNull);
}



MEditPrintF(hedit, TEXT("%17s: %d"), (LPTSTR)TEXT("Device Id"), uDevId);

MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Manufacturer Id"), pwoc->wMid);
MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Product Id"), pwoc->wPid);
MEditPrintF(hedit, TEXT("%17s: %u.%.02u"), (LPTSTR)TEXT("Driver Version"),
(pwoc->vDriverVersion >> 8),
(pwoc->vDriverVersion & 0x00FF));
MEditPrintF(hedit, TEXT("%17s: '%s'"), (LPTSTR)TEXT("Device Name"), (LPTSTR)pwoc->szPname);
MEditPrintF(hedit, TEXT("%17s: %u"), (LPTSTR)TEXT("Channels"), pwoc->wChannels);



//
//
//
//
MEditPrintF(hedit, TEXT("%17s: %.08lXh"), (LPTSTR)TEXT("Standard Formats"), pwoc->dwFormats);
for (v = u = 0, dw = pwoc->dwFormats; (0L != dw); u++)
{
if ((BYTE)dw & (BYTE)1)
{
psz = gaszWaveInOutCapsFormats[u];
if (NULL == psz)
{
wsprintf(ach, TEXT("Unknown%u"), u);
psz = ach;
}

if (0 == (v % 4))
{
if (v != 0)
{
MEditPrintF(hedit, gszNull);
}
MEditPrintF(hedit, TEXT("~%19s%s"), (LPTSTR)gszNull, (LPTSTR)psz);
}
else
{
MEditPrintF(hedit, TEXT("~, %s"), (LPTSTR)psz);
}

v++;
}

dw >>= 1;
}
MEditPrintF(hedit, gszNull);

//
//
//
//
MEditPrintF(hedit, TEXT("%17s: %.08lXh"), (LPTSTR)TEXT("Standard Support"), pwoc->dwSupport);
for (v = u = 0, dw = pwoc->dwSupport; dw; u++)
{
if ((BYTE)dw & (BYTE)1)
{
psz = gaszWaveOutCapsSupport[u];
if (NULL == psz)
{
wsprintf(ach, TEXT("Unknown%u"), u);
psz = ach;
}

if (0 == (v % 4))
{
if (v != 0)
{
MEditPrintF(hedit, gszNull);
}
MEditPrintF(hedit, TEXT("~%19s%s"), (LPTSTR)gszNull, (LPTSTR)psz);
}
else
{
MEditPrintF(hedit, TEXT("~, %s"), (LPTSTR)psz);
}

v++;
}

dw >>= 1;
}
MEditPrintF(hedit, gszNull);

SetWindowRedraw(hedit, TRUE);

return (TRUE);
} // AcmAppDisplayWaveOutDevCaps()


//--------------------------------------------------------------------------;
//
// BOOL AcmAppWaveDeviceDlgProc
//
// Description:
//
//
// Arguments:
// HWND hwnd:
//
// UINT uMsg:
//
// WPARAM wParam:
//
// LPARAM lParam:
//
// Return (BOOL):
//
//
//--------------------------------------------------------------------------;

BOOL FNEXPORT AcmAppWaveDeviceDlgProc
(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
LONG lDevice;
BOOL fInput;
UINT uDevId;

UINT cWaveDevs;
UINT u;
UINT uId;
UINT uCmd;
HWND hcb;
HWND hedit;
HFONT hfont;

WAVEINCAPS wic;
WAVEOUTCAPS woc;

lDevice = GetWindowLong(hwnd, DWL_USER);
uDevId = (UINT)(int)(short)LOWORD(lDevice);
fInput = (BOOL)HIWORD(lDevice);

//
//
//
switch (uMsg)
{
case WM_INITDIALOG:
// hfont = GetStockFont(ANSI_FIXED_FONT);
hfont = ghfontApp;
hedit = GetDlgItem(hwnd, IDD_AAWAVEDEVICE_EDIT_CAPABILITIES);
SetWindowFont(hedit, hfont, FALSE);

uDevId = (UINT)(int)(short)LOWORD(lParam);
fInput = (BOOL)HIWORD(lParam);
SetWindowLong(hwnd, DWL_USER, lParam);


//
//
//
hcb = GetDlgItem(hwnd, IDD_AAWAVEDEVICE_COMBO_DEVICE);
SetWindowFont(hcb, hfont, FALSE);

if (fInput)
cWaveDevs = waveInGetNumDevs() + 1;
else
cWaveDevs = waveOutGetNumDevs() + 1;

for (u = (UINT)WAVE_MAPPER; (0 != cWaveDevs); u++, cWaveDevs--)
{
if (fInput)
{
AcmAppWaveInGetDevCaps(u, &wic);
ComboBox_AddString(hcb, wic.szPname);
}
else
{
AcmAppWaveOutGetDevCaps(u, &woc);
ComboBox_AddString(hcb, woc.szPname);
}

if (uDevId == u)
{
hedit = GetDlgItem(hwnd, IDD_AAWAVEDEVICE_EDIT_CAPABILITIES);

if (fInput)
AcmAppDisplayWaveInDevCaps(hedit, uDevId, &wic, gaafd.pwfx);
else
AcmAppDisplayWaveOutDevCaps(hedit, uDevId, &woc, gaafd.pwfx);
}
}

ComboBox_SetCurSel(hcb, uDevId + 1);
return (TRUE);


case WM_COMMAND:
uId = GET_WM_COMMAND_ID(wParam, lParam);

switch (uId)
{
case IDOK:
hcb = GetDlgItem(hwnd, IDD_AAWAVEDEVICE_COMBO_DEVICE);
uDevId = ComboBox_GetCurSel(hcb);
if (CB_ERR != uDevId)
{
EndDialog(hwnd, uDevId - 1);
break;
}

// -- fall through -- //

case IDCANCEL:
EndDialog(hwnd, uDevId);
break;


case IDD_AAWAVEDEVICE_COMBO_DEVICE:
uCmd = GET_WM_COMMAND_CMD(wParam, lParam);
hcb = GET_WM_COMMAND_HWND(wParam, lParam);
switch (uCmd)
{
case CBN_SELCHANGE:
uDevId = ComboBox_GetCurSel(hcb);
if (CB_ERR == uDevId)
break;

uDevId--;

hedit = GetDlgItem(hwnd, IDD_AAWAVEDEVICE_EDIT_CAPABILITIES);
if (fInput)
{
AcmAppWaveInGetDevCaps(uDevId, &wic);
AcmAppDisplayWaveInDevCaps(hedit, uDevId, &wic, gaafd.pwfx);
}
else
{
AcmAppWaveOutGetDevCaps(uDevId, &woc);
AcmAppDisplayWaveOutDevCaps(hedit, uDevId, &woc, gaafd.pwfx);
}
break;
}
}
return (TRUE);
}

return (FALSE);
} // AcmAppWaveDeviceDlgProc()