请问大家要怎样才能设置系统的声音大小,左右声道呢?

lemon_zc1949 2004-01-18 12:31:00
请问大家要怎样才能设置系统的声音大小,左右声道呢?

是使用MCI函数嘛???
...全文
88 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lemon_zc1949 2004-01-30
  • 打赏
  • 举报
回复
lemon123zc@mail.china.com
谢谢
yintongshun 2004-01-19
  • 打赏
  • 举报
回复

调节平衡:
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();
}
信箱?我给你发这方面整套详尽代码。
yintongshun 2004-01-19
  • 打赏
  • 举报
回复

控制大小:
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;
}


anothermxw 2004-01-19
  • 打赏
  • 举报
回复
我用VTest 做过,要不你也试试?
zhucde 2004-01-19
  • 打赏
  • 举报
回复
DirectX 轻松搞定!
lemon_zc1949 2004-01-19
  • 打赏
  • 举报
回复
我试试看哦。如果可以我就加分哈。
oldbaby 2004-01-19
  • 打赏
  • 举报
回复
来一份
smartconey@yahoo.com.cn
谢谢
spark_zh 2004-01-18
  • 打赏
  • 举报
回复
一般是使用mixer的函数。
carbon107 2004-01-18
  • 打赏
  • 举报
回复
http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=707

//看看就知道了

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