/***************************************************************************** * * Component: sndvol32.exe * File: utils.c * Purpose: miscellaneous * * Copyright (c) 1985-1999 Microsoft Corporation * *****************************************************************************/ #include #include #include #include "volumei.h" #include "volids.h" #include "mmddkp.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) 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; wsprintf(achEntry, gszStateSubkey, pszMixer, pszDest); if (Get) { UINT cb; if (QueryRegistryDataSize((LPTSTR)achEntry , (LPTSTR)aszLineInfo , &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++) { lstrcpy(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]; wsprintf(achEntry, gszStateSubkey, szMixer, szDest); if (Get) { if (ReadRegistryData((LPTSTR)achEntry , (LPTSTR)aszXPos , NULL , (LPBYTE)&prc->left , sizeof(prc->left)) != 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; } #ifdef DEBUG void FAR cdecl dprintfA(LPSTR szFormat, ...) { char ach[128]; int s,d; va_list va; va_start(va, szFormat); s = wsprintf (ach,szFormat, va); va_end(va); for (d=sizeof(ach)-1; s>=0; s--) { if ((ach[d--] = ach[s]) == '\n') ach[d--] = '\r'; } OutputDebugStringA("SNDVOL32: "); OutputDebugStringA(ach+d+1); } #ifdef UNICODE void FAR cdecl dprintfW(LPWSTR szFormat, ...) { WCHAR ach[128]; int s,d; va_list va; va_start(va, szFormat); s = vswprintf (ach,szFormat, va); va_end(va); for (d=(sizeof(ach)/sizeof(WCHAR))-1; s>=0; s--) { if ((ach[d--] = ach[s]) == TEXT('\n')) ach[d--] = TEXT('\r'); } OutputDebugStringW(TEXT("SNDVOL32: ")); OutputDebugStringW(ach+d+1); } #endif #endif