19. november 2001 - 16:51Der er
12 kommentarer og 1 løsning
Styring af lydniveau fra et Delphi program
Jeg vil gerne stille lydstyrken fra mit program i stedet for fra Windows\' sndvol32. Jeg har fundet frem til WaveOutOpen, WaveOutGetVolume og WaveOutSetVolume, men har haft meget besvær med at få dem til at virke. Findes der en nemmere måde ? Hvis nogen har eksempler, vil jeg påskønne det meget. Jeg vil gerne kunne sætte både wave out niveau og den overordnede lydstyrke.
Lige en ting til : hvis \"Mute\" er slået til nytter det ikke meget at pille ved lydstyrken. Kan man slå \"Mute\" til og fra (eller kontrollere, om den er slået til) i Delphi ?
stoney <<< jeg kan ikke rigtigt få den til at virke - auxGetNumDevs returnerer 0 - så jeg kan ikke bruge auxSetVolume til noget
zerohero <<< jeg vil så vidt muligt benytte Delphis indbyggede komponenter eller Windows API kald.
Jeg har lavet et meget simpelt program hvor du kan skrue op og ned for venstre og/eller højre højttaler via edit felter (du må selv fedte rundt med evt. trackbars), samt slå mute til og fra.
function GetMasterMute( Mixer: hMixerObj; var Control: TMixerControl): MMResult; // Returns True on success 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_MUTE; Controls.cbmxctrl := SizeOf(Control); Controls.pamxctrl := @Control; Result := mixerGetLineControls(Mixer, @Controls, MIXER_GETLINECONTROLSF_ONEBYTYPE); end; end;
function GetWaveVolume: DWord; var Woc : TWAVEOUTCAPS; Volume : DWord; begin 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); var LeftVolume: Word; RightVolume: Word; begin LeftVolume := StrToInt(Edit1.Text); RightVolume := StrToInt(Edit2.Text); SetWaveVolume(MakeLong(LeftVolume, RightVolume)); end;
procedure SetMasterMuteValue( Mixer: hMixerObj; Value: Boolean); var MasterMute: TMixerControl; Details: TMixerControlDetails; BoolDetails: TMixerControlDetailsBoolean; Code: MMResult; begin Code := GetMasterMute(0, MasterMute); if Code = MMSYSERR_NOERROR then begin with Details do begin cbStruct := SizeOf(Details); dwControlID := MasterMute.dwControlID; cChannels := 1; cMultipleItems := 0; cbDetails := SizeOf(BoolDetails); paDetails := @BoolDetails; end; LongBool(BoolDetails.fValue) := Value; Code := mixerSetControlDetails(0, @Details, MIXER_SETCONTROLDETAILSF_VALUE); end; if Code <> MMSYSERR_NOERROR then raise Exception.CreateFmt(\'SetMasterMuteValue failure, \'+ \'multimedia system error #%d\', [Code]); end;
procedure TForm1.CheckBox1Click(Sender: TObject); begin SetMasterMuteValue(0, CheckBox1.Checked); end;
stoney <<< jep, det ser ud til virke. Jeg skal lige have tygget koden igennem, så jeg også kan slå \"Mute\" fra på waveOut ... og justere master lydstyrken ...
stoney <<< I need help. jeg kan styre master \"Mute\" og wave lydstyrke, men ikke master lydstyrke eller wave \"Mute\". jeg har prøvet at kigge på mixerGetLineControls og mixerGetLineInfo til at styre wave \"Mute\", men har ikke kunnet få det til at virke ...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.