请问大家要怎样才能设置系统的声音大小,左右声道呢?是使用MCI函数嘛???

解决方案 »

  1.   

    http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=707//看看就知道了
      

  2.   

    我用VTest 做过,要不你也试试?
      

  3.   


    控制大小:
    BOOL CVolumeDlg::amdInitialize()
    {
    // get the number of mixer devices present in the system
    m_nNumMixers = ::mixerGetNumDevs(); m_hMixer = NULL;
    ::ZeroMemory(&m_mxcaps, sizeof(MIXERCAPS)); // open the first mixer
    // A "mapper" for audio mixer devices does not currently exist.
    if (m_nNumMixers != 0)
    {
    if (::mixerOpen(&m_hMixer,
    0,
    (DWORD)this->GetSafeHwnd(),
    NULL,
    MIXER_OBJECTF_MIXER | CALLBACK_WINDOW)
    != MMSYSERR_NOERROR)
    return FALSE; if (::mixerGetDevCaps((UINT)m_hMixer, &m_mxcaps, sizeof(MIXERCAPS))
    != MMSYSERR_NOERROR)
    return FALSE;
    } return TRUE;
    }BOOL CVolumeDlg::amdUninitialize()
    {
    BOOL bSucc = TRUE; if (m_hMixer != NULL)
    {
    bSucc = ::mixerClose(m_hMixer) == MMSYSERR_NOERROR;
    m_hMixer = NULL;
    } return bSucc;
    }BOOL CVolumeDlg::amdGetMasterVolumeControl()
    {
    m_strDstLineName.Empty();
    m_strVolumeControlName.Empty(); if (m_hMixer == NULL)
    return FALSE; // get dwLineID
    MIXERLINE mxl;
    mxl.cbStruct = sizeof(MIXERLINE);
    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
    if (::mixerGetLineInfo((HMIXEROBJ)m_hMixer,
       &mxl,
       MIXER_OBJECTF_HMIXER |
       MIXER_GETLINEINFOF_COMPONENTTYPE)
    != MMSYSERR_NOERROR)
    return FALSE; // get dwControlID
    MIXERCONTROL mxc;
    MIXERLINECONTROLS mxlc;
    mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
    mxlc.dwLineID = mxl.dwLineID;
    mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
    mxlc.cControls = 1;
    mxlc.cbmxctrl = sizeof(MIXERCONTROL);
    mxlc.pamxctrl = &mxc;
    if (::mixerGetLineControls((HMIXEROBJ)m_hMixer,
       &mxlc,
       MIXER_OBJECTF_HMIXER |
       MIXER_GETLINECONTROLSF_ONEBYTYPE)
    != MMSYSERR_NOERROR)
    return FALSE; // record dwControlID
    m_strDstLineName = mxl.szName;
    m_strVolumeControlName = mxc.szName;
    m_dwMinimum = mxc.Bounds.dwMinimum;
    m_dwMaximum = mxc.Bounds.dwMaximum;
    m_dwVolumeControlID = mxc.dwControlID; return TRUE;
    }BOOL CVolumeDlg::amdGetMasterVolumeValue(DWORD &dwVal) const
    {
    if (m_hMixer == NULL ||
    m_strDstLineName.IsEmpty() || m_strVolumeControlName.IsEmpty())
    return FALSE; MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = m_dwVolumeControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = 0;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
    mxcd.paDetails = &mxcdVolume;
    if (::mixerGetControlDetails((HMIXEROBJ)m_hMixer,
     &mxcd,
     MIXER_OBJECTF_HMIXER |
     MIXER_GETCONTROLDETAILSF_VALUE)
    != MMSYSERR_NOERROR)
    return FALSE;

    dwVal = mxcdVolume.dwValue; return TRUE;
    }BOOL CVolumeDlg::amdSetMasterVolumeValue(DWORD dwVal) const
    {
    if (m_hMixer == NULL ||
    m_strDstLineName.IsEmpty() || m_strVolumeControlName.IsEmpty())
    return FALSE; MIXERCONTROLDETAILS_UNSIGNED mxcdVolume = { dwVal };
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = m_dwVolumeControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = 0;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
    mxcd.paDetails = &mxcdVolume;
    if (::mixerSetControlDetails((HMIXEROBJ)m_hMixer,
     &mxcd,
     MIXER_OBJECTF_HMIXER |
     MIXER_SETCONTROLDETAILSF_VALUE)
    != MMSYSERR_NOERROR)
    return FALSE;

    return TRUE;
    }
      

  4.   


    调节平衡:
    int CMixerFader::Init( DWORD DstType, DWORD SrcType, DWORD ControlType, int subType )
    {
    if ( m_hWnd == NULL )
    {
    PrintMessage( "CMixerFader::Init", "No Window attached. Did you create or subclass one?" );
    return 0;
    } EnableWindow( FALSE ); if( subType == BALANCE )
    {
    int min, max;
    GetRange( min, max );
    SetSliderPos( ( max - min )/2 );
    } // start by checking the type and subtypes  if( ( ControlType & MIXERCONTROL_CT_CLASS_MASK ) != MIXERCONTROL_CT_CLASS_FADER )
    {
    PrintMessage( "CMixerFader::Init", 
                  "Wrong control type for a fader control: %s", 
                  GetControlTypeString( ControlType ) );
    return 0;
    }
    if( subType < LEFT || subType > BALANCE )
    {
    PrintMessage( "CMixerFader::Init", "Wrong sub-type for a fader control: %d", subType );
    return 0;
    } m_subType = subType; if( CMixerBase::Init( DstType, SrcType, ControlType, m_hWnd ) == 0 )
    return 0; // set the slider range and number of steps from the information obtained
    // on the mixer control
    m_FaderSpan  = m_Control.Bounds.dwMaximum - m_Control.Bounds.dwMinimum;
    m_FaderStep  = m_FaderSpan/m_Control.Metrics.cSteps;
    m_SliderSpan = m_Control.Metrics.cSteps;

    SetRange( 0, m_SliderSpan ); if( m_nChannels < 2 )
    {
    // a balance, left, or right control on a single channel line doesn't make sense
    // abort and set the balance slider to mid-course
    if( m_subType == LEFT || m_subType == RIGHT || m_subType == BALANCE )
    {
    PrintMessage( "CMixerFader::Init", 
                  "Only one channel available on this line. Use Fader type MAIN only.\n"
                  "Windows control will be disabled.\n"
      "\nItem: %s.\n"
          "\n( Line: %s )", 
      GetControlName(),
          GetLineName() ); if( subType == BALANCE )
    SetSliderPos( m_SliderSpan/2 );
    CloseMixer();
    return 0;
    }
    } m_Value = (MIXERCONTROLDETAILS_UNSIGNED *)GetValuePtr();
    if( m_Value == NULL )
    {
    PrintMessage( "CMixerFader::Init", "m_Value NULL." );
    CloseMixer();
    return 0;
    } if( GetMixerControlValue() )
    {
    EnableWindow( TRUE );
    SetHVSliderPos();
    } return 1;
    }
    void CMixerFader::SetHVSliderPos()
    {
    float MaxVal; if( m_nChannels > 1 )
    {
    MaxVal = ( float )max( m_Value[RIGHT].dwValue, m_Value[LEFT].dwValue );
    if( MaxVal > 0 )
    {
    m_DeltaOverMax = ( ( float )m_Value[RIGHT].dwValue - ( float )m_Value[LEFT].dwValue )/MaxVal;
    }
    }
    else
    {
    MaxVal = ( float )m_Value[0].dwValue;
    }

    switch ( m_subType )
    {
    case MAIN: // set the main fader to the maximum value
    SetSliderPos( int( MaxVal/m_FaderStep ) );
    break; case BALANCE: // pos = m_SliderSpan/2 * ( delta/ max + 1 )
    if( MaxVal > 0 )
    {
    SetSliderPos( int( m_SliderSpan*( m_DeltaOverMax + 1.0 )/2.0 ) );
    }
    break; case LEFT: // only set the left channel slider
    SetSliderPos( int( ( float )m_Value[LEFT].dwValue/m_FaderStep ) );
    break; case RIGHT: // only set the right channel slider
    SetSliderPos( int( ( float )m_Value[RIGHT].dwValue/m_FaderStep ) );
    break; default:
    PrintMessage( "CMixerFader::SetHVSliderPos", "Wrong sub-type for a fader control." );
    }
    }
    void CMixerFader::SetFaderValue()
    {
    DWORD newVal = GetSliderValue();

    float MaxVal; if( m_nChannels > 1 )
    {
    MaxVal = ( float )max( m_Value[RIGHT].dwValue, m_Value[LEFT].dwValue );
    }
    else
    {
    MaxVal = ( float )m_Value[0].dwValue;
    } switch ( m_subType )
    {
    case MAIN:
    if( m_nChannels > 1 )
    {
    if( m_DeltaOverMax > 0 )
    {
    m_Value[RIGHT].dwValue = newVal;
    m_Value[LEFT].dwValue = DWORD( newVal*( 1.0f - m_DeltaOverMax ) );
    }
    else
    {
    m_Value[LEFT].dwValue = newVal;
    m_Value[RIGHT].dwValue = DWORD( newVal*( 1.0f + m_DeltaOverMax ) );
    }
    }
    else
    {
    m_Value[0].dwValue = newVal;
    }
    break; case BALANCE:
    if( ( int )newVal > m_FaderSpan/2 )
    {
    m_Value[RIGHT].dwValue = DWORD( MaxVal );
    m_Value[LEFT].dwValue = DWORD( 2*MaxVal*( 1.0 - ( float )newVal/m_FaderSpan ) );
    }
    else
    {
    m_Value[RIGHT].dwValue = DWORD( 2*MaxVal*( float )newVal/m_FaderSpan );
    m_Value[LEFT].dwValue = DWORD( MaxVal );
    }
    break; case LEFT:
    m_Value[LEFT].dwValue = newVal;
    break; case RIGHT:
    m_Value[RIGHT].dwValue = newVal;
    break; default:
    PrintMessage( "CMixerFader::SetFaderValue", "Wrong sub-type for a fader control." );
    return;
    }

    SetMixerControlValue();
    }
    //mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
    // Name   : GetSliderValue
    //          
    // Descr. : gets the current slider position. The value returned depends on the orientation
    //          of the slider.
    //          
    // Return : DWORD value corresponding to slider position
    //-----------------------------------------------------------------------------
    DWORD CMixerFader::GetSliderValue()
    {
    if( ( GetStyle( ) & TBS_VERT ) == TBS_VERT )
    {
    return ( ( m_SliderSpan - GetPos() ) * m_FaderStep );
    }
    else
    {
    return ( GetPos() * m_FaderStep );
    }
    }
    {
    UINT id = ( UINT )message; if( id == m_Control.dwControlID && m_HMixer == ( HMIXER )hMix )
    {
    if( GetMixerControlValue() )
    {
    SetHVSliderPos();
    }
    else
    {
    TRACE( "CMixerFader::OnMixerControlChanged --- error\n" );
    }
    } return 0L;
    }void CMixerFader::HScroll ( UINT nSBCode, UINT /*nPos*/ )
    {
    if( m_Value == NULL )
    {
    PrintMessage(  "CMixerFader::HScroll", "Error: Did you call Init() first?"  );
    return;
    }
    if( nSBCode == TB_THUMBTRACK || nSBCode == TB_ENDTRACK || nSBCode == TB_PAGEDOWN || nSBCode == TB_PAGEUP )
    {
    SetFaderValue();
    }
    }
    void CMixerFader::VScroll ( UINT nSBCode, UINT /*nPos*/ )
    {
    if( m_Value == NULL )
    {
    PrintMessage(  "CMixerFader::VScroll", "Error: Did you call Init() first?"  );
    return;
    } if( nSBCode == TB_THUMBTRACK || nSBCode == TB_ENDTRACK || nSBCode == TB_PAGEDOWN || nSBCode == TB_PAGEUP )
    {
    SetFaderValue();
    }
    }
    void CMixerFader::SetSliderPos( int value )
    {
    if( ( GetStyle( ) & TBS_VERT ) == TBS_VERT )
    {
    SetPos( m_SliderSpan - value );
    }
    else
    {
    SetPos( value );
    }
    }
    void CMixerFader::OnDestroy() 
    {
    CloseMixer();
    CSliderCtrl ::OnDestroy();
    }
    信箱?我给你发这方面整套详尽代码。
      

  5.   

    来一份
    [email protected]
    谢谢