希望对你有帮助当你做一个多媒体播放器时,难免少不了控制音量的大小和左右声道的播放,下面就介绍一种控制Wave波形输出设备音量的方法,该方法不是设置主音量。先在窗体上放两个TTrackBar,分别命名为TrackBar1,TrackBar2,属性Max都设置为65535,如果觉得刻度太密了,可以把Frequency属性值设置大一些,然后在Uses段加入MMSystem,并在TrackBar1和TrackBar2的OnChange事件都写上下列语句:procedure TForm1.TrackBar1Change(Sender: Tobject);
var Wave:string;
begin
Wave:='$'+inttohex(TrackBar1.Position,4)+inttohex(TrackBar2.Position,4);
waveoutsetvolume(0,strtoint(Wave));
end;
/////////////////////////////////////////////
WaveOutSetVolume(hwo: Integer; dwVolume: Cardinal);hwo is MediaPlayer1.DeviceId,example:                           Right\/ | Left\/
dwVolume for Full L+R = $FFFFFFFF
dwVolume for Full L no R = $0000FFFF
dwVolume for Full R no L = $FFFF0000
dwVolume for no sound = $00000000
/////////////////////////////////////////////////uses  MMSystemtype
  TVolType = (vtLeft, vtRight);
  TVol = array[vtLeft..vtRight] of word;procedure TVolForm.GetVolumes(var DevId : word;
                            var VolLeft, VolRight : word);
{volume is returned as a pointer to a DWord with the most
 significant word for the left channel. The channels are
 extracted by treating the DWord as a two element array and
 accessing the two array elements for the Lt and Rt volumes}
var
  Error : integer;
  MsgResponse : word;
  TempVol : TVol;
begin
  Error := AuxGetVolume(DevId, @TempVol);
  if Error <> 0 then begin
    Timer1.Enabled := false;
    MsgResponse := MessageDlg('Error Reading Volume : ' + IntToStr(Error) +
chr(13)
                              + 'DevId : ' + IntToStr(DevId) + chr(13)
                              + chr(13)
                              + 'Set Next Device ?',
                              mtError, [mbYes, mbCancel], 0);
    if MsgResponse = mrYes then {try the next Device Id}
      DevId := DevId + 1
    else begin
      DevId := 0;
      PChangeType := Nil;
    end; {else MsgResponse = mrCancel}
    Exit;
  end; {if Error <> 0}
  VolLeft := TempVol[vtLeft];
  VolRight := TempVol[vtRight];
end;procedure TVolForm.SetVolumes(DevId : word;
                            var VolLeft, VolRight : word);
{volume is set by passing a DWord value with the most
 significant word set for the left channel, and the least
 significant word set for the right channel. The channels are
 set by treating the DWord as a two element  array and
 setting the two array elements for the Lt and Rt volumes}
var
  Error : integer;
  TempVol : TVol;
begin
  TempVol[vtLeft] := VolLeft;
  TempVol[vtRight] := VolRight;
  Error := AuxSetVolume(DevId, longint(TempVol));
  if Error <> 0 then
    MessageDlg('Error Setting Volume : ' + IntToStr(Error),
               mtError, [mbOK], 0);
end;

