windows-nt/Source/XPSP1/NT/base/mvdm/wow16/mmsystem/msmixmgr.y
2020-09-26 16:20:57 +08:00

1001 lines
30 KiB
Plaintext

//==========================================================================;
//
// msmixmgr.h -- Include file for Microsoft Audio Mixer Manager API's
//
// Version 3.10 (16 Bit)
//
// Copyright (C) 1992, 1993 Microsoft Corporation. All Rights Reserved.
//
//--------------------------------------------------------------------------;
//
// Define: Prevent inclusion of:
// -------------- --------------------------------------------------------
// MMNOMIXER Mixer application development support
// MMNOMIXERDEV Mixer driver development support
//
//--------------------------------------------------------------------------;
//
// NOTE: mmsystem.h (and mmddk.h for drivers) must be included _before_
// msmixmgr.h is included.
//
// For mixer applications: For mixer drivers:
//
// #include <windows.h> #include <windows.h>
// #include <windowsx.h> #include <windowsx.h>
// #include <mmsystem.h> #include <mmsystem.h>
// #include <msmixmgr.h> #include <mmddk.h>
// . . . #include <msmixmgr.h>
// . . .
//
//==========================================================================;
#ifndef _INC_MSMIXMGR
#define _INC_MSMIXMGR // #defined if msmixmgr.h was included
#ifndef RC_INVOKED
#pragma pack(1) // assume byte packing throughout
#endif
#ifdef __cplusplus
extern "C" // assume C declarations for C++
{
#endif // __cplusplus
//
//
//
//
#ifndef _MMRESULT_
#define _MMRESULT_
typedef UINT MMRESULT;
#endif
#ifndef _MMVERSION_
#define _MMVERSION_
typedef UINT MMVERSION;
#endif
//==========================================================================;
//
// Mixer Application Definitions
//
//
//
//==========================================================================;
#ifdef _INC_MMSYSTEM
#ifndef MMNOMIXER
#ifndef MM_MIXM_LINE_CHANGE
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
//
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
#ifdef WIN32
#define MIXAPI APIENTRY
#else
#ifdef _WINDLL
#define MIXAPI _far _pascal _loadds
#else
#define MIXAPI _far _pascal
#endif
#endif
//
// mixer callback notification messages. these messages are sent to all
// clients that have an open instance to a mixer device and have requested
// notifications by supplying a callback.
//
// CALLBACK_WINDOW:
//
// uMsg = MM_MIXM_LINE_CHANGE
// wParam = hmx
// lParam = dwLineID
//
// uMsg = MM_MIXM_CONTROL_CHANGE
// wParam = hmx
// lParam = dwControlID
//
//
#define MM_MIXM_LINE_CHANGE 0x3D0 // mixer line change notify
#define MM_MIXM_CONTROL_CHANGE 0x3D1 // mixer control change notify
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
//
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
DECLARE_HANDLE(HMIXEROBJ);
typedef HMIXEROBJ FAR *LPHMIXEROBJ;
DECLARE_HANDLE(HMIXER);
typedef HMIXER FAR *LPHMIXER;
//
//
//
#define MIXER_SHORT_NAME_CHARS 16
#define MIXER_LONG_NAME_CHARS 64
//
// MMRESULT error return values specific to the mixer API
//
//
#define MIXERR_BASE 1024
#define MIXERR_INVALLINE (MIXERR_BASE + 0)
#define MIXERR_INVALCONTROL (MIXERR_BASE + 1)
#define MIXERR_INVALVALUE (MIXERR_BASE + 2)
#define MIXERR_LASTERROR (MIXERR_BASE + 2)
//
//
//
#define MIXER_OBJECTF_HANDLE 0x80000000L
#define MIXER_OBJECTF_MIXER 0x00000000L
#define MIXER_OBJECTF_HMIXER (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIXER)
#define MIXER_OBJECTF_WAVEOUT 0x10000000L
#define MIXER_OBJECTF_HWAVEOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEOUT)
#define MIXER_OBJECTF_WAVEIN 0x20000000L
#define MIXER_OBJECTF_HWAVEIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEIN)
#define MIXER_OBJECTF_MIDIOUT 0x30000000L
#define MIXER_OBJECTF_HMIDIOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIOUT)
#define MIXER_OBJECTF_MIDIIN 0x40000000L
#define MIXER_OBJECTF_HMIDIIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIIN)
#define MIXER_OBJECTF_AUX 0x50000000L
#define MIXER_OBJECTF_TYPEMASK 0xF0000000L // ;Internal
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// mixerGetNumDevs()
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
UINT MIXAPI mixerGetNumDevs
(
void
);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// mixerGetDevCaps()
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
typedef struct tMIXERCAPS
{
WORD wMid; // manufacturer id
WORD wPid; // product id
MMVERSION vDriverVersion; // version of the driver
char szPname[MAXPNAMELEN]; // product name
DWORD fdwSupport; // misc. support bits
DWORD cDestinations; // count of destinations
} MIXERCAPS;
typedef MIXERCAPS *PMIXERCAPS;
typedef MIXERCAPS FAR *LPMIXERCAPS;
#define MIXERCAPS_SUPPORTF_xxx 0x00000000L // ;Internal
//
//
//
MMRESULT MIXAPI mixerGetDevCaps
(
UINT uMxId,
LPMIXERCAPS pmxcaps,
UINT cbmxcaps
);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// mixerGetID()
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
MMRESULT MIXAPI mixerGetID
(
HMIXEROBJ hmxobj,
UINT FAR *puMxId,
DWORD fdwId
);
#define MIXER_GETIDF_VALID (MIXER_OBJECTF_TYPEMASK) // ;Internal
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// mixerOpen()
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
MMRESULT MIXAPI mixerOpen
(
LPHMIXER phmx,
UINT uMxId,
DWORD dwCallback,
DWORD dwInstance,
DWORD fdwOpen
);
#define MIXER_OPENF_VALID (MIXER_OBJECTF_TYPEMASK | /* ;Internal */ \
CALLBACK_TYPEMASK) // ;Internal
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// mixerClose()
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
MMRESULT MIXAPI mixerClose
(
HMIXER hmx
);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// mixerMessage()
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
DWORD MIXAPI mixerMessage
(
HMIXER hmx,
UINT uMsg,
DWORD dwParam1,
DWORD dwParam2
);
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// mixerGetLineInfo()
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
typedef struct tMIXERLINE
{
DWORD cbStruct; // size of MIXERLINE structure
DWORD dwDestination; // zero based destination index
DWORD dwSource; // zero based source index (if source)
DWORD dwLineID; // unique line id for mixer device
DWORD fdwLine; // state/information about line
DWORD dwUser; // driver specific information
DWORD dwComponentType; // component type line connects to
DWORD cChannels; // number of channels line supports
DWORD cConnections; // number of connections [possible]
DWORD cControls; // number of controls at this line
char szShortName[MIXER_SHORT_NAME_CHARS];
char szName[MIXER_LONG_NAME_CHARS];
struct
{
DWORD dwType; // MIXERLINE_TARGETTYPE_xxxx
DWORD dwDeviceID; // target device ID of device type
WORD wMid; // of target device
WORD wPid; // "
MMVERSION vDriverVersion; // "
char szPname[MAXPNAMELEN]; // "
} Target;
} MIXERLINE;
typedef MIXERLINE *PMIXERLINE;
typedef MIXERLINE FAR *LPMIXERLINE;
//
// MIXERLINE.fdwLine
//
//
#define MIXERLINE_LINEF_ACTIVE 0x00000001L
#define MIXERLINE_LINEF_DISCONNECTED 0x00008000L
#define MIXERLINE_LINEF_SOURCE 0x80000000L
//
// MIXERLINE.dwComponentType
//
// component types for destinations and sources
//
//
#define MLCT_DST_FIRST 0x00000000L
#define MLCT_DST_UNDEFINED (MLCT_DST_FIRST + 0)
#define MLCT_DST_DIGITAL (MLCT_DST_FIRST + 1)
#define MLCT_DST_LINE (MLCT_DST_FIRST + 2)
#define MLCT_DST_MONITOR (MLCT_DST_FIRST + 3)
#define MLCT_DST_SPEAKERS (MLCT_DST_FIRST + 4)
#define MLCT_DST_HEADPHONES (MLCT_DST_FIRST + 5)
#define MLCT_DST_TELEPHONE (MLCT_DST_FIRST + 6)
#define MLCT_DST_WAVEIN (MLCT_DST_FIRST + 7)
#define MLCT_DST_VOICEIN (MLCT_DST_FIRST + 8)
#define MLCT_DST_LAST (MLCT_DST_FIRST + 8)
#define MLCT_SRC_FIRST 0x00001000L
#define MLCT_SRC_UNDEFINED (MLCT_SRC_FIRST + 0)
#define MLCT_SRC_DIGITAL (MLCT_SRC_FIRST + 1)
#define MLCT_SRC_LINE (MLCT_SRC_FIRST + 2)
#define MLCT_SRC_MICROPHONE (MLCT_SRC_FIRST + 3)
#define MLCT_SRC_SYNTHESIZER (MLCT_SRC_FIRST + 4)
#define MLCT_SRC_COMPACTDISC (MLCT_SRC_FIRST + 5)
#define MLCT_SRC_TELEPHONE (MLCT_SRC_FIRST + 6)
#define MLCT_SRC_PCSPEAKER (MLCT_SRC_FIRST + 7)
#define MLCT_SRC_WAVEOUT (MLCT_SRC_FIRST + 8)
#define MLCT_SRC_AUXILIARY (MLCT_SRC_FIRST + 9)
#define MLCT_SRC_ANALOG (MLCT_SRC_FIRST + 10)
#define MLCT_SRC_LAST (MLCT_SRC_FIRST + 10)
//
// MIXERLINE.Target.dwType
//
//
#define MIXERLINE_TARGETTYPE_UNDEFINED 0
#define MIXERLINE_TARGETTYPE_WAVEOUT 1
#define MIXERLINE_TARGETTYPE_WAVEIN 2
#define MIXERLINE_TARGETTYPE_MIDIOUT 3
#define MIXERLINE_TARGETTYPE_MIDIIN 4
#define MIXERLINE_TARGETTYPE_AUX 5
//
//
//
//
MMRESULT MIXAPI mixerGetLineInfo
(
HMIXEROBJ hmxobj,
LPMIXERLINE pmxl,
DWORD fdwInfo
);
#define M_GLINFOF_DESTINATION 0x00000000L
#define M_GLINFOF_SOURCE 0x00000001L
#define M_GLINFOF_LINEID 0x00000002L
#define M_GLINFOF_COMPONENTTYPE 0x00000003L
#define M_GLINFOF_TARGETTYPE 0x00000004L
#define M_GLINFOF_QUERYMASK 0x0000000FL
#define M_GLINFOF_VALID (MIXER_OBJECTF_TYPEMASK | /* ;Internal */ \
M_GLINFOF_QUERYMASK) // ;Internal
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// mixerGetLineControls()
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// MIXERCONTROL
//
//
typedef struct tMIXERCONTROL
{
DWORD cbStruct; // size in bytes of MIXERCONTROL
DWORD dwControlID; // unique control id for mixer device
DWORD dwControlType; // MC_CONTROLTYPE_xxx
DWORD fdwControl; // MC_CONTROLF_xxx
DWORD cMultipleItems; // if MC_CONTROLF_MULTIPLE set
char szShortName[MIXER_SHORT_NAME_CHARS];
char szName[MIXER_LONG_NAME_CHARS];
union
{
struct
{
LONG lMinimum; // signed minimum for this control
LONG lMaximum; // signed maximum for this control
};
struct
{
DWORD dwMinimum; // unsigned minimum for this control
DWORD dwMaximum; // unsigned maximum for this control
};
DWORD dwReserved[6];
} Bounds;
union
{
DWORD cSteps; // # of steps between min & max
DWORD cbCustomData; // size in bytes of custom data
DWORD dwReserved[6]; // !!! needed? we have cbStruct....
} Metrics;
} MIXERCONTROL;
typedef MIXERCONTROL *PMIXERCONTROL;
typedef MIXERCONTROL FAR *LPMIXERCONTROL;
//
// MIXERCONTROL.fdwControl
//
//
#define MC_CONTROLF_UNIFORM 0x00000001L
#define MC_CONTROLF_MULTIPLE 0x00000002L
#define MC_CONTROLF_DISABLED 0x80000000L
#define MC_CONTROLF_VALID (MC_CONTROLF_UNIFORM | /* ;Internal */ \
MC_CONTROLF_MULTIPLE | /* ;Internal */ \
MC_CONTROLF_DISABLED) /* ;Internal */
//
// MC_CONTROLTYPE_xxx building block defines
//
//
#define MC_CT_CLASS_MASK 0xF0000000L
#define MC_CT_CLASS_CUSTOM 0x00000000L
#define MC_CT_CLASS_METER 0x10000000L
#define MC_CT_CLASS_SWITCH 0x20000000L
#define MC_CT_CLASS_NUMBER 0x30000000L
#define MC_CT_CLASS_SLIDER 0x40000000L
#define MC_CT_CLASS_FADER 0x50000000L
#define MC_CT_CLASS_TIME 0x60000000L
#define MC_CT_CLASS_LIST 0x70000000L
#define MC_CT_SUBCLASS_MASK 0x0F000000L
#define MC_CT_SC_SWITCH_BOOLEAN 0x00000000L
#define MC_CT_SC_SWITCH_BUTTON 0x01000000L
#define MC_CT_SC_METER_POLLED 0x00000000L
#define MC_CT_SC_TIME_MICROSECS 0x00000000L
#define MC_CT_SC_TIME_MILLISECS 0x01000000L
#define MC_CT_SC_LIST_SINGLE 0x00000000L
#define MC_CT_SC_LIST_MULTIPLE 0x01000000L
#define MC_CT_UNITS_MASK 0x00FF0000L
#define MC_CT_UNITS_CUSTOM 0x00000000L
#define MC_CT_UNITS_BOOLEAN 0x00010000L
#define MC_CT_UNITS_SIGNED 0x00020000L
#define MC_CT_UNITS_UNSIGNED 0x00030000L
#define MC_CT_UNITS_DECIBELS 0x00040000L // in 10ths
#define MC_CT_UNITS_PERCENT 0x00050000L // in 10ths
//
// MIXERCONTROL.dwControlType
//
//
// Custom Controls
//
//
#define MC_CONTROLTYPE_CUSTOM (MC_CT_CLASS_CUSTOM | MC_CT_UNITS_CUSTOM)
//
// Meters (Boolean)
//
// simply shows 'on or off' with the Boolean type
//
#define MC_CONTROLTYPE_BOOLEANMETER (MC_CT_CLASS_METER | MC_CT_SC_METER_POLLED | MC_CT_UNITS_BOOLEAN)
//
// Meters (signed)
//
// MIXERCONTROL.Bounds.lMinimum = min
// MIXERCONTROL.Bounds.lMaximum = max
//
// signed meters are meant for displaying levels that have a signed nature.
// there is no requirment for the values above and below zero to be
// equal in magnitude. that is, it is 'ok' to have a range from, say, -3
// to 12. however, the standard defined signed meter types may have
// restrictions (such as the peakmeter).
//
// MC_CONTROLTYPE_PEAKMETER: a peak meter tells the monitoring
// application the peak value reached (and phase) of a line (normally
// wave input and output) over a small period of time. THIS IS NOT VU!
// the bounds are fixed:
//
// MIXERCONTROL.Bounds.lMinimum = -32768 ALWAYS!
// MIXERCONTROL.Bounds.lMaximum = 32767 ALWAYS!
//
// so 8 bit and 24 bit samples must be scaled appropriately. this is so
// an application can display a 'bouncing blinky light' for a user and
// also monitor a line for clipping. remember that 8 bit samples must
// be converted to signed values (by the mixer driver)!
//
//
// NOTE! meters are read only controls. also, a meter should only be
// 'active' when the line it is associated with is active (see fdwLine
// in MIXERLINE). it is NOT an error to read a meter that is not active--
// the mixer driver should simply return 'no value' states (usually zero).
// but it may be useful to stop monitoring a meter if the line is not
// active...
//
#define MC_CONTROLTYPE_SIGNEDMETER (MC_CT_CLASS_METER | MC_CT_SC_METER_POLLED | MC_CT_UNITS_SIGNED)
#define MC_CONTROLTYPE_PEAKMETER (MC_CONTROLTYPE_SIGNEDMETER + 1)
//
// Meters (unsigned)
//
// MIXERCONTROL.Bounds.dwMinimum = min
// MIXERCONTROL.Bounds.dwMaximum = max
//
// unsigned meters are meant for displaying levels that have an unsigned
// nature. there is no requirment for the values to be based at zero.
// that is, it is 'ok' to have a range from, say, 8 to 42. however, the
// standard defined unsigned meter types may have restrictions.
//
//
// NOTE! meters are read only controls. also, a meter should only be
// 'active' when the line it is associated with is active (see fdwLine
// in MIXERLINE). it is NOT an error to read a meter that is not active--
// the mixer driver should simply return 'no value' states (usually zero).
// but it may be useful to stop monitoring a meter if the line is not
// active...
//
#define MC_CONTROLTYPE_UNSIGNEDMETER (MC_CT_CLASS_METER | MC_CT_SC_METER_POLLED | MC_CT_UNITS_UNSIGNED)
//
// Switches (Boolean)
//
// MIXERCONTROL.Bounds.lMinimum = ignored (though should be zero)
// MIXERCONTROL.Bounds.lMaximum = ignored (though should be one)
//
// Boolean switches are for enabling/disabling things. they are either
// on (non-zero for fValue, 1 should be used) or off (zero for fValue).
// a few standard types are defined in case an application wants to search
// for a specific type of switch (like mute)--and also to allow a different
// looking control to be used (say for ON/OFF vs a generic Boolean).
//
//
#define MC_CONTROLTYPE_BOOLEAN (MC_CT_CLASS_SWITCH | MC_CT_SC_SWITCH_BOOLEAN | MC_CT_UNITS_BOOLEAN)
#define MC_CONTROLTYPE_ONOFF (MC_CONTROLTYPE_BOOLEAN + 1)
#define MC_CONTROLTYPE_MUTE (MC_CONTROLTYPE_BOOLEAN + 2)
#define MC_CONTROLTYPE_MONO (MC_CONTROLTYPE_BOOLEAN + 3)
#define MC_CONTROLTYPE_LOUDNESS (MC_CONTROLTYPE_BOOLEAN + 4)
#define MC_CONTROLTYPE_STEREOENH (MC_CONTROLTYPE_BOOLEAN + 5)
//
// a button switch is 'write only' and simply signals the driver to do
// something. an example is a 'Calibrate' button like the one in the
// existing Turtle Beach MultiSound recording prep utility. an application
// sets the fValue to TRUE for all buttons that should be pressed. if
// fValue is FALSE, no action will be taken. reading a button's value will
// always return FALSE (not depressed).
//
#define MC_CONTROLTYPE_BUTTON (MC_CT_CLASS_SWITCH | MC_CT_SC_SWITCH_BUTTON | MC_CT_UNITS_BOOLEAN)
//
// Number (signed integer)
//
//
#define MC_CONTROLTYPE_SIGNED (MC_CT_CLASS_NUMBER | MC_CT_UNITS_SIGNED)
//
// the units are in 10ths of 1 decibel
//
//
#define MC_CONTROLTYPE_DECIBELS (MC_CT_CLASS_NUMBER | MC_CT_UNITS_DECIBELS)
//
// Number (usigned integer)
//
//
#define MC_CONTROLTYPE_UNSIGNED (MC_CT_CLASS_NUMBER | MC_CT_UNITS_UNSIGNED)
//
// the units are in 10ths of 1 percent
//
#define MC_CONTROLTYPE_PERCENT (MC_CT_CLASS_NUMBER | MC_CT_UNITS_PERCENT)
//
// Sliders (signed integer)
//
// sliders are meant 'positioning' type controls (such as panning).
// the generic slider must have lMinimum, lMaximum, and cSteps filled
// in--also note that there is no restriction on these values (see
// signed meters above for more).
//
//
// MC_CONTROLTYPE_PAN: this is meant to be a real simple pan
// for stereo lines. the Bounds are fixed to be -32768 to 32767 with 0
// being dead center. these values are LINEAR and there are no units
// (-32768 = extreme left, 32767 = extreme right).
//
// if an application wants to display a scrollbar that does not contain
// a bunch of 'dead space', then the scrollbar range should be set to
// MIXERCONTROL.Metrics.cSteps and lValue should be scaled appropriately
// with MulDiv.
//
// MIXERCONTROL.Bounds.lMinimum = -32768 ALWAYS!
// MIXERCONTROL.Bounds.lMaximum = 32767 ALWAYS!
// MIXERCONTROL.Metrics.cSteps = number of steps for range.
//
//
// MC_CONTROLTYPE_QSOUNDPAN: the initial version of Q-Sound (tm,
// etc by Archer Communications) defines 'Q-Space' as a sortof semi-circle
// with 33 positions (0 = extreme left, 33 = extreme right, 16 = center).
// in order to work with our 'slider position' concept, we shift these
// values to -15 = extreme left, 15 = extreme right, 0 = center.
//
// MIXERCONTROL.Bounds.lMinimum = -15 ALWAYS!
// MIXERCONTROL.Bounds.lMaximum = 15 ALWAYS!
// MIXERCONTROL.Metrics.cSteps = 1 ALWAYS!
//
//
#define MC_CONTROLTYPE_SLIDER (MC_CT_CLASS_SLIDER | MC_CT_UNITS_SIGNED)
#define MC_CONTROLTYPE_PAN (MC_CONTROLTYPE_SLIDER + 1)
#define MC_CONTROLTYPE_QSOUNDPAN (MC_CONTROLTYPE_SLIDER + 2)
//
// Simple Faders (unsigned integer)
//
// MIXERCONTROL.Bounds.dwMinimum = 0 ALWAYS!
// MIXERCONTROL.Bounds.dwMaximum = 65535 ALWAYS!
//
// MIXERCONTROL.Metrics.cSteps = number of steps for range.
//
// these faders are meant to be as simple as possible for an application
// to use. the Bounds are fixed to be 0 to 0xFFFF with 0x8000 being half
// volume/level. these values are LINEAR and there are no units. 0 is
// minimum volume/level, 0xFFFF is maximum.
//
// if an application wants to display a scrollbar that does not contain
// a bunch of 'dead space', then the scrollbar range should be set to
// MIXERCONTROL.Metrics.cSteps and dwValue should be scaled appropriately
// with MulDiv.
//
#define MC_CONTROLTYPE_FADER (MC_CT_CLASS_FADER | MC_CT_UNITS_UNSIGNED)
#define MC_CONTROLTYPE_VOLUME (MC_CONTROLTYPE_FADER + 1)
#define MC_CONTROLTYPE_BASS (MC_CONTROLTYPE_FADER + 2)
#define MC_CONTROLTYPE_TREBLE (MC_CONTROLTYPE_FADER + 3)
#define MC_CONTROLTYPE_EQUALIZER (MC_CONTROLTYPE_FADER + 4)
//
// List (single select)
//
// MIXERCONTROL.cMultipleItems = number of items in list
//
// M_GCDSF_LISTTEXT should be used to get the text
// for each item.
//
// MIXERCONTROLDETAILS_BOOLEAN should be used to set and retrieve
// what item is selected (fValue = TRUE if selected).
//
// the generic single select lists can be used for many things. some
// examples are 'Effects'. a mixer driver could provide a list of
// different effects that could be applied like
//
// Reverbs: large hall, warm hall, bright plate, warehouse, etc.
//
// Delays: sweep delays, hold delays, 1.34 sec delay, etc.
//
// Vocal: recital hall, alcove, delay gate, etc
//
// lots of uses! gates, compressors, filters, dynamics, etc, etc.
//
//
// MC_CONTROLTYPE_MUX: a 'Mux' is a single selection multiplexer.
// usually a Mux is used to select, say, an input source for recording.
// for example, a mixer driver might have a mux that lets the user select
// between Microphone or Line-In (but not both!) for recording. this
// would be a perfect place to use a Mux control. some cards (for example
// Media Vision's 16 bit Pro Audio cards) can record from multiple sources
// simultaneously, so they would use a MC_CONTROLTYPE_MIXER, not
// a MC_CONTROLTYPE_MUX).
//
//
// NOTE! because single select lists can change what selections are
// possible based on other controls (uhg!), the application must examine
// the fValue's of all items after setting the control details so the
// display can be refreshed accordingly. an example might be that an
// audio card cannot change its input source while recording--so the
// selection would 'fail' by keeping the fValue on the current selection
// (but mixerSetControlDetails will succeed!).
//
#define MC_CONTROLTYPE_SINGLESELECT (MC_CT_CLASS_LIST | MC_CT_SC_LIST_SINGLE | MC_CT_UNITS_BOOLEAN)
#define MC_CONTROLTYPE_MUX (MC_CONTROLTYPE_SINGLESELECT + 1)
//
// List (multiple select)
//
// MIXERCONTROL.cMultipleItems = number of items in list
//
// M_GCDSF_LISTTEXT should be used to get the text
// for each item.
//
// MIXERCONTROLDETAILS_BOOLEAN should be used to set and retrieve
// what item(s) are selected (fValue = TRUE if selected).
//
// NOTE! because multiple select lists can change what selections are
// selected based on other selections (uhg!), the application must examine
// the fValue's of all items after setting the control details so the
// display can be refreshed accordingly. an example might be that an
// audio card cannot change its input source(s) while recording--so the
// selection would 'fail' by keeping the fValue on the current selection(s)
// (but mixerSetControlDetails will succeed!).
//
#define MC_CONTROLTYPE_MULTIPLESELECT (MC_CT_CLASS_LIST | MC_CT_SC_LIST_MULTIPLE | MC_CT_UNITS_BOOLEAN)
#define MC_CONTROLTYPE_MIXER (MC_CONTROLTYPE_MULTIPLESELECT + 1)
//
// Time Controls
//
// MIXERCONTROL.Bounds.dwMinimum = min
// MIXERCONTROL.Bounds.dwMaximum = max
//
// time controls are meant for inputing time information. these can be
// used for effects such as delay, reverb, etc.
//
//
#define MC_CONTROLTYPE_MICROTIME (MC_CT_CLASS_TIME | MC_CT_SC_TIME_MICROSECS | MC_CT_UNITS_UNSIGNED)
#define MC_CONTROLTYPE_MILLITIME (MC_CT_CLASS_TIME | MC_CT_SC_TIME_MILLISECS | MC_CT_UNITS_UNSIGNED)
//
// MIXERLINECONTROLS
//
//
//
typedef struct tMIXERLINECONTROLS
{
DWORD cbStruct; // size in bytes of MIXERLINECONTROLS
DWORD dwLineID; // line id (from MIXERLINE.dwLineID)
union
{
DWORD dwControlID; // M_GLCONTROLSF_ONEBYID
DWORD dwControlType; // M_GLCONTROLSF_ONEBYTYPE
};
DWORD cControls; // count of controls pmxctrl points to
DWORD cbmxctrl; // size in bytes of _one_ MIXERCONTROL
LPMIXERCONTROL pamxctrl; // pointer to first MIXERCONTROL array
} MIXERLINECONTROLS;
typedef MIXERLINECONTROLS *PMIXERLINECONTROLS;
typedef MIXERLINECONTROLS FAR *LPMIXERLINECONTROLS;
//
//
//
MMRESULT MIXAPI mixerGetLineControls
(
HMIXEROBJ hmxobj,
LPMIXERLINECONTROLS pmxlc,
DWORD fdwControls
);
#define M_GLCONTROLSF_ALL 0x00000000L
#define M_GLCONTROLSF_ONEBYID 0x00000001L
#define M_GLCONTROLSF_ONEBYTYPE 0x00000002L
#define M_GLCONTROLSF_QUERYMASK 0x0000000FL
#define M_GLCONTROLSF_VALID (MIXER_OBJECTF_TYPEMASK | /* ;Internal */ \
M_GLCONTROLSF_QUERYMASK) // ;Internal
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// mixerGetControlDetails()
//
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
typedef struct tMIXERCONTROLDETAILS
{
DWORD cbStruct; // size in bytes of MIXERCONTROLDETAILS
DWORD dwControlID; // control id to get/set details on
DWORD cChannels; // number of channels in paDetails array
union
{
HWND hwndOwner; // for M_SCDF_CUSTOM
DWORD cMultipleItems; // if _MULTIPLE, the number of items per channel
};
DWORD cbDetails; // size of _one_ details_XX struct
LPVOID paDetails; // pointer to array of details_XX structs
} MIXERCONTROLDETAILS, *PMIXERCONTROLDETAILS, FAR *LPMIXERCONTROLDETAILS;
//
// M_GCDSF_LISTTEXT
//
//
typedef struct tMIXERCONTROLDETAILS_LISTTEXT
{
DWORD dwParam1;
DWORD dwParam2;
char szName[MIXER_LONG_NAME_CHARS];
} MIXERCONTROLDETAILS_LISTTEXT;
typedef MIXERCONTROLDETAILS_LISTTEXT *PMIXERCONTROLDETAILS_LISTTEXT;
typedef MIXERCONTROLDETAILS_LISTTEXT FAR *LPMIXERCONTROLDETAILS_LISTTEXT;
//
// M_GCDSF_VALUE
//
//
typedef struct tMIXERCONTROLDETAILS_BOOLEAN
{
LONG fValue;
} MIXERCONTROLDETAILS_BOOLEAN,
*PMIXERCONTROLDETAILS_BOOLEAN,
FAR *LPMIXERCONTROLDETAILS_BOOLEAN;
typedef struct tMIXERCONTROLDETAILS_SIGNED
{
LONG lValue;
} MIXERCONTROLDETAILS_SIGNED,
*PMIXERCONTROLDETAILS_SIGNED,
FAR *LPMIXERCONTROLDETAILS_SIGNED;
typedef struct tMIXERCONTROLDETAILS_UNSIGNED
{
DWORD dwValue;
} MIXERCONTROLDETAILS_UNSIGNED,
*PMIXERCONTROLDETAILS_UNSIGNED,
FAR *LPMIXERCONTROLDETAILS_UNSIGNED;
//
//
//
//
MMRESULT MIXAPI mixerGetControlDetails
(
HMIXEROBJ hmxobj,
LPMIXERCONTROLDETAILS pmxcd,
DWORD fdwDetails
);
#define M_GCDSF_VALUE 0x00000000L
#define M_GCDSF_LISTTEXT 0x00000001L
#define M_GCDSF_QUERYMASK 0x0000000FL
#define M_GCDSF_VALID (MIXER_OBJECTF_TYPEMASK | /* ;Internal */ \
M_GCDSF_QUERYMASK) /* ;Internal */
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
//
// mixerSetControlDetails()
//
//
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
MMRESULT MIXAPI mixerSetControlDetails
(
HMIXEROBJ hmxobj,
LPMIXERCONTROLDETAILS pmxcd,
DWORD fdwDetails
);
#define M_SCDF_VALUE 0x00000000L
#define M_SCDF_CUSTOM 0x00000001L
#define M_SCDF_QUERYMASK 0x0000000FL
#define M_SCDF_VALID (MIXER_OBJECTF_TYPEMASK | /* ;Internal */ \
M_SCDF_QUERYMASK) /* ;Internal */
#endif // MM_MIXM_LINE_CHANGE
#endif // MMNOMIXER
#endif // _INC_MMSYSTEM
//==========================================================================;
//
// Mixer Driver Definitions
//
//
//
//==========================================================================;
#ifdef _INC_MMDDK
#ifndef MMNOMIXERDEV
#ifndef MAXMIXERDRIVERS
//
// maximum number of mixer drivers that can be loaded by MSMIXMGR.DLL
//
#define MAXMIXERDRIVERS 10
//
// mixer device open information structure
//
//
typedef struct tMIXEROPENDESC
{
HMIXER hmx; // handle that will be used
LPVOID pReserved0; // reserved--driver should ignore
DWORD dwCallback; // callback
DWORD dwInstance; // app's private instance information
} MIXEROPENDESC, *PMIXEROPENDESC, FAR *LPMIXEROPENDESC;
//
//
//
//
#define MXDM_INIT 100
#define MXDM_USER DRV_USER
#define MXDM_BASE (1)
#define MXDM_GETNUMDEVS (MXDM_BASE + 0)
#define MXDM_GETDEVCAPS (MXDM_BASE + 1)
#define MXDM_OPEN (MXDM_BASE + 2)
#define MXDM_CLOSE (MXDM_BASE + 3)
#define MXDM_GETLINEINFO (MXDM_BASE + 4)
#define MXDM_GETLINECONTROLS (MXDM_BASE + 5)
#define MXDM_GETCONTROLDETAILS (MXDM_BASE + 6)
#define MXDM_SETCONTROLDETAILS (MXDM_BASE + 7)
#endif // MAXMIXERDRIVERS
#endif // MMNOMIXERDEV
#endif // _INC_MMDDK
#ifdef __cplusplus
} // end of extern "C" {
#endif // __cplusplus
#ifndef RC_INVOKED
#pragma pack() // revert to default packing
#endif
#endif // _INC_MSMIXMGR