2010年1月25日 星期一

CuVolume - sets the volume of a waveform output device.

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

}

1 則留言:

  1. 微軟就是那麼神奇, 連個音量控制, 還沒有標準, 還要偷偷用MSDN沒寫的隱藏版API. (不知道全部集完有沒有大獎)

    回覆刪除