![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Простите за, наверное, глупый вопрос. [D4, Win95/98, WinME]
Fredericco © (2002-04-04 17:35:00)Как с помощью АПИ изменить громкость звука на звуковой карте. Карта по идее имеет свои драйверы. Задача такая: играет, скажем, музыка, так вот как изменить громкость?
L.eXX (2002-05-15 03:52:00) [1]
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.
L.eXX (2002-05-01 03:15:00) [2]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-01 03:00:00) [3]Dimaond Cat:а что-то не очень понятно какие из TrackBar"ов что означают (лево/право/громкость) и какие у них должны быть свойства Max, Min, Frequency... а то чего-то MakeLong(...) с Range Check Error вылетает :(
Кстати копилятор дважды (в GetWaveVolume и SetWaveVolume) предупреждение даёт по поводуWaveOutSetVolume(WAVE_MAPPER, AVolume);- Constant expression violates subrange bounds
(компилятор D5,Win98)
Fredericco (2002-04-05 16:21:00) [4]Dimaond Cat >> Это я Wave меняю, а как все остальное поменять? Например Volume Control или Line In?
Fredericco (2002-04-05 10:42:00) [5]Dimaond Cat >> Спасибо!!
Dimaond Cat (2002-04-04 23:29:00) [6]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.