// 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