// sets the volume of a waveform output device.
DWORD dw, dw2;
// dw : 0x0000~0xffff
// dw2: 0~MAX
CuVolume Volume;
dw = Volume.GetVolume();
dw2 = Volume.GetVolume(MAX);
Volume.SetVolume(dw);
Volume.SetVolume(dw2, MAX);
Volume.IncVolume(MAX);
Volume.DecVolume(MAX);
// CuVolume.h
class CuVolume
{
BOOL m_bMute;
unsigned long m_nVolume;
//////////////////////////////////////////////////////////////////////
//
CuDllManager dll;
typedef DWORD (*pAudio) ();
pAudio pProc;
void UpdateVolumeFromRegistry();
//////////////////////////////////////////////////////////////////////
public:
CuVolume();
virtual ~CuVolume();
void IncVolume(int nMax);
void DecVolume(int nMax);
BOOL GetMute(void){ return m_bMute; }
BOOL SetMute(BOOL b);
// 直接指定值 v = 0 ~ 0xffff
BOOL SetVolume(unsigned long v);
unsigned long GetVolume(void);
// 正規化過的值 指定max Ex: v = 50 , nMAx = 100 , 會設定 50%
// v = 1, nMax = 5, 會設定 20%
BOOL SetVolume(int v, int nMax);
// 取回正規化過的值
int GetVolume(int nMax);
};
// CuVolume.cpp
#define MAX_VALUES 0xffff
void CuVolume::UpdateVolumeFromRegistry()
{
if( pProc )
pProc();
}
CuVolume::CuVolume()
:m_bMute(FALSE)
{
GetVolume();
dll.LoadLibrary(_T("coredll.dll"));
pProc = (pAudio)dll.GetProcAddress(_T("AudioUpdateFromRegistry"));
}
CuVolume::~CuVolume()
{
}
BOOL CuVolume::SetMute(BOOL b)
{
static unsigned long nVolume = GetVolume();
m_bMute = b;
if (m_bMute)
{
nVolume = GetVolume();
SetVolume(0);
}
else
{
SetVolume(nVolume);
}
return TRUE;
}
BOOL CuVolume::SetVolume(unsigned long v)
{
m_nVolume = v;
waveOutSetVolume(NULL, 0x10001 * v) ;
CReg reg(HKEY_CURRENT_USER, _T("ControlPanel\\Volume"));
reg.SetDW(_T("Volume"), 0x10001 * v);
UpdateVolumeFromRegistry();
return TRUE;
}
unsigned long CuVolume::GetVolume(void)
{
unsigned long Value;
if (waveOutGetVolume(NULL,&Value) == MMSYSERR_NOERROR)
{
m_nVolume = ( (LOWORD(Value)+HIWORD(Value)) ) / 2 ;
}
return m_nVolume;
}
BOOL CuVolume::SetVolume(int v, int nMax)
{
DWORD Value = v * MAX_VALUES / nMax;
SetVolume(Value);
return TRUE;
}
int CuVolume::GetVolume(int nMax)
{
unsigned long Value;
Value = (float)nMax * ((float)GetVolume() + 600) / (float)MAX_VALUES;
return Value;
}
void CuVolume::IncVolume(int nMax)
{
if( GetMute() )
SetMute(FALSE);
unsigned long offset_Value = (float)MAX_VALUES / nMax;
unsigned long Value = (float)GetVolume();
Value += offset_Value;
if( Value > MAX_VALUES)
Value = MAX_VALUES;
SetVolume(Value);
}
void CuVolume::DecVolume(int nMax)
{
if( GetMute() )
SetMute(FALSE);
float offset_Value = (float)MAX_VALUES / nMax;
float Value = (float)GetVolume();
if( Value <= offset_Value)
Value = 0;
else
Value -= offset_Value;
SetVolume(Value);
}
2010年1月25日 星期一
CuVolume - sets the volume of a waveform output device.
訂閱:
張貼留言 (Atom)
微軟就是那麼神奇, 連個音量控制, 還沒有標準, 還要偷偷用MSDN沒寫的隱藏版API. (不知道全部集完有沒有大獎)
回覆刪除