Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.12;
Скачать: CL | DM;

Вниз

Простите за, наверное, глупый вопрос.   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2002.09.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
3-35612
Corr
2002-08-22 17:28
2002.09.12
Абсолютный и относительный пути к локальной базе данных


7-35933
Sammary
2002-07-01 17:17
2002.09.12
Ошибка при копировании


14-35874
Vaddya
2002-08-17 22:05
2002.09.12
Зацените программу!


3-35575
AndbyOne
2002-08-22 10:19
2002.09.12
SQL запросик


14-35862
andrei dmitriev
2002-08-16 12:03
2002.09.12
Проблемы с созданием инсталяшки, при использовании BDE или ADO...