|
|
/*****************************************************************************
* * Component: sndvol32.exe * File: utils.c * Purpose: miscellaneous * * Copyright (c) 1985-1999 Microsoft Corporation * *****************************************************************************/ #include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include "volumei.h"
#include "volids.h"
#include "mmddkp.h"
#define STRSAFE_LIB
#include <strsafe.h>
/* misc. */
const TCHAR gszStateSubkey[] = TEXT ("%s\\%s"); static TCHAR gszAppName[256];
BOOL Volume_ErrorMessageBox( HWND hwnd, HINSTANCE hInst, UINT id) { TCHAR szMessage[256]; BOOL fRet; szMessage[0] = 0;
if (!gszAppName[0]) LoadString(hInst, IDS_APPBASE, gszAppName, SIZEOF(gszAppName)); LoadString(hInst, id, szMessage, SIZEOF(szMessage)); fRet = (MessageBox(hwnd , szMessage , gszAppName , MB_APPLMODAL | MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND) == MB_OK); return fRet; } const TCHAR aszXPos[] = TEXT ("X"); const TCHAR aszYPos[] = TEXT ("Y"); const TCHAR aszLineInfo[] = TEXT ("LineStates");
///////////////////////////////////////////////////////////////////////////////////////////
// Microsoft Confidential - DO NOT COPY THIS METHOD INTO ANY APPLICATION, THIS MEANS YOU!!!
///////////////////////////////////////////////////////////////////////////////////////////
DWORD GetWaveOutID(BOOL *pfPreferred) { MMRESULT mmr; DWORD dwWaveID=0; DWORD dwFlags = 0; if (pfPreferred) { *pfPreferred = TRUE; }
mmr = waveOutMessage((HWAVEOUT)UIntToPtr(WAVE_MAPPER), DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR) &dwWaveID, (DWORD_PTR) &dwFlags);
if (!mmr && pfPreferred) { *pfPreferred = dwFlags & 0x00000001; }
return(dwWaveID); }
///////////////////////////////////////////////////////////////////////////////////////////
// Microsoft Confidential - DO NOT COPY THIS METHOD INTO ANY APPLICATION, THIS MEANS YOU!!!
///////////////////////////////////////////////////////////////////////////////////////////
DWORD GetWaveInID(BOOL *pfPreferred) { MMRESULT mmr; DWORD dwWaveID=0; DWORD dwFlags = 0; if (pfPreferred) { *pfPreferred = TRUE; }
mmr = waveInMessage((HWAVEIN)UIntToPtr(WAVE_MAPPER), DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR) &dwWaveID, (DWORD_PTR) &dwFlags);
if (!mmr && pfPreferred) { *pfPreferred = dwFlags & 0x00000001; }
return(dwWaveID); }
/*
* Volume_GetDefaultMixerID * * Get the default mixer id. We only appear if there is a mixer associated * with the default wave. * */ MMRESULT Volume_GetDefaultMixerID( int *pid, BOOL fRecord) { MMRESULT mmr; UINT u, uMxID; BOOL fPreferredOnly = 0; *pid = 0; mmr = MMSYSERR_ERROR; //
// We use messages to the Wave Mapper in Win2K to get the preferred device.
//
if (fRecord) { if(waveInGetNumDevs()) { u = GetWaveInID(&fPreferredOnly); // Can we get a mixer device ID from the wave device?
mmr = mixerGetID((HMIXEROBJ)UIntToPtr(u), &uMxID, MIXER_OBJECTF_WAVEIN); if (mmr == MMSYSERR_NOERROR) { // Return this ID.
*pid = uMxID; } } } else { if(waveOutGetNumDevs()) { u = GetWaveOutID(&fPreferredOnly); // Can we get a mixer device ID from the wave device?
mmr = mixerGetID((HMIXEROBJ)UIntToPtr(u), &uMxID, MIXER_OBJECTF_WAVEOUT); if (mmr == MMSYSERR_NOERROR) { // Return this ID.
*pid = uMxID; } } } return mmr; }
const TCHAR aszOptionsSection[] = TEXT ("Options"); /*
* Volume_GetSetStyle * * */ void Volume_GetSetStyle( DWORD *pdwStyle, BOOL Get) { const TCHAR aszStyle[] = TEXT ("Style"); if (Get) { if (QueryRegistryDataSizeAndType((LPTSTR)aszOptionsSection , (LPTSTR)aszStyle , REG_DWORD , NULL) == NO_ERROR) { ReadRegistryData((LPTSTR)aszOptionsSection , (LPTSTR)aszStyle , NULL , (LPBYTE)pdwStyle , sizeof(DWORD)); } } else { WriteRegistryData((LPTSTR)aszOptionsSection , (LPTSTR)aszStyle , REG_DWORD , (LPBYTE)pdwStyle , sizeof(DWORD)); } }
/*
* Volume_GetTrayTimeout * * */ //DWORD Volume_GetTrayTimeout(
// DWORD dwTimeout)
//{
// const TCHAR aszTrayTimeout[] = TEXT ("TrayTimeout");
// DWORD dwT = dwTimeout;
// ReadRegistryData(NULL
// , (LPTSTR)aszTrayTimeout
// , NULL
// , (LPBYTE)&dwT
// , sizeof(DWORD));
// return dwT;
//}
/*
* Volume_GetSetRegistryLineStates * * Get/Set line states s.t. lines can be disabled if not used. * * */ struct LINESTATE { DWORD dwSupport; TCHAR szName[MIXER_LONG_NAME_CHARS]; };
#define VCD_STATEMASK (VCD_SUPPORTF_VISIBLE|VCD_SUPPORTF_HIDDEN)
BOOL Volume_GetSetRegistryLineStates( LPTSTR pszMixer, LPTSTR pszDest, PVOLCTRLDESC avcd, DWORD cvcd, BOOL Get) { struct LINESTATE * pls; DWORD ils, cls; TCHAR achEntry[128];
if (cvcd == 0) return TRUE; StringCchPrintf(achEntry, SIZEOF(achEntry), gszStateSubkey, pszMixer, pszDest); if (Get) { UINT cb; if (QueryRegistryDataSizeAndType((LPTSTR)achEntry , (LPTSTR)aszLineInfo , REG_BINARY , &cb) != NO_ERROR) return FALSE;
pls = (struct LINESTATE *)GlobalAllocPtr(GHND, cb);
if (!pls) return FALSE; if (ReadRegistryData((LPTSTR)achEntry , (LPTSTR)aszLineInfo , NULL , (LPBYTE)pls , cb) != NO_ERROR) { GlobalFreePtr(pls); return FALSE; }
cls = cb / sizeof(struct LINESTATE); if (cls > cvcd) cls = cvcd;
//
// Restore the hidden state of the line.
//
for (ils = 0; ils < cls; ils++) { if (lstrcmp(pls[ils].szName, avcd[ils].szName) == 0) { avcd[ils].dwSupport |= pls[ils].dwSupport; } } GlobalFreePtr(pls); } else { pls = (struct LINESTATE *)GlobalAllocPtr(GHND, cvcd * sizeof (struct LINESTATE)); if (!pls) return FALSE;
//
// Save the hidden state of the line
//
for (ils = 0; ils < cvcd; ils++) { StringCchCopy(pls[ils].szName, SIZEOF(pls[ils].szName), avcd[ils].szName); pls[ils].dwSupport = avcd[ils].dwSupport & VCD_SUPPORTF_HIDDEN;
}
if (WriteRegistryData((LPTSTR)achEntry , (LPTSTR)aszLineInfo , REG_BINARY , (LPBYTE)pls , cvcd*sizeof(struct LINESTATE)) != NO_ERROR) { GlobalFreePtr(pls); return FALSE; } GlobalFreePtr(pls); } return TRUE; }
/*
* Volume_GetSetRegistryRect * * Set/Get window position for restoring the postion of the app window * * */ BOOL Volume_GetSetRegistryRect( LPTSTR szMixer, LPTSTR szDest, LPRECT prc, BOOL Get) { TCHAR achEntry[128]; StringCchPrintf(achEntry, SIZEOF(achEntry), gszStateSubkey, szMixer, szDest);
if (Get) { if (QueryRegistryDataSizeAndType((LPTSTR)achEntry , (LPTSTR)aszXPos , REG_DWORD , NULL) != NO_ERROR) { return FALSE; } if (ReadRegistryData((LPTSTR)achEntry , (LPTSTR)aszXPos , NULL , (LPBYTE)&prc->left , sizeof(prc->left)) != NO_ERROR) { return FALSE; } if (QueryRegistryDataSizeAndType((LPTSTR)achEntry , (LPTSTR)aszYPos , REG_DWORD , NULL) != NO_ERROR) { return FALSE; } if (ReadRegistryData((LPTSTR)achEntry , (LPTSTR)aszYPos , NULL , (LPBYTE)&prc->top , sizeof(prc->top)) != NO_ERROR) { return FALSE; } } else { if (prc) { if (WriteRegistryData((LPTSTR)achEntry , (LPTSTR)aszXPos , REG_DWORD , (LPBYTE)&prc->left , sizeof(prc->left)) != NO_ERROR) { return FALSE; } if (WriteRegistryData((LPTSTR)achEntry , (LPTSTR)aszYPos , REG_DWORD , (LPBYTE)&prc->top , sizeof(prc->top)) != NO_ERROR) { return FALSE; } } } return TRUE; }
|