解决方案 »

  1.   

    设定左右声道
    用Mcisendstring("set left audio on")
      

  2.   

    控制左右声道
    在窗体中加trackbar,把max:255;
    在uses中加mmsystem
    在onchange中
    var t,v:longint;
    begin
    t:=trackbar1.position;
    v:=(r shl 8) or (t shl 24);
    waveoutsetvolume(0,v);
    end;
    左 
    var t,v:longint;
    begin
    t:=trackbar1.poition;
    waveoutgetvonme(0,@v);
    v:=v and $ffff0000 or (t shl 8);
    waveoutsetvolume(0,v);
    end;

    var t,v:logint;
    begin
    t:=trackbar2.position;
    waveoutgetvolume(0,@v);
    v:=v and $0000ffff or (t shl 24);
    waveoutsetvolume(0,v);
    end;
    初始
    var v:longint;
    waveoutgetvolum(0,@v);
    trackbar1.position:=hi(v);
    trackbar2.position:=hi(v shr 16);
    end;
      

  3.   

    我做了一个KTV卡啦OK点播系统时也遇到了这个问题,要用这段程序你就只能用Borland的提供的那个MediaPlayer控件,不能用Windows的那个MediaPlayer OCX控件,我怎么试也没有效果 :( 我看过Borland的那个MediaPlayer控件的源码是封装的MCI API……算了看源码吧,我的第一个版本就是这样解决的 ^^首先 User mmSystem 单元定义:
    const
      //声道控制部分
      MCI_SETAUDIO= $873;
      MCI_SETVIDEO=$0876;
      MCI_DGV_SETAUDIO_SOURCE_LEFT=1;
      MCI_DGV_SETAUDIO_SOURCE_STEREO=0;
      MCI_DGV_SETAUDIO_SOURCE_RIGHT=2;
      MCI_DGV_SETAUDIO_SOURCE=$4004;
      MCI_DGV_SETAUDIO_VALUE=$01000000;
      MCI_DGV_SETAUDIO_ITEM=$00800000;  MCI_DGV_SETAUDIO_VOLUME=$4002;  //++音量大小控制
      MAX_VOLUME=65535;               //++
      MIN_VOLUME=0;                   //++type //音量控制
      MCI_DGV_SETAUDIO_PARMS=record
        dwCallback:DWORD;
        dwItem:DWORD;
        dwValue:DWORD;
        dwOver:DWORD;
        lpstrAlgorithm:PChar;
        lpstrQuality:PChar;
    end;//*************************************左右声道控制*****************************************//
    //  L -- 左声道 R -- 右声道 C -- 立体声
    //*****************************************************************************************//
    procedure LRC(Str: String);
    var
      s: MCI_DGV_SETAUDIO_PARMS ;
      err:integer;
      buf:array[0..1000] of char;
    begin  if MediaPlayer11.DeviceID>0 then
      begin
        //播放中一定要先关闭声音,否则没效果
        err:=mciSendCommand(MediaPlayer11.DeviceID,MCI_SETAUDIO, MCI_SET_OFF ,integer(@s));
        if(err<>0)then
        begin
          mciGetErrorString(err,buf,sizeof(buf) );
          FormMain.MessageBoxShow('1',buf,2,True,10000);
          //ShowMessage(buf);
        end;
        if Str='C' then
          s.dwValue:=MCI_DGV_SETAUDIO_SOURCE_STEREO; //右声道源
        if Str='L' then
          s.dwValue:=MCI_DGV_SETAUDIO_SOURCE_Left; //右声道源
        if Str='R' then
          s.dwValue:=MCI_DGV_SETAUDIO_SOURCE_Right; //右声道源
        s.dwItem:=MCI_DGV_SETAUDIO_SOURCE;
        //下面的MCI_DGV_SETAUDIO_VALUE 一定不能少
        err:=mciSendCommand(MediaPlayer11.DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_VALUE or MCI_DGV_SETAUDIO_ITEM ,integer(@s));
        if (err<>0) then
        begin
          mciGetErrorString(err,buf,sizeof(buf) );
          FormMain.MessageBoxShow('1',buf,2,True,10000);
          //ShowMessage(buf);
        end;
        //再打开声音,就是你所要的
        err:=mciSendCommand(MediaPlayer11.DeviceID,MCI_SETAUDIO, MCI_SET_ON ,integer(@s));
        if (err<>0) then
        begin
          mciGetErrorString(err,buf,sizeof(buf) );
          FormMain.MessageBoxShow('1',buf,2,True,10000);
        end;
      end;
    end;
      

  4.   

    哦,对了FormMain.MessageBoxShow('1',buf,2,True,10000);是我自己做的一个对话框,你直接去了就行了,那里不重要,只是提示出了什么错误,因为我的系统不能用Windows系统提供的对话框……
      

  5.   

    uses MMSystem;MCISendString(PChar('open new type waveaudio alias capture'), lpszReturnString, lstrlen(lpszReturnString), nil);MCISendString(PChar('setaudio right on'), ...);自己查一下吧,好几年没写了!
    你也可以使用MCISendCommand,差不多了!
    如果不行我给你查!包括立体声,左声道,右声道。左边喇叭开、关等等。
    其中一部分用 Setaudio
    一部分使用 set audio--The end;
      

  6.   

    setaudio + AliasName + 
    source to left 
    source to right
    source to average
    source to stereo---The end;