16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"ボリューム(音量)を変える"
この発言に対し以下のコメントが寄せられています
#00871 河邦 正 さん RE:ボリューム(音量)を変える【訂正】
Title: ボリューム(音量)を変える
ダブルクリックで出る音量コントロールの WAVE ボリュームだけなら、
uses MMSystem;
auxSetVolume(uDeviceID: UINT; dwVolume: DWORD);
または、
MediaPlayer に MCIWNDM_SETVOLUME // WM_USER + 110 を送付
で変更できます。全体のボリューム調整はちょっと面倒です。
いや、MCIコマンドの達人なら簡単かも知れません。でも私は MCIコマ
ンドにうといんで...^^;)
// 全体のボリュームを変える例です
{
SetVolume: ミキサーのミックス済みボリュームを設定します。
MixerID: ミキサーのID(mixerGetNumDevs を参照)
DstID: ミックス済ラインの番号(mixerGetDevCaps を参照)
Value: ボリューム、0 〜 65535
}
function SetVolume(MixerID, DstID: Integer; Value: WORD): Boolean;
var
mmr: MMRESULT;
DstLine: TMixerLine;
MixerLineControls: TMixerLineControls;
MixerCtrl: TMixerControl;
MixerCtrlDetails: TMixerControlDetails;
i: Integer;
Volumes: Pointer;
begin
ZeroMemory(@DstLine, sizeof(DstLine));
with DstLine do
begin
cbStruct := 1024;
dwDestination := DstID;
end;
mmr := mixerGetLineInfo(MixerID, @DstLine,
MIXER_GETLINEINFOF_DESTINATION or MIXER_OBJECTF_MIXER);
if mmr = MMSYSERR_NOERROR then
begin
ZeroMemory(@MixerLineControls, sizeof(MixerLineControls));
with MixerLineControls do
begin
cbStruct := sizeof(TMixerLineControls);
cbmxctrl := sizeof(TMixerControl);
dwLineID := DstLine.dwLineID;
dwControlType := MIXERCONTROL_CT_CLASS_FADER or
MIXERCONTROL_CONTROLTYPE_VOLUME;
pamxctrl := @MixerCtrl;
cControls := 1;
end;
ZeroMemory(@MixerCtrl, sizeof(MixerCtrl));
with MixerCtrl do
cbStruct := sizeof(TMIXERCONTROL);
mmr := mixerGetLineControls(MixerID, @MixerLineControls,
MIXER_GETLINECONTROLSF_ONEBYTYPE or MIXER_OBJECTF_MIXER);
if mmr = MMSYSERR_NOERROR then
begin
ZeroMemory(@MixerCtrlDetails, sizeof(MixerCtrlDetails));
with MixerCtrlDetails do
begin
cbStruct := sizeof(TMIXERCONTROLDETAILS);
dwControlID := MixerCtrl.dwControlID;
cChannels := DstLine.cChannels;
cbDetails := sizeof(TMIXERCONTROLDETAILSUNSIGNED);
GetMem(Volumes, cChannels * sizeof(DWORD));
try
paDetails := Volumes;
for i := 0 to cChannels - 1 do
PDWORD(Integer(Volumes) + sizeof(DWORD) * i)^ := value;
mmr := mixerSetControlDetails(MixerID, @MixerCtrlDetails,
MIXER_OBJECTF_MIXER or MIXER_SETCONTROLDETAILSF_VALUE);
finally
FreeMem(Volumes);
end;
end;
end
else; // ERROR of 'mixerGetLineControls'
end
else; // ERROR of 'mixerGetLineInfo'
Result := mmr = MMSYSERR_NOERROR;
end;
// TrackBar に合わせてボリュームを変える場合
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
with TrackBar1 do
begin
{
サウンドカード1枚差しのスピーカー音量なら、
MixerID = 0
DstID = 0
でほぼ問題ないです。
でも、金を取るソフトを書く場合はちゃんと設定しましょう!
}
if not SetVolume(0, 0, Position * $ffff div Max) then
ShowMessage('ボリューム設定に失敗しました');
end;
end;
1998/04/20、河邦 正(GCC02240@niftyserve.or.jp)
Original document by 河邦 正 氏 ID:(GCC02240)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|