WEB开发网
开发学院软件开发Delphi 音量调节及静音 阅读

音量调节及静音

 2006-02-04 13:37:58 来源:WEB开发网   
核心提示: 在进行多媒体软件开发时,经常要调整各种设备的音量和设置静音,音量调节及静音,本人编写了一个单元,四个函数
 

在进行多媒体软件开发时,经常要调整各种设备的音量和设置静音,本人编写了一个单元,四个函数,分别用于获取音量(GetVolume(DN))、设置音量(SetVolume(DN,Value))、获取静音(GetVolumeMute(DN))及设置静音(SetVolumeMute(DN,Value))。

unit funVolume;

interface

uses MMSystem, Dialogs;

Type TDeviceName = (Master, Microphone, WaveOut, Synth);

function  GetVolume(DN:TDeviceName) : Word ;
PRocedure SetVolume(DN:TDeviceName; Value:Word);
function  GetVolumeMute(DN:TDeviceName) : Boolean;
procedure  SetVolumeMute(DN:TDeviceName; Value:Boolean);

implementation

//获取音量
function GetVolume(DN:TDeviceName) : Word;
var
 hMix: HMIXER;
 mxlc: MIXERLINECONTROLS;
 mxcd: TMIXERCONTROLDETAILS;
 vol: TMIXERCONTROLDETAILS_UNSIGNED;
 mxc: MIXERCONTROL;
 mxl: TMixerLine;
 intRet: Integer;
 nMixerDevs: Integer;
begin
 // Check if Mixer is available
 nMixerDevs := mixerGetNumDevs();
 if (nMixerDevs < 1) then
 begin
  Exit;
 end;

 // open the mixer
 intRet := mixerOpen(@hMix, 0, 0, 0, 0);
 if intRet = MMSYSERR_NOERROR then
 begin
  case DN of
   Master :  mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
   Microphone :
       mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
   WaveOut : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
   Synth  :  mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
  end;
  mxl.cbStruct := SizeOf(mxl);

  // get line info
  intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);

  if intRet = MMSYSERR_NOERROR then
  begin
   FillChar(mxlc, SizeOf(mxlc),0);
   mxlc.cbStruct := SizeOf(mxlc);
   mxlc.dwLineID := mxl.dwLineID;
   mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
   mxlc.cControls := 1;
   mxlc.cbmxctrl := SizeOf(mxc);

mxlc.pamxctrl := @mxc;
   intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);

if intRet = MMSYSERR_NOERROR then
   begin
    FillChar(mxcd, SizeOf(mxcd),0);
    mxcd.dwControlID := mxc.dwControlID;
    mxcd.cbStruct := SizeOf(mxcd);
    mxcd.cMultipleItems := 0;
    mxcd.cbDetails := SizeOf(Vol);
    mxcd.paDetails := @vol;
    mxcd.cChannels := 1;

  intRet := mixerGetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);

  Result := vol.dwValue ;

  if intRet <> MMSYSERR_NOERROR then
     ShowMessage('GetControlDetails Error');
   end
   else
    ShowMessage('GetLineInfo Error');
  end;
  intRet := mixerClose(hMix);
 end;
end;

//设置音量
procedure setVolume(DN:TDeviceName; Value : Word);
var
 hMix: HMIXER;
 mxlc: MIXERLINECONTROLS;
 mxcd: TMIXERCONTROLDETAILS;
 vol: TMIXERCONTROLDETAILS_UNSIGNED;
 mxc: MIXERCONTROL;
 mxl: TMixerLine;
 intRet: Integer;
 nMixerDevs: Integer;
begin
 // Check if Mixer is available
 nMixerDevs := mixerGetNumDevs();
 if (nMixerDevs < 1) then
 begin
  Exit;
 end;

 // open the mixer
 intRet := mixerOpen(@hMix, 0, 0, 0, 0);
 if intRet = MMSYSERR_NOERROR then
 begin
  case DN of
   Master :  mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
   Microphone :
       mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
   WaveOut : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
   Synth  :  mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
  end;
  mxl.cbStruct := SizeOf(mxl);

  // get line info
  intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);

  if intRet = MMSYSERR_NOERROR then
  begin
   FillChar(mxlc, SizeOf(mxlc),0);
   mxlc.cbStruct := SizeOf(mxlc);
   mxlc.dwLineID := mxl.dwLineID;
   mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
   mxlc.cControls := 1;
   mxlc.cbmxctrl := SizeOf(mxc);

mxlc.pamxctrl := @mxc;
   intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);

if intRet = MMSYSERR_NOERROR then
   begin
    FillChar(mxcd, SizeOf(mxcd),0);
    mxcd.dwControlID := mxc.dwControlID;
    mxcd.cbStruct := SizeOf(mxcd);
    mxcd.cMultipleItems := 0;
    mxcd.cbDetails := SizeOf(Vol);
    mxcd.paDetails := @vol;
    mxcd.cChannels := 1;

  vol.dwValue := Value;

  intRet := mixerSetControlDetails(hMix, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE);

  if intRet <> MMSYSERR_NOERROR then
     ShowMessage('SetControlDetails Error');
   end
   else
    ShowMessage('GetLineInfo Error');
  end;
  intRet := mixerClose(hMix);
 end;
