Форум: "Media";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
ВнизПростите за, наверное, глупый вопрос. Найти похожие ветки
← →
Fredericco (2002-04-04 17:35) [0]Как с помощью АПИ изменить громкость звука на звуковой карте. Карта по идее имеет свои драйверы. Задача такая: играет, скажем, музыка, так вот как изменить громкость?
← →
Dimaond Cat (2002-04-04 23:29) [1]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
Label1: TLabel;
Label2: TLabel;
TrackBar3: TTrackBar;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar3Change(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure TrackBar3Exit(Sender: TObject);
procedure TrackBar1Exit(Sender: TObject);
procedure TrackBar2Exit(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses mmsystem;
function GetWaveVolume: DWord;
var
Woc : TWAVEOUTCAPS;
Volume : DWord;
begin
result:=0;
if WaveOutGetDevCaps(WAVE_MAPPER, @Woc, sizeof(Woc)) =
MMSYSERR_NOERROR then
if Woc.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then
begin
WaveOutGetVolume(WAVE_MAPPER,@Volume);
Result := Volume;
end;
end;
procedure SetWaveVolume(const AVolume: DWord);
var
Woc : TWAVEOUTCAPS;
begin
if WaveOutGetDevCaps(WAVE_MAPPER, @Woc, sizeof(Woc)) =
MMSYSERR_NOERROR then
if Woc.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then
WaveOutSetVolume(WAVE_MAPPER, AVolume);
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
var
LeftVolume: Word;
RightVolume: Word;
begin
Label3.Caption:=IntTostr(TrackBar1.Position);
if TrackBar1.Position>TrackBar2.position then TrackBar3.Position:=TrackBar1.position;
LeftVolume :=TrackBar1.Position*655;
RightVolume := TrackBar2.Position*655;
SetWaveVolume(MakeLong(LeftVolume, RightVolume));
beep;
end;
procedure TForm1.TrackBar3Change(Sender: TObject);
var
LeftVolume: Word;
RightVolume: Word;
begin
TrackBar1.Position:=TrackBar3.position;
TrackBar2.Position:=TrackBar3.position;
Label3.Caption:=IntTostr(TrackBar1.Position);
Label4.Caption:=IntTostr(TrackBar2.Position);
LeftVolume :=TrackBar1.Position*655;
RightVolume := TrackBar2.Position*655;
SetWaveVolume(MakeLong(LeftVolume, RightVolume));
beep;
end;
procedure TForm1.TrackBar2Change(Sender: TObject);
var
LeftVolume: Word;
RightVolume: Word;
begin
Label4.Caption:=IntTostr(TrackBar2.Position);
if TrackBar2.Position>TrackBar1.position then TrackBar3.Position:=TrackBar2.position;
LeftVolume :=TrackBar1.Position*655;
RightVolume := TrackBar2.Position*655;
SetWaveVolume(MakeLong(LeftVolume, RightVolume));
beep
end;
procedure TForm1.TrackBar3Exit(Sender: TObject);
begin
beep
end;
procedure TForm1.TrackBar1Exit(Sender: TObject);
begin
beep
end;
procedure TForm1.TrackBar2Exit(Sender: TObject);
begin
beep;
end;
end.
← →
Fredericco (2002-04-05 10:42) [2]Dimaond Cat >> Спасибо!!
← →
Fredericco (2002-04-05 16:21) [3]Dimaond Cat >> Это я Wave меняю, а как все остальное поменять? Например Volume Control или Line In?
← →
L.eXX (2002-05-01 03:00) [4]Dimaond Cat: а что-то не очень понятно какие из TrackBar"ов что означают (лево/право/громкость) и какие у них должны быть свойства Max, Min, Frequency... а то чего-то MakeLong(...) с Range Check Error вылетает :(
Кстати копилятор дважды (в GetWaveVolume и SetWaveVolume) предупреждение даёт по поводуWaveOutSetVolume(WAVE_MAPPER, AVolume);
- Constant expression violates subrange bounds
(компилятор D5,Win98)
← →
L.eXX (2002-05-01 03:15) [5]Fredericco: попробуйте такую штуку (delphi4all.narod.ru):
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
...
uses MMSystem;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
cap: TAuxCaps;
begin
// создаём список устройств
for i := 0 to auxGetNumDevs - 1 do begin
auxGetDevCaps(i, Addr(cap), SizeOf(cap));
ListBox1.Items.Add(cap.szPname)
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
// увеличить громкость выбранного канала
var
vol: Longword;
LVol, RVol: Longword;
begin
AuxGetVolume(ListBox1.ItemIndex, @Vol);
LVol := Vol shr 16;
if LVol < MaxWord - 5000
then LVol := LVol + 5000
else LVol := MaxWord;
RVol := (Vol shl 16) shr 16;
if RVol < MaxWord - 5000
then RVol := RVol + 5000
else RVol := MaxWord;
AuxSetVolume(ListBox1.ItemIndex, LVol shl 16 + RVol);
end;
procedure TForm1.Button2Click(Sender: TObject);
// уменьшить громкость выбранного канала
var
vol: Longword;
LVol, RVol: Longword;
begin
AuxGetVolume(ListBox1.ItemIndex, @Vol);
LVol := Vol shr 16;
if LVol > 5000
then LVol := LVol - 5000
else LVol := 0;
RVol := (Vol shl 16) shr 16;
if RVol > 5000
then RVol := RVol - 5000
else RVol := 0;
AuxSetVolume(ListBox1.ItemIndex, LVol shl 16 + RVol);
end;
в ListBox"е надо выбрать интересующее устройство и убавлять/прибавлять громкость (сверяясь, например, с Volume Control). Хотя бы одно из устройств будет наверняка будет менять Volume Control :)
← →
L.eXX (2002-05-15 03:52) [6]
procedure SetWaveVolume(const AVolume: DWord);
var
Woc : TWAVEOUTCAPS;
begin
if WaveOutGetDevCaps(WAVE_MAPPER, @Woc, sizeof(Woc)) =
MMSYSERR_NOERROR then
if Woc.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then
WaveOutSetVolume(WAVE_MAPPER, AVolume);
end;
Сдаётся мне, что управлять громостью звука можно не через какие-то особо ничего не говорящие цифры типаSetWaveVolume(1126843178)
, а как-нибудь с помощью битовых сдвигов -shl
:)
Тем более, что выше приведённый код даже при солидных модификациях не даёт возможности увеличить звук до 100% (где-то 99 получается). Частенько с Inteteger Overflow вылетает, если что. У кого-нибудь если мысли по этому поводу (например как связаны эти огромные цифры с управлением звуком направо, налево...) Интересно!
P.S. у меня Sound Blaster PCI64, Win98.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c