|
Вопрос # 1 145/ вопрос открыт / |
|
Приветствую, уважаемые эксперты! Есть ли в Delphi функция управления громкостью динамиков?
 |
Вопрос задал: Leonardo (статус: Посетитель)
Вопрос отправлен: 27 ноября 2007, 20:58
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: min@y™
Почитай хэлп по функции из модуля mmsystem.pas:
function auxSetVolume; external mmsyst name 'auxSetVolume';
В Delphi World есть несколько примеров её использования. Вот один из них:
procedure SetVolume(X: Word);
var
iErr: Integer;
i: integer;
a: TAuxCaps;
begin
for i := 0 to auxGetNumDevs do
begin
auxGetDevCaps(i, Addr(a), SizeOf(a));
if a.wTechnology = AUXCAPS_CDAUDIO then
break;
end;
// Устанавливаем одинаковую громкость для левого и правого каналов.
// VOLUME := LEFT*$10000 + RIGHT*1
iErr := auxSetVolume(i, (X * $10001));
if (iErr‹›0) then
ShowMessage('No audio devices are available!');
end;
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 28 ноября 2007, 08:28
|
Ответ #2. Отвечает эксперт: Feniks
Здравствуйте, Leonardo!
Дополнение к min@y™.
В Приложении еще пару способов и целый компонент... ;-)
Приложение: Переключить в обычный режим- function GetVolume: Word;
- var
- iErr : Integer;
- i: integer;
- a: TAuxCaps;
- vol: word;
- begin
- for i := 0 to auxGetNumDevs do begin
- auxGetDevCaps(i,Addr(a),SizeOf(a));
- If a.wTechnology = AUXCAPS_CDAUDIO Then break;
- end;
- iErr:=auxGetVolume(i,addr(vol));
- GetVolume := vol;
-
- end;
-
-
- procedure GetVolume(var volL, volR: Word);
- var
- hWO: HWAVEOUT;
- waveF: TWAVEFORMATEX;
- vol: DWORD;
- begin
- volL := 0;
- volR := 0;
- // init TWAVEFORMATEX
- FillChar(waveF, SizeOf(waveF), 0);
- // open WaveMapper = std output of playsound
- waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
- // get volume
- waveOutGetVolume(hWO, @vol);
- volL := vol and $FFFF;
- volR := vol shr 16;
- waveOutClose(hWO);
- end;
-
- procedure SetVolume(const volL, volR: Word);
- var
- hWO: HWAVEOUT;
- waveF: TWAVEFORMATEX;
- vol: DWORD;
- begin
- // init TWAVEFORMATEX
- FillChar(waveF, SizeOf(waveF), 0);
- // open WaveMapper = std output of playsound
- waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
- vol := volL + volR shl 16;
- // set volume
- waveOutSetVolume(hWO, vol);
- waveOutClose(hWO);
- end;
-
-
- 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.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;
-
-
- unit Volumes;
-
- interface
-
- uses
- Windows, Messages, Classes, ExtCtrls, ComCtrls, MMSystem;
-
- const
- CDVolume = 0;
- WaveVolume = 1;
- MidiVolume = 2;
-
- type
- TVolumeControl = class(TComponent)
- private
- FDevices : array[0..2] of Integer;
- FTrackBars : array[0..2] of TTrackBar;
- FTimer : TTimer;
- function GetInterval: Integer;
- procedure SetInterval(AInterval: Integer);
- function GetVolume(AIndex: Integer): Byte;
- procedure SetVolume(AIndex: Integer; aVolume: Byte);
- procedure InitVolume;
- procedure SetTrackBar(AIndex: Integer; ATrackBar: TTrackBar);
- { Private declarations }
- procedure Update(Sender: TObject);
- procedure Changed(Sender: TObject);
- protected
- { Protected declarations }
- procedure Notification(AComponent: TComponent; AOperation:
- TOperation); override;
- public
- { Public declarations }
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- published
- { Published declarations }
- property Interval: Integer read GetInterval write SetInterval default
- 500;
- property CDVolume: Byte index 0 read GetVolume write SetVolume stored
- False;
- property CDTrackBar: TTrackBar index 0 read FTrackBars[0] write
- SetTrackBar;
- property WaveVolume: Byte index 1 read GetVolume write SetVolume
- stored False;
- property WaveTrackBar: TTrackBar index 1 read FTrackBars[1] write
- SetTrackBar;
- property MidiVolume: Byte index 2 read GetVolume write SetVolume
- stored False;
- property MidiTrackBar: TTrackBar index 2 read FTrackBars[2] write
- SetTrackBar;
- end;
-
- procedure Register;
-
- implementation
-
- procedure Register;
- begin
- RegisterComponents('Any', [TVolumeControl]);
- end;
-
- type
- TVolumeRec = record
- case Integer of
- 0: (LongVolume: Longint);
- 1: (LeftVolume,
- RightVolume : Word);
- end;
-
- function TVolumeControl.GetInterval: Integer;
- begin
- Result := FTimer.Interval;
- end;
-
- procedure TVolumeControl.SetInterval(AInterval: Integer);
- begin
- FTimer.Interval := AInterval;
- end;
-
- function TVolumeControl.GetVolume(AIndex: Integer): Byte;
- var Vol: TVolumeRec;
- begin
- Vol.LongVolume := 0;
- if FDevices[AIndex] < > -1 then
- case AIndex of
- 0: auxGetVolume(FDevices[AIndex], @Vol.LongVolume);
- 1: waveOutGetVolume(FDevices[AIndex], @Vol.LongVolume);
- 2: midiOutGetVolume(FDevices[AIndex], @Vol.LongVolume);
- end;
- Result := (Vol.LeftVolume + Vol.RightVolume) shr 9;
- end;
-
- procedure TVolumeControl.SetVolume(aIndex: Integer; aVolume: Byte);
- var Vol: TVolumeRec;
- begin
- if FDevices[AIndex] < > -1 then
- begin
- Vol.LeftVolume := aVolume shl 8;
- Vol.RightVolume := Vol.LeftVolume;
- case AIndex of
- 0: auxSetVolume(FDevices[AIndex], Vol.LongVolume);
- 1: waveOutSetVolume(FDevices[AIndex], Vol.LongVolume);
- 2: midiOutSetVolume(FDevices[AIndex], Vol.LongVolume);
- end;
- end;
- end;
-
- procedure TVolumeControl.SetTrackBar(AIndex: Integer; ATrackBar:
- TTrackBar);
- begin
- if ATrackBar < > FTrackBars[AIndex] then
- begin
- FTrackBars[AIndex] := ATrackBar;
- Update(Self);
- end;
- end;
-
- AOperation: TOperation);
- var I: Integer;
- begin
- inherited Notification(AComponent, AOperation);
- if (AOperation = opRemove) then
- for I := 0 to 2 do if (AComponent = FTrackBars[I])
- then FTrackBars[I] := Nil;
- end;
-
- procedure TVolumeControl.Update(Sender: TObject);
- var I: Integer;
- begin
- for I := 0 to 2 do
- if Assigned(FTrackBars[I]) then
- with FTrackBars[I] do
- begin
- Min := 0;
- Max := 255;
- if Orientation = trVertical
- then Position := 255 - GetVolume(I)
- else Position := GetVolume(I);
- OnChange := Self.Changed;
- end;
- end;
-
- constructor TVolumeControl.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- FTimer := TTimer.Create(Self);
- FTimer.OnTimer := Update;
- FTimer.Interval := 500;
- InitVolume;
- end;
-
- destructor TVolumeControl.Destroy;
- var I: Integer;
- begin
- FTimer.Free;
- for I := 0 to 2 do
- if Assigned(FTrackBars[I]) then
- FTrackBars[I].OnChange := Nil;
- inherited Destroy;
- end;
-
- procedure TVolumeControl.Changed(Sender: TObject);
- var I: Integer;
- begin
- for I := 0 to 2 do
- if Sender = FTrackBars[I] then
- with FTrackBars[I] do
- begin
- if Orientation = trVertical
- then SetVolume(I, 255 - Position)
- else SetVolume(I, Position);
- end;
- end;
-
- procedure TVolumeControl.InitVolume;
- var AuxCaps : TAuxCaps;
- WaveOutCaps : TWaveOutCaps;
- MidiOutCaps : TMidiOutCaps;
- I,J : Integer;
- begin
- FDevices[0] := -1;
- for I := 0 to auxGetNumDevs - 1 do
- begin
- auxGetDevCaps(I, @AuxCaps, SizeOf(AuxCaps));
- if (AuxCaps.dwSupport and AUXCAPS_VOLUME) < > 0 then
- begin
- FTimer.Enabled := True;
- FDevices[0] := I;
- break;
- end;
- end;
- FDevices[1] := -1;
- for I := 0 to waveOutGetNumDevs - 1 do
- begin
- waveOutGetDevCaps(I, @WaveOutCaps, SizeOf(WaveOutCaps));
- if (WaveOutCaps.dwSupport and WAVECAPS_VOLUME) < > 0 then
- begin
- FTimer.Enabled := True;
- FDevices[1] := I;
- break;
- end;
- end;
- FDevices[2] := -1;
- for I := 0 to midiOutGetNumDevs - 1 do
- begin
- MidiOutGetDevCaps(I, @MidiOutCaps, SizeOf(MidiOutCaps));
- if (MidiOutCaps.dwSupport and MIDICAPS_VOLUME) < > 0 then
- begin
- FTimer.Enabled := True;
- FDevices[2] := I;
- break;
- end;
- end;
- end;
-
- end.
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 28 ноября 2007, 10:09
Оценка за ответ: 5
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|