end;

//获取静音
function  GetVolumeMute(DN:TDeviceName) : Boolean;
var
 hMix: HMIXER;
 mxlc: MIXERLINECONTROLS;
 mxcd: TMIXERCONTROLDETAILS;
 vol: TMIXERCONTROLDETAILS_UNSIGNED;
 mxc: MIXERCONTROL;
 mxl: TMixerLine;
 intRet: Integer;
 nMixerDevs: Integer;
 mcdMute: MIXERCONTROLDETAILS_BOOLEAN;
begin
 // Check if Mixer is available
 nMixerDevs := mixerGetNumDevs();
 if (nMixerDevs < 1) then
 begin
  Exit;
 end;

 // open the mixer
 intRet := mixerOpen(@hMix, 0, 0, 0, 0);
 if intRet = MMSYSERR_NOERROR then
 begin
  case DN of
   Master :  mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
   Microphone :
       mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
   WaveOut : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
   Synth  :  mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
  end;
   mxl.cbStruct     := SizeOf(mxl);

  // mixerline info
  intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);

  if intRet = MMSYSERR_NOERROR then
  begin
   FillChar(mxlc, SizeOf(mxlc),0);
   mxlc.cbStruct := SizeOf(mxlc);
   mxlc.dwLineID := mxl.dwLineID;
   mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;
   mxlc.cControls := 1;
   mxlc.cbmxctrl := SizeOf(mxc);
   mxlc.pamxctrl := @mxc;

// Get the mute control
   intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);

if intRet = MMSYSERR_NOERROR then
   begin
    FillChar(mxcd, SizeOf(mxcd),0);
    mxcd.cbStruct := SizeOf(TMIXERCONTROLDETAILS);
    mxcd.dwControlID := mxc.dwControlID;
    mxcd.cChannels := 1;
    mxcd.cbDetails := SizeOf(MIXERCONTROLDETAILS_BOOLEAN);
    mxcd.paDetails := @mcdMute;

  // Get  mute
    intRet := mixerGetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE);

  if mcdMute.fValue = 0 then Result:=false
    else Result := True;

  if intRet <> MMSYSERR_NOERROR then
     ShowMessage('SetControlDetails Error');
   end
   else
    ShowMessage('GetLineInfo Error');
  end;

  intRet := mixerClose(hMix);
 end;
end;

//设置静音
procedure  SetVolumeMute(DN:TDeviceName; Value:Boolean);
var
 hMix: HMIXER;
 mxlc: MIXERLINECONTROLS;
 mxcd: TMIXERCONTROLDETAILS;
 vol: TMIXERCONTROLDETAILS_UNSIGNED;
 mxc: MIXERCONTROL;
 mxl: TMixerLine;
 intRet: Integer;
 nMixerDevs: Integer;
 mcdMute: MIXERCONTROLDETAILS_BOOLEAN;
begin
 // Check if Mixer is available
 nMixerDevs := mixerGetNumDevs();
 if (nMixerDevs < 1) then
 begin
  Exit;
 end;

 // open the mixer
 intRet := mixerOpen(@hMix, 0, 0, 0, 0);
 if intRet = MMSYSERR_NOERROR then
 begin
  case DN of
   Master :  mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
   Microphone :
       mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
   WaveOut : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
   Synth  :  mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
  end;
   mxl.cbStruct     := SizeOf(mxl);

  // mixerline info
  intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);

  if intRet = MMSYSERR_NOERROR then
  begin
   FillChar(mxlc, SizeOf(mxlc),0);
   mxlc.cbStruct := SizeOf(mxlc);
   mxlc.dwLineID := mxl.dwLineID;
   mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;
   mxlc.cControls := 1;
   mxlc.cbmxctrl := SizeOf(mxc);
   mxlc.pamxctrl := @mxc;

// Get the mute control
   intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);

if intRet = MMSYSERR_NOERROR then
   begin
    FillChar(mxcd, SizeOf(mxcd),0);
    mxcd.cbStruct := SizeOf(TMIXERCONTROLDETAILS);
    mxcd.dwControlID := mxc.dwControlID;
    mxcd.cChannels := 1;
    mxcd.cbDetails := SizeOf(MIXERCONTROLDETAILS_BOOLEAN);
    mxcd.paDetails := @mcdMute;

  // Set and UnSet  mute
    mcdMute.fValue := Ord(Value);
    intRet := mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE);

  if intRet <> MMSYSERR_NOERROR then
     ShowMessage('SetControlDetails Error');
   end
   else
    ShowMessage('GetLineInfo Error');
  end;

  intRet := mixerClose(hMix);
 end;
end;

end.

Tags:音量 调节 静音

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接