Einstellen der Masterlautstärke des Mixers

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
uli_soehnel
Rookie
Rookie
Beiträge: 13
Registriert: Mi, 16. Jan 2008 10:44
Wohnort: Schwäbisch Gmünd

Einstellen der Masterlautstärke des Mixers

Beitrag von uli_soehnel »

Guten Morgen,

ich möchte in meiner Anwendung gewährleisten, dass eine bestimmte WAV-Ansage, welche über MMI abgespielt wird, auch wirkliuch gehört wird, auch wenn die Lautstärke auf Minimum steht. Es ist gewährleistet, dass der Wave-Kanal nicht auf 0 steht, aber die Masterlautstärke könnte auf 0 stehen. Mittels des MMI habe ich keine Möglichkeit gefunden, die Masterlautstärke zu ändern. Ich habe ein Beispiel in C gefunden, welches ich aber nicht schaffe, ins Xbase zu übertragen, da ich nicht weiß, wie die erforderlichen Strukturen erzeugt, bzw. konvertiert werden.

Im Voraus vielen Dank

Uli
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Einstellen der Masterlautstärke des Mixers

Beitrag von AUGE_OHR »

hi,
uli_soehnel hat geschrieben: ich möchte in meiner Anwendung gewährleisten, dass eine bestimmte WAV-Ansage, welche über MMI abgespielt wird, auch wirkliuch gehört wird, auch wenn die Lautstärke auf Minimum steht. Es ist gewährleistet, dass der Wave-Kanal nicht auf 0 steht, aber die Masterlautstärke könnte auf 0 stehen. Mittels des MMI habe ich keine Möglichkeit gefunden, die Masterlautstärke zu ändern. Ich habe ein Beispiel in C gefunden, welches ich aber nicht schaffe, ins Xbase zu übertragen, da ich nicht weiß, wie die erforderlichen Strukturen erzeugt, bzw. konvertiert werden.
hm ...

Code: Alles auswählen

METHOD BDVideo:SetVolume(nLevel)
  DEFAULT nLevel TO 100
  IF nLevel < 0
    nLevel := 0
  ENDIF
  IF nLevel > 100
    nLevel := 100
  ENDIF
  ::volume := nLevel
  ::error := mmSendString( "setaudio movie volume to "+ALLTRIM(STR(INT(nLevel*10))), @::Ret )
  ::getErrorString()
RETURN
"wirkt" das "nur" auf den "WAV" Kanal oder auf den "Master" ?
und wenn "Master":volume = 0 oder "Master":mute = .T. ?

was für ein *.OCX nimmt du genau ?

... und wenn der User den "Strom" für seine "aktive" Boxen abgestellt hat ?
gruss by OHR
Jimmy
uli_soehnel
Rookie
Rookie
Beiträge: 13
Registriert: Mi, 16. Jan 2008 10:44
Wohnort: Schwäbisch Gmünd

Re: Einstellen der Masterlautstärke des Mixers

Beitrag von uli_soehnel »

Hallo Jimmy,

die Methode :setvolume ist für waveaudio nicht definiert, sondern hauptsächlich für digitale Medien, wie Videos.

Gruß Uli
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Einstellen der Masterlautstärke des Mixers

Beitrag von AUGE_OHR »

hi,
uli_soehnel hat geschrieben: die Methode :setvolume ist für waveaudio nicht definiert, sondern hauptsächlich für digitale Medien, wie Videos.
die Methode gehört zu BDVideo wie es dort steht, aber es werden die MCI Commands verwendet.
http://msdn.microsoft.com/en-us/library ... S.85).aspx

da du nicht sagst welche *.OCX/DLL/API ist Hilfe schwer ... mein WMPlayer kann es mit einer der
Methoden.
gruss by OHR
Jimmy
uli_soehnel
Rookie
Rookie
Beiträge: 13
Registriert: Mi, 16. Jan 2008 10:44
Wohnort: Schwäbisch Gmünd

Re: Einstellen der Masterlautstärke des Mixers

Beitrag von uli_soehnel »

