Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

268 lines
8.6 KiB

// Copyright (c) 1995-1998 Microsoft Corporation
/*
* Tray notification message
* */
#define MYWM_BASE (WM_APP+100)
//#define MYWM_NOTIFYICON (MYWM_BASE+0)
#define MYWM_TIMER (MYWM_BASE+1)
#define MYWM_RESTART (MYWM_BASE+2)
//#define MYWM_FREECHILD (MYWM_BASE+3)
//#define MYWM_ADDCHILD (MYWM_BASE+4)
#define MYWM_HELPTOPICS (MYWM_BASE+5)
#define MYWM_WAKEUP (MYWM_BASE+6)
/*
* MMSYS.CPL notifcation to kill tray volume
* */
//#define MYWM_KILLTRAYVOLUME (WM_USER+100)
//#define REGSTR_PATH_MEDIA "SYSTEM\\CurrentControlSet\\Control\\MediaResources"
//#define REGSTR_PATH_MEDIATMP REGSTR_PATH_MEDIA "\\tmp"
//#define REGKEY_TRAYVOL "TrayVolumeControlWindow"
/*
* Upon an option change, the dialog box can force a reinit
* */
#define MIXUI_EXIT 0
#define MIXUI_RESTART 1
#define MIXUI_ERROR 2
#define MIXUI_MMSYSERR 3
#define GET (TRUE)
#define SET (!GET)
#define VOLUME_TICS (500L) // VOLUME_TICS * VOLUME_MAX must be less than 0xFFFFFFFF
#define VOLUME_MIN (0L)
#define VOLUME_MAX (65535L)
#define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN)
#define SLIDER_TO_VOLUME(pos) (VOLUME_MIN + ((VOLUME_RANGE * pos + VOLUME_TICS / 2) / VOLUME_TICS))
#define VOLUME_TO_SLIDER(vol) ((VOLUME_TICS * (vol - VOLUME_MIN) + VOLUME_RANGE / 2) / VOLUME_RANGE)
#define MXUC_STYLEF_VISIBLE 0x00000001
#define MXUC_STYLEF_ENABLED 0x00000002
typedef struct t_MIXUICTRL
{
DWORD dwStyle; // ui style (see style flags)
HWND hwnd; // hwnd to control
int state; // app init state
} MIXUICTRL, * PMIXUICTRL, FAR * LPMIXUICTRL;
typedef enum
{
MIXUI_VOLUME = 0,
MIXUI_BALANCE,
MIXUI_SWITCH,
MIXUI_VUMETER,
MIXUI_ADVANCED,
MIXUI_MULTICHANNEL
} MIXUICONTROL;
typedef enum
{
MIXUI_CONTROL_UNINITIALIZED = 0,
MIXUI_CONTROL_ENABLED,
MIXUI_CONTROL_INITIALIZED
};
#define MIXUI_FIRST MIXUI_VOLUME
#define MIXUI_LAST MIXUI_VUMETER
typedef struct t_MIXUILINE
{
MIXUICTRL acr [4]; // 5 fixed types
DWORD dwStyle; // line style
struct t_VOLCTRLDESC * pvcd; // ptr to volume description
} MIXUILINE, * PMIXUILINE, FAR * LPMIXUILINE;
/*
* LOWORD == type
* HIWORD == style
*/
#define MXUL_STYLEF_DESTINATION 0x00000001
#define MXUL_STYLEF_SOURCE 0x00000002
#define MXUL_STYLEF_HIDDEN 0x00010000
#define MXUL_STYLEF_DISABLED 0x00020000
/*
* The MIXUIDIALOG data structure is a global variable baggage to be
* attached to dialogs and other windows. This allows to let windows
* carry state information rather than us keeping track of it. It also
* allows us to simply clone off of another dialog state with simple
* changes.
*/
typedef struct t_MIXUIDIALOG
{
HINSTANCE hInstance; // app instance
HWND hwnd; // this window
DWORD dwFlags; // random flags
HMIXER hmx; // open handle to mixer
DWORD mxid; // mixer id
DWORD dwDevNode; // mixer dev node
DWORD iDest; // destination line id
DWORD dwStyle; // visual options.
TCHAR szMixer[MAXPNAMELEN]; // product name
TCHAR szDestination[MIXER_SHORT_NAME_CHARS]; // line name
LPBYTE lpDialog; // ptr to dialog template
DWORD cbDialog; // sizeof dialog buffer
PMIXUILINE amxul; // ptr to array of mixuiline's
DWORD cmxul; // number of lines
struct t_VOLCTRLDESC *avcd; // array of volume descriptions
DWORD cvcd; // number of volume descriptions
HWND hParent; // HWND of parent window
UINT uTimerID; // peakmeter timer
HWND hStatus; // HWND of status bar
WNDPROC lpfnTrayVol;// Tray volume subclass trackbar
DWORD dwTrayInfo; // Tray volume info
int nShowCmd; // init window
DWORD dwDeviceState; // device change state information
int cTimeInQueue; // timer messages in queue
//
// Return values from dialogs, etc.. can be put in dwReturn
// Upon EndDialog, dwReturn gets set to MIXUI_EXIT or MIXUI_RESTART
//
DWORD dwReturn; // return value on exit
MMRESULT mmr; // last result (iff dwReturn == MIXUI_MMSYSERR)
RECT rcRestart; // restart position (iff dwReturn == MIXUI_RESTART)
int cxDlgContent; // size of dialog content
int cxDlgWidth; // width of dialog
int xOffset; // offset if scrolling is needed
int cxScroll; // amount to scroll by
} MIXUIDIALOG, *PMIXUIDIALOG, FAR *LPMIXUIDIALOG;
/*
* Style bits - these generally determine the look of the app
*/
#define MXUD_STYLEF_TRAYMASTER 0x00000002 // use the tray
#define MXUD_STYLEF_MASTERONLY 0x00000004 // only destination volumes --obsolete
#define MXUD_STYLEF_HORIZONTAL 0x00000008 // horizontal mode
#define MXUD_STYLEF_TWOCHANNEL 0x00000010 // two channel slider volume
#define MXUD_STYLEF_SMALL 0x00000020 // half-pint version
#define MXUD_STYLEF_CHILD 0x00000040 // child window? --obsolete
#define MXUD_STYLEF_KEEPWINDOW 0x00000080 // keep window --obsolete
#define MXUD_STYLEF_NOHELP 0x00000100 // no help
#define MXUD_STYLEF_STATUS 0x00000200 // status bar
#define MXUD_STYLEF_TOPMOST 0x00000400 // top most window
#define MXUD_STYLEF_ADVANCED 0x00000800 // show advanced
#define MXUD_STYLEF_CLOSE 0x00001000 // find and close TRAYMASTER window
/*
* Flag bits - these generally indicate operating modes and internal info
*/
#define MXUD_FLAGSF_MIXER 0x00000001 // bound to a mixer driver
#define MXUD_FLAGSF_USETIMER 0x00000002 // update timer enabled
#define MXUD_FLAGSF_BADDRIVER 0x00000004 // mixer driver with control map bug
#define MXUD_FLAGSF_NOADVANCED 0x00000008 // advanced features disabled
/*
* Macro - if both advanced style and advanced state
*/
#define MXUD_ADVANCED(x) (!((x)->dwFlags & MXUD_FLAGSF_NOADVANCED) && (x)->dwStyle & MXUD_STYLEF_ADVANCED)
/*
* Tray info bits - state bits for the tray volume
*/
#define MXUD_TRAYINFOF_SIGNAL 0x00000001 // has a change been made?
#define GETMIXUIDIALOG(x) (MIXUIDIALOG *)GetWindowLongPtr(x, DWLP_USER)
#define SETMIXUIDIALOG(x,y) SetWindowLongPtr(x, DWLP_USER, y)
DWORD ReadRegistryData( LPTSTR pEntryNode,
LPTSTR pEntryName,
PDWORD pType,
LPBYTE pData,
DWORD DataSize );
DWORD WriteRegistryData( LPTSTR pEntryNode,
LPTSTR pEntryName,
DWORD Type,
LPBYTE pData,
DWORD Size );
DWORD QueryRegistryDataSize( LPTSTR pEntryNode,
LPTSTR pEntryName,
DWORD *pDataSize );
int Volume_NumDevs(void);
HWND Volume_GetLineItem(HWND, DWORD, DWORD);
BOOL Properties(PMIXUIDIALOG pmxud, HWND hwnd);
#define HANDLE_WM_XSCROLL(hwnd, wParam, lParam, fn) \
((fn)((hwnd), (HWND)(lParam), (UINT)(LOWORD(wParam)), (int)(short)HIWORD(wParam)), 0L)
#define HANDLE_MM_MIXM_CONTROL_CHANGE(hwnd, wParam, lParam, fn) \
((fn)((hwnd), (HMIXER)(wParam), (DWORD)(lParam)))
#define HANDLE_MM_MIXM_LINE_CHANGE(hwnd, wParam, lParam, fn) \
((fn)((hwnd), (HMIXER)(wParam), (DWORD)(lParam)))
#define HANDLE_MYWM_TIMER(hwnd, wParam, lParam, fn) \
((fn)((hwnd)))
#define HANDLE_WM_IDEVICECHANGE(hwnd, wParam, lParam, fn) \
((fn)((hwnd), wParam, lParam))
#define HANDLE_MYWM_WAKEUP(hwnd, wParam, lParam, fn) \
((fn)((hwnd), wParam))
#ifdef DEBUG
static int _assert(LPSTR szExp, LPSTR szFile, UINT uLine)
{
const char szAssertText [] = "Assertion failed: %s, file %s, line %u\r\n";
const char szAppName [] = "SNDVOL32";
char sz[256];
DWORD fDialog = 0L;
wsprintf(sz, szAssertText, szExp, szFile, uLine);
ReadRegistryData(NULL, "AssertDialog", NULL, (LPBYTE)&fDialog, sizeof(DWORD));
if (fDialog)
MessageBox(NULL, szAppName, sz, MB_OK|MB_ICONHAND);
else
{
OutputDebugString(sz);
DebugBreak();
}
return 1;
}
#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )
#define dout(exp) OutputDebugString(exp)
static void _dlout(LPSTR szExp, LPSTR szFile, UINT uLine)
{
char sz[256];
wsprintf(sz, "%s, file %s, line %u\r\n", szExp, szFile, uLine);
OutputDebugString(sz);
}
#define dlout(exp) (void)(_dlout(exp, __FILE__, __LINE__), 0)
#else
#define assert(exp) ((void)0)
#define dout(exp) ((void)0)
#define dlout(exp) ((void)0)
#endif
#define VOLUME_TRAYSHUTDOWN_ID 1
#define SIZEOF(x) (sizeof((x))/sizeof((x)[0]))
#include "pvcd.h"
#ifndef DRV_QUERYDEVNODE
#define DRV_QUERYDEVNODE (DRV_RESERVED + 2)
#endif