MALINES.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 1993 - 1998 Microsoft Corporation. All Rights Reserved.
//
//--------------------------------------------------------------------------;
//
// malines.c
//
// Description:
//
//
// History:
// 9/21/93
//
//==========================================================================;

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

#include "mixapp.h"

#include "debug.h"


TCHAR gszLineFormatTitle[] = TEXT("Type\t3!Component\t10!Line ID\t6!Flags\t6!Ctrls\t3!Conns\t3!Name");
TCHAR gszLineFormatList[] = TEXT("%-s%c\t%-s\t%.08lXh\t%.08lXh\t%lu\t%lu\t%-s");


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

//--------------------------------------------------------------------------;
//
// BOOL MixAppGetComponentName
//
// Description:
//
//
// Arguments:
// LPMIXERLINE pmxl:
//
// LPTSTR szComponent:
//
// Return (BOOL):
//
// History:
// 08/18/93
//
//--------------------------------------------------------------------------;

BOOL FNLOCAL MixAppGetComponentName
(
LPMIXERLINE pmxl,
LPTSTR szComponent
)
{
//
//
//
if (0 == (MIXERLINE_LINEF_SOURCE & pmxl->fdwLine))
{
switch (pmxl->dwComponentType)
{
case MIXERLINE_COMPONENTTYPE_DST_UNDEFINED:
lstrcpy(szComponent, "Undefined");
break;

case MIXERLINE_COMPONENTTYPE_DST_DIGITAL:
lstrcpy(szComponent, "Digital");
break;

case MIXERLINE_COMPONENTTYPE_DST_LINE:
lstrcpy(szComponent, "Line Level");
break;

case MIXERLINE_COMPONENTTYPE_DST_MONITOR:
lstrcpy(szComponent, "Monitor");
break;

case MIXERLINE_COMPONENTTYPE_DST_SPEAKERS:
lstrcpy(szComponent, "Speakers");
break;

case MIXERLINE_COMPONENTTYPE_DST_HEADPHONES:
lstrcpy(szComponent, "Headphones");
break;

case MIXERLINE_COMPONENTTYPE_DST_TELEPHONE:
lstrcpy(szComponent, "Telephone");
break;

case MIXERLINE_COMPONENTTYPE_DST_WAVEIN:
lstrcpy(szComponent, "Wave Input");
break;

case MIXERLINE_COMPONENTTYPE_DST_VOICEIN:
lstrcpy(szComponent, "Voice Recognition");
break;

default:
lstrcpy(szComponent, "NOT VALID");
break;
}
}
else
{
switch (pmxl->dwComponentType)
{
case MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED:
lstrcpy(szComponent, "Undefined");
break;

case MIXERLINE_COMPONENTTYPE_SRC_DIGITAL:
lstrcpy(szComponent, "Digital");
break;

case MIXERLINE_COMPONENTTYPE_SRC_LINE:
lstrcpy(szComponent, "Line Level");
break;

case MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE:
lstrcpy(szComponent, "Microphone");
break;

case MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER:
lstrcpy(szComponent, "Synthesizer");
break;

case MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC:
lstrcpy(szComponent, "Compact Disc");
break;

case MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE:
lstrcpy(szComponent, "Telephone");
break;

case MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER:
lstrcpy(szComponent, "PC Speaker");
break;

case MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT:
lstrcpy(szComponent, "Wave Out");
break;

case MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY:
lstrcpy(szComponent, "Auxiliary");
break;

case MIXERLINE_COMPONENTTYPE_SRC_ANALOG:
lstrcpy(szComponent, "Analog");
break;

default:
lstrcpy(szComponent, "NOT VALID");
break;
}
}

return (TRUE);
} // MixAppGetComponentName()


//--------------------------------------------------------------------------;
//
// BOOL MixAppDlgProcLineInfo
//
// Description:
// This dialog procedure is used to display driver capabilities.
//
// Arguments:
// HWND hwnd: Handle to window.
//
// UINT uMsg: Message being sent to the window.
//
// WPARAM wParam: Specific argument to message.
//
// LPARAM lParam: Specific argument to message.
//
// Return (BOOL):
// The return value is specific to the message that was received. For
// the most part, it is FALSE if this dialog procedure does not handle
// a message.
//
// History:
// 1/ 2/93
//
//--------------------------------------------------------------------------;

