|
|
Изменение громкости звуков в
Windows
Вот пример для доступа к системному динамику: Вначале две процедуры общения с внешними устройствами, таки работающие под WIN95 и NT,несмотря на то, что разработчики софта хотят программеров все дальше и дальше оттодвинуть от железа!
// Вывод в порт внешнего устройства с адресом-ADR, байта-data
procedure OutPort(adr: word; data: byte);
begin
asm
mov dx,adr
mov al,data
out dx,al
end;
end;
// Ввод из порта внешнего устройства с адресом-ADR
function InPort(adr: word):byte;
begin
asm
mov dx,adr
in al,dx
mov @result,al
end;
end;
// Процедура доступа до системного динамика и организация beep.
// Организуя задержку, независимую от скорости процессора, например
// через функцию GetTickCount, можно сделать все более корректно.
procedure TForm1.Button1Click(Sender: TObject);
var b: byte;
n,m: word;
begin
b:=Inport($61);
for n:=1 to 200 do begin {n:=200 - длительность звучания}
{m:=700 - частота звучания}
for m:=1 to 700 do Outport($61,b and not(2)); {установить 2-ой бит в 0}
for m:=1 to 700 do Outport($61,b or 2); {установить 2-ой бит в 1}
end;
end; uses MMSystem;
function GetWaveVolume: DWord;
var Woc : TWaveOutCaps;
Volume : DWord;
begin
result:=0;
if WaveOutGetDevCaps(WAVE_MAPPER, @Woc, sizeof(Woc)) =
MMSYSERR_NOERROR then begin
if Woc.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then begin
WaveOutGetVolume(WAVE_MAPPER, @Volume);
Result := Volume;
end;
end;
end;
procedure SetWaveVolume(const AVolume: DWord);
var Woc : TWaveOutCaps;
begin
if WaveOutGetDevCaps(WAVE_MAPPER, @Woc, sizeof(Woc)) =
MMSYSERR_NOERROR then begin
if Woc.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then
WaveOutSetVolume(WAVE_MAPPER, AVolume);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Beep;
end;
procedure TForm1.Button2Click(Sender: TObject);
var LeftVolume: Word;
RightVolume: Word;
begin
LeftVolume := StrToInt(Edit1.Text);
RightVolume := StrToInt(Edit2.Text);
SetWaveVolume(MakeLong(LeftVolume, RightVolume));
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Caption := IntToStr(GetWaveVolume);
end;