我爱彩虹 发表于 2005-5-2 11:14

[求助]媒体播放时怎样控制音量

小弟最近在用CB做播放器,基本功能都实现了,就是不能控制音量,还有就是播放窗口不能变大和变小,请高手帮忙看看该怎么办?

ilikenba 发表于 2005-5-3 11:46

<DIV class=HtmlCode>
<P>//---------------------------------------------------------------------------</P>
<P>#ifndef SoundControlH
#define SoundControlH
//---------------------------------------------------------------------------
#include &lt;Classes.hpp&gt;
#include &lt;mmsystem.h&gt;
#include &lt;mmreg.h&gt;</P>
<P>
bool GetVolumeControl(HMIXER hmixer ,long componentType,long ctrlType,MIXERCONTROL* mxc);</P>
<P>long GetMuteValue(HMIXER hmixer ,MIXERCONTROL *mxc) ;
unsigned GetVolumeValue(HMIXER hmixer ,MIXERCONTROL *mxc);
bool SetVolumeValue(HMIXER hmixer ,MIXERCONTROL *mxc, long volume);
bool SetMuteValue(HMIXER hmixer ,MIXERCONTROL *mxc, bool mute);</P>
<P>
//下面四个是输出函数,可以自己调用
bool WINAPI SetVolume(long dev,long vol);//设置设备的音量
unsigned WINAPI GetVolume(int dev);//得到设备的音量dev=0主音量,1WAVE ,2MIDI ,3 LINE IN</P>
<P>bool WINAPI SetMute(long dev,bool vol);//设置设备静音
bool WINAPI GetMute(long dev);
#endif</P>

<P>bool GetVolumeControl(HMIXER hmixer ,long componentType,long ctrlType,MIXERCONTROL* mxc)
{
MIXERLINECONTROLS mxlc;
MIXERLINE mxl;
mxl.cbStruct = sizeof(mxl);
mxl.dwComponentType = componentType;
if(!mixerGetLineInfo((HMIXEROBJ)hmixer, &amp;mxl, MIXER_GETLINEINFOF_COMPONENTTYPE))
{
mxlc.cbStruct = sizeof(mxlc);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = ctrlType;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = mxc;
if(mixerGetLineControls((HMIXEROBJ)hmixer,&amp;mxlc,MIXER_GETLINECONTROLSF_ONEBYTYPE))
return 0;
else
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
long GetMuteValue(HMIXER hmixer ,MIXERCONTROL *mxc)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_BOOLEAN mxcdMute;
mxcd.hwndOwner = 0;
mxcd.cbStruct = sizeof(mxcd);
mxcd.dwControlID = mxc-&gt;dwControlID;
mxcd.cbDetails = sizeof(mxcdMute);
mxcd.paDetails = &amp;mxcdMute;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
if (mixerGetControlDetails((HMIXEROBJ)hmixer, &amp;mxcd,MIXER_OBJECTF_HMIXER|MIXER_GETCONTROLDETAILSF_VALUE))
return -1;
return mxcdMute.fValue;
} </P>
<P>//---------------------------------------------------------------------------
unsigned GetVolumeValue(HMIXER hmixer ,MIXERCONTROL *mxc)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED vol; vol.dwValue=0;
mxcd.hwndOwner = 0;
mxcd.cbStruct = sizeof(mxcd);
mxcd.dwControlID = mxc-&gt;dwControlID;
mxcd.cbDetails = sizeof(vol);
mxcd.paDetails = &amp;vol;
mxcd.cChannels = 1;
if(mixerGetControlDetails((HMIXEROBJ)hmixer, &amp;mxcd, MIXER_OBJECTF_HMIXER|MIXER_GETCONTROLDETAILSF_VALUE))
return -1;
return vol.dwValue;
} </P>
<P>//---------------------------------------------------------------------------
bool SetMuteValue(HMIXER hmixer ,MIXERCONTROL *mxc, bool mute)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_BOOLEAN mxcdMute;mxcdMute.fValue=mute;
mxcd.hwndOwner = 0;
mxcd.dwControlID = mxc-&gt;dwControlID;
mxcd.cbStruct = sizeof(mxcd);
mxcd.cbDetails = sizeof(mxcdMute);
mxcd.paDetails = &amp;mxcdMute;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
if (mixerSetControlDetails((HMIXEROBJ)hmixer, &amp;mxcd, MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE))
return 0;
return 1;
} </P>
<P>//---------------------------------------------------------------------------</P>
<P>bool SetVolumeValue(HMIXER hmixer ,MIXERCONTROL *mxc, long volume)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED vol;vol.dwValue = volume;
mxcd.hwndOwner = 0;
mxcd.dwControlID = mxc-&gt;dwControlID;
mxcd.cbStruct = sizeof(mxcd);
mxcd.cbDetails = sizeof(vol);
mxcd.paDetails = &amp;vol;
mxcd.cChannels = 1;
if(mixerSetControlDetails((HMIXEROBJ)hmixer, &amp;mxcd, MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE))
return 0;
return 1;
} </P>
<P>
//---------------------------------------------------------------------------
unsigned WINAPI GetVolume(int dev)//得到设备的音量dev=0主音量,1WAVE ,2MIDI ,3 LINE IN
{</P>
<P>long device;unsigned rt=0;
MIXERCONTROL volCtrl;
HMIXER hmixer;
switch (dev)
{
case 1:
device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT; break;
case 2:
device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER; break;
case 3:
// device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break; // cd 音量
// device=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE; break; //麦克风音量
// device=MIXERLINE_COMPONENTTYPE_SRC_LINE; break; //PC 扬声器音量
device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break; </P>
<P>default:
device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
}</P>
<P>if(mixerOpen(&amp;hmixer, 0, 0, 0, 0)) return 0;
if(!GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_VOLUME,&amp;volCtrl))
return 0;
rt=GetVolumeValue(hmixer,&amp;volCtrl)*100/volCtrl.Bounds.lMaximum;
mixerClose(hmixer);
return rt;</P>
<P>}</P>
<P>//---------------------------------------------------------------------------</P>
<P>bool WINAPI SetVolume(long dev,long vol)//设置设备的音量
{
// dev =0,1,2 分别表示主音量,波形,MIDI ,LINE IN
// vol=0-100 表示音量的大小 , 设置与返回音量的值用的是百分比,即音量从0 - 100,而不是设备的绝对值
// retrun false 表示设置音量的大小的操作不成功
// retrun true 表示设置音量的大小的操作成功</P>
<P>long device;
bool rc=false;
MIXERCONTROL volCtrl;
HMIXER hmixer;
switch (dev)
{
case 1:
device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT; break;
case 2:
device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER; break;
case 3:
device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break;</P>
<P>default:
device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
} </P>
<P>if(mixerOpen(&amp;hmixer, 0, 0, 0, 0)) return 0;</P>
<P>if(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_VOLUME,&amp;volCtrl))
{
vol=vol*volCtrl.Bounds.lMaximum/100;
if(SetVolumeValue(hmixer,&amp;volCtrl,vol))
rc=true;
}
mixerClose(hmixer);
return rc;
} </P>
<P>//---------------------------------------------------------------------------</P>
<P>bool WINAPI SetMute(long dev,bool vol)//设置设备静音
{
// dev =0,1,2 分别表示主音量,波形,MIDI ,LINE IN
// vol=0,1 分别表示取消静音,设置静音
// retrun false 表示取消或设置静音操作不成功
// retrun true 表示取消或设置静音操作成功</P>
<P>long device;
bool rc=false;
MIXERCONTROL volCtrl;
HMIXER hmixer;
switch (dev)
{
case 1:
device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT; break;
case 2:
device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER; break;
case 3:
device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break; </P>
<P>default:
device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
} </P>
<P>if(mixerOpen(&amp;hmixer, 0, 0, 0, 0)) return 0;
if(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_MUTE,&amp;volCtrl))
if(SetMuteValue(hmixer,&amp;volCtrl,(bool)vol))
rc=true;
mixerClose(hmixer);
return rc;
} </P>
<P>//---------------------------------------------------------------------------</P>
<P>bool WINAPI GetMute(long dev)//检查设备是否静音
{
//dev =0,1,2 分别表示主音量,波形,MIDI ,LINE IN
// retrun false 表示没有静音
// retrun true 表示静音
long device;
bool rc=false;
MIXERCONTROL volCtrl;
HMIXER hmixer;
switch (dev)
{
case 1:
device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT; break;
case 2:
device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER; break;
case 3:
device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break;
default:
device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
} </P>
<P>if(mixerOpen(&amp;hmixer, 0, 0, 0, 0)) return 0; </P>
<P>if(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_MUTE,&amp;volCtrl))
rc=GetMuteValue(hmixer,&amp;volCtrl);
mixerClose(hmixer);
return rc;</P>
<P>}</P></DIV>
<P><b><EM><FONT style="BACKGROUND-COLOR: #fdfddf" face=Tahoma>上面的存为SoundControl.h</FONT></EM></b></P>
<DIV class=HtmlCode>
<P>#include &lt;vcl.h&gt;
#pragma hdrstop
#include "SoundControl.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{</P>
<P>}</P>
<P>void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
SetMute(0,CheckBox1-&gt;Checked);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
     SetVolume(0,TrackBar1-&gt;Position);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TrackBar1-&gt;Position = GetVolume(1);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    CheckBox1-&gt;Checked=  GetMute(0);
}</P></DIV>