BOOL CALLBACK MixAppDlgProcLineInfo
(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hedit;
UINT u;
MIXERLINE mxl;
MMRESULT mmr;
TCHAR ach[64];

switch (uMsg)
{
case WM_INITDIALOG:
hedit = GetDlgItem(hwnd, IDD_LINEINFO_EDIT_INFO);
SetWindowFont(hedit, GetStockFont(SYSTEM_FIXED_FONT), FALSE);

//
//
//
//
mxl.cbStruct = sizeof(mxl);
mxl.dwLineID = lParam;

mmr = mixerGetLineInfo((HMIXEROBJ)ghmx, &mxl, MIXER_GETLINEINFOF_LINEID);
if (MMSYSERR_NOERROR != mmr)
{
AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
"mixerGetLineInfo(lineid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
lParam, ghmx, mmr);
}
else
{
static TCHAR szDisplayTitle[] = TEXT("[Line Info]\r\n");

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

MEditPrintF(hedit, "%25s: %.04Xh", (LPTSTR)"Mixer Handle", ghmx);

//
//
//
MEditPrintF(hedit, "%25s: %lu bytes (requested %lu)", (LPTSTR)"Size of Line Info", mxl.cbStruct, (DWORD)sizeof(mxl));
MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Destination", mxl.dwDestination);
MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Source", mxl.dwSource);
MEditPrintF(hedit, "%25s: %.08lXh", (LPTSTR)"Line ID", mxl.dwLineID);
MEditPrintF(hedit, "~%25s: %.08lXh", (LPTSTR)"Line Flags", mxl.fdwLine);

if (MIXERLINE_LINEF_SOURCE & mxl.fdwLine)
MEditPrintF(hedit, "~, source");
else
MEditPrintF(hedit, "~, destination");

if (MIXERLINE_LINEF_DISCONNECTED & mxl.fdwLine)
MEditPrintF(hedit, "~, disconnected");

if (MIXERLINE_LINEF_ACTIVE & mxl.fdwLine)
MEditPrintF(hedit, "~, active");

if (~(MIXERLINE_LINEF_SOURCE | MIXERLINE_LINEF_DISCONNECTED | MIXERLINE_LINEF_ACTIVE) & mxl.fdwLine)
MEditPrintF(hedit, "~, *INVALID FLAGS*");

MEditPrintF(hedit, "");
MEditPrintF(hedit, "%25s: %.08lXh", (LPTSTR)"Driver User DWord", mxl.dwUser);

MixAppGetComponentName(&mxl, ach);
MEditPrintF(hedit, "%25s: %lu, (%s)", (LPTSTR)"Component Type", mxl.dwComponentType, (LPTSTR)ach);
MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Num Channels", mxl.cChannels);
MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Num Connections", mxl.cConnections);
MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Num Controls", mxl.cControls);
MEditPrintF(hedit, "%25s: '%s'", (LPTSTR)"Short Name", (LPTSTR)mxl.szShortName);
MEditPrintF(hedit, "%25s: '%s'", (LPTSTR)"Name", (LPTSTR)mxl.szName);
MEditPrintF(hedit, "\r\n%25s: %lu", (LPTSTR)"Target Type", mxl.Target.dwType);
MEditPrintF(hedit, "%25s: %lu", (LPTSTR)"Device ID", mxl.Target.dwDeviceID);
MEditPrintF(hedit, "%25s: %u", (LPTSTR)"Manufacturer ID", mxl.Target.wMid);
MEditPrintF(hedit, "%25s: %u", (LPTSTR)"Product ID", mxl.Target.wPid);
MEditPrintF(hedit, "%25s: %u.%.02u", (LPTSTR)"Version",
mxl.Target.vDriverVersion >> 8,
mxl.Target.vDriverVersion & 0x00FF);
MEditPrintF(hedit, "%25s: '%s'", (LPTSTR)"Product Name", (LPTSTR)mxl.Target.szPname);
}

//
// return nonzero to set the input focus to the control
// identified by the (hwndFocus = (HWND)wParam) argument.
// a zero return tells the dialog manager that this function
// has set the focus using SetFocus.
//
return (TRUE);

case WM_COMMAND:
u = GET_WM_COMMAND_ID(wParam, lParam);
if ((IDOK == u) || (IDCANCEL == u))
{
EndDialog(hwnd, (IDOK == u));
}
break;
}

return (FALSE);
} // MixAppDlgProcLineInfo()


//--------------------------------------------------------------------------;
//
// BOOL MixAppRefreshLineList
//
// Description:
//
//
// Arguments:
// HWND hwnd: Handle of main window.
//
// Return (BOOL):
//
// History:
// 05/16/93
//
//--------------------------------------------------------------------------;