Hallo Jimmy,

es gibt eine Funktion mixerSetControlDetails in der Winmm.dll. Mit dieser soll das gehen. Hier ein Beispiel in Delphi aus einem anderen Forum:

uses MMSystem;

const
MasterVolumeControl = 0;
MaxVolume = 65535;
MinVolume = 0; // ;-)

function _VolumeControl(Mixer: hMixerObj;
var Control: TMixerControl): MMResult;
var
Line : TMixerLine;
Controls : TMixerLineControls;
begin
ZeroMemory(@Line, SizeOf(Line));
Line.cbStruct := SizeOf(Line);
Line.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
Result := mixerGetLineInfo(Mixer,
@Line,
MIXER_GETLINEINFOF_COMPONENTTYPE);
if Result = MMSYSERR_NOERROR then begin
ZeroMemory(@Controls, SizeOf(Controls));
Controls.cbStruct := SizeOf(Controls);
Controls.dwLineID := Line.dwLineID;
Controls.cControls := 1;
Controls.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
Controls.cbmxctrl := SizeOf(Control);
Controls.pamxctrl := @Control;
Result := mixerGetLineControls(Mixer,
@Controls,
MIXER_GETLINECONTROLSF_ONEBYTYPE);
end;
end;

procedure SetMasterVolume(Mixer: hMixerObj; Value: Word);
var
MasterVolume : TMixerControl;
Details : TMixerControlDetails;
UnsignedDetails : TMixerControlDetailsUnsigned;
Code : MMResult;
begin
Code := _VolumeControl(Mixer, MasterVolume);
if Code = MMSYSERR_NOERROR then begin
with Details do begin
cbStruct := SizeOf(Details);
dwControlID := MasterVolume.dwControlID;
cChannels := 1; // set all channels
cMultipleItems := 0;
cbDetails := SizeOf(UnsignedDetails);
paDetails := @UnsignedDetails;
end;
UnsignedDetails.dwValue := Value;
Code := mixerSetControlDetails(Mixer,
@Details,
MIXER_SETCONTROLDETAILSF_VALUE);
end;
if Code <> MMSYSERR_NOERROR then
raise Exception.CreateFmt('SetMasterVolume failure, '+
'multimedia system error #%d', [Code]);
end;

function GetMasterVolume(Mixer: hMixerObj): Word;
var
MasterVolume : TMixerControl;
Details : TMixerControlDetails;
UnsignedDetails : TMixerControlDetailsUnsigned;
Code : MMResult;
begin
Result := 0;

Code := _VolumeControl(Mixer, MasterVolume);
if Code = MMSYSERR_NOERROR then begin
with Details do begin
cbStruct := SizeOf(Details);
dwControlID := MasterVolume.dwControlID;
cChannels := 1; // set all channels
cMultipleItems := 0;
cbDetails := SizeOf(UnsignedDetails);
paDetails := @UnsignedDetails;
end;
Code := mixerGetControlDetails(Mixer,
@Details,
MIXER_GETCONTROLDETAILSF_VALUE);

Result := UnsignedDetails.dwValue;
end;
if Code <> MMSYSERR_NOERROR then
raise Exception.CreateFmt('GetMasterVolume failure, '+
'multimedia system error #%d', [Code]);
end;

procedure TFormX.Foo...
begin
// Set
SetMasterVolume(MasterVolumeControl, 0815); // MaxVolume => 65535

// Get
Caption := IntToStr( GetMasterVolume(MasterVolumeControl) );
end;

Wer kann das ins Xbase übertragen oder mir sagen wie es geht?

Gruß Uli
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Einstellen der Masterlautstärke des Mixers

Beitrag von AUGE_OHR »

hi,
uli_soehnel hat geschrieben: es gibt eine Funktion mixerSetControlDetails in der Winmm.dll. Mit dieser soll das gehen.
nun verstehe ich, du willst den"Mixer" ansprechen :)
http://support.microsoft.com/kb/178456könnte das richtige Sample sein.
gruss by OHR
Jimmy
Antworten