我爱彩虹 发表于 2005-5-6 11:52

<FONT color=#000066><b>ilikenba大哥,</b><FONT color=#000000></FONT><b>在麻烦你哈,我要是想在播放的时候把播放的视频或音频文件的时显示出来,我该怎么办啊??这几天为了这个我头都搞大了.</b></FONT>

小菜菜同学 发表于 2005-5-6 14:10

是不是可以加个时间控件呀,用<b><FONT color=#000066>播放开关控制?</FONT></b>

ilikenba 发表于 2005-5-6 15:55

<P>可以!</P>

我爱彩虹 发表于 2005-5-6 22:10

怎么在时间控件里添加代码啊?

我爱彩虹 发表于 2005-5-6 23:45

<P>我定义了两个窗体:Form1和Form2, 保存为:Unit1.h和Unit2.h,其中Form1是主窗体,Form2是副窗体,我想实现的功能是Form1能够调用Form2,于是我在Form1中添加了Unit2.h,这种样子:</P><P>#include &lt;vcl.h&gt;
#pragma hdrstop
#include "SoundControl.h"
#include "Unit1.h"//主窗体
#include "Unit2.h"//复窗体</P><P>结果运行的时候就要报下面的错误:</P><P> Unresolved external '_playForm' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\主窗口\UNIT1.OBJ</P><P>各位大虾,我该怎么修改才能调用Form2啊?</P>

ilikenba 发表于 2005-5-7 01:40

你是将Form2的类包含进去了,应该没有问题!

ilikenba 发表于 2005-5-7 01:44

在Timer的OnTimer事件中添加代码,要将Enabled属性设成true,才开始执行!
页: [1]
查看完整版本: [求助]媒体播放时怎样控制音量