BOOL FNGLOBAL MixAppRefreshLineList
(
HWND hwnd,
PTABBEDLISTBOX ptlb
)
{
static TCHAR szLineTypeDst[] = TEXT("DST");
static TCHAR szLineTypeSrc[] = TEXT(" src");

MMRESULT mmr;
UINT u;
UINT v;
UINT cConnections;
MIXERLINE mxl;
TCHAR ach[128];
TCHAR szComponent[64];
int nIndex;
MIXERCAPS mxcaps;


//
//
//
SetWindowRedraw(ptlb->hlb, FALSE);
ListBox_ResetContent(ptlb->hlb);


if (0 != (APP_OPTF_DEBUGLOG & gfuAppOptions))
MixAppDebugLog(NULL);


//
//
//
//
mmr = mixerGetDevCaps((UINT)ghmx, &mxcaps, sizeof(mxcaps));
if (MMSYSERR_NOERROR != mmr)
{
AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
"mixerGetDevCaps() failed on hmx=%.04Xh, mmr=%u!",
ghmx, mmr);

mxcaps.cDestinations = 0;
}

for (u = 0; u < mxcaps.cDestinations; u++)
{
mxl.cbStruct = sizeof(mxl);
mxl.dwDestination = u;

mmr = mixerGetLineInfo((HMIXEROBJ)ghmx, &mxl, MIXER_GETLINEINFOF_DESTINATION);
if (MMSYSERR_NOERROR != mmr)
{
AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
"mixerGetLineInfo(dst=%u) failed on hmx=%.04Xh, mmr=%u!",
u, ghmx, mmr);
continue;
}

MixAppGetComponentName(&mxl, szComponent);

//
//
//
wsprintf(ach, gszLineFormatList,
(LPSTR)szLineTypeDst,
(MIXERLINE_LINEF_ACTIVE & mxl.fdwLine) ? '*' : ' ',
(LPTSTR)szComponent,
mxl.dwLineID,
mxl.fdwLine,
mxl.cControls,
mxl.cConnections,
(LPSTR)mxl.szName);

if (0 != (APP_OPTF_DEBUGLOG & gfuAppOptions))
{
MixAppDebugLog(ach);
MixAppDebugLog(gszCRLF);
}

nIndex = ListBox_AddString(ptlb->hlb, ach);
ListBox_SetItemData(ptlb->hlb, nIndex, mxl.dwLineID);

cConnections = (UINT)mxl.cConnections;
for (v = 0; v < cConnections; v++)
{
mxl.cbStruct = sizeof(mxl);
mxl.dwDestination = u;
mxl.dwSource = v;

mmr = mixerGetLineInfo((HMIXEROBJ)ghmx, &mxl, MIXER_GETLINEINFOF_SOURCE);
if (MMSYSERR_NOERROR != mmr)
{
AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
"mixerGetLineInfo(src=%u) failed on hmx=%.04Xh, mmr=%u!",
v, ghmx, mmr);
continue;
}


MixAppGetComponentName(&mxl, szComponent);


//
//
//
wsprintf(ach, gszLineFormatList,
(LPSTR)szLineTypeSrc,
(MIXERLINE_LINEF_ACTIVE & mxl.fdwLine) ? '*' : ' ',
(LPTSTR)szComponent,
mxl.dwLineID,
mxl.fdwLine,
mxl.cControls,
mxl.cConnections,
(LPSTR)mxl.szName);

if (0 != (APP_OPTF_DEBUGLOG & gfuAppOptions))
{
MixAppDebugLog(ach);
MixAppDebugLog(gszCRLF);
}

nIndex = ListBox_AddString(ptlb->hlb, ach);
ListBox_SetItemData(ptlb->hlb, nIndex, mxl.dwLineID);
}
}


//
//
//
SetWindowRedraw(ptlb->hlb, TRUE);

return (TRUE);
} // MixAppRefreshLineList()


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

//--------------------------------------------------------------------------;
//
// LRESULT MixAppLineChange
//
// Description:
//
//
// Arguments:
// HWND hwnd:
//
// HMIXER hmx:
//
// DWORD dwLineID:
//
// Return (LRESULT):
//
// History:
// 07/21/93
//
//--------------------------------------------------------------------------;

LRESULT FNGLOBAL MixAppLineChange
(
HWND hwnd,
HMIXER hmx,
DWORD dwLineID
)
{
DPF(1, "MixAppLineChange(hwnd=%Xh, hmx=%Xh, dwLineID=%.08lXh)",
hwnd, hmx, dwLineID);


//
//
//
if (gfDisplayingControl &&
(dwLineID == gmxl.dwLineID) &&
(NULL != ghdlgControl))
{
SendMessage(ghdlgControl, MM_MIXM_LINE_CHANGE, (WPARAM)hmx, dwLineID);
}


MixAppRefreshLineList(hwnd, gptlbLines);


//
// return zero because we handled the message
//
return (0L);
} // MixAppLineChange()