Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-35645
Starkom
2002-08-30 11:28
2002.09.12
Можно ли использовать в C++ Buildere 5 модули из Delphi 5?


1-35654
CashDi
2002-08-31 12:05
2002.09.12
Размер текстового файла


1-35719
Mr.Kirya
2002-09-02 19:21
2002.09.12
Несколько вопросов по RichEdit


3-35610
Shrek
2002-08-20 17:40
2002.09.12
BDE


3-35609
ShuraGrp
2002-08-22 16:28
2002.09.12
TDataSet.Open приводит к тому, что все поля Visible = false





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский