La siguiente es una pequeña modificación en el código de ejemplo encontrado here (acreditado que es Thomas Stutz). El ejemplo allí establece el volumen del micrófono. Acabo de modificar el tipo de componente - destino del altavoz en lugar de la fuente del micrófono, y reemplacé mixerSetControlDetails
con mixerGetControlDetails
, y convertí el colocador en un captador, por supuesto. En los pocos sistemas que probé aquí (XPSp3, XPSp2, W2K, 98), parece que funciona. El retorno de la función es el altavoz del primer mezclador (predeterminado): un valor de 0-65535, el 'ShowMessage' en el manejador de botones lo cambia a un porcentaje. Pero no me preguntes más detalles al respecto, realmente no tengo experiencia con la aplicación de mezclador. En su lugar, refiérase a here f.i., aunque viejo, el artículo realmente me pareció completo.
function GetSpeakerVolume(var bValue: Word): Boolean;
var {0..65535}
hMix: HMIXER;
mxlc: MIXERLINECONTROLS;
mxcd: TMIXERCONTROLDETAILS;
vol: TMIXERCONTROLDETAILS_UNSIGNED;
mxc: MIXERCONTROL;
mxl: TMixerLine;
intRet: Integer;
nMixerDevs: Integer;
begin
Result := False;
// Check if Mixer is available
nMixerDevs := mixerGetNumDevs();
if (nMixerDevs < 1) then
Exit;
// open the mixer
intRet := mixerOpen(@hMix, 0, 0, 0, 0);
if intRet = MMSYSERR_NOERROR then
begin
mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
mxl.cbStruct := SizeOf(mxl);
// get line info
intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
if intRet = MMSYSERR_NOERROR then
begin
ZeroMemory(@mxlc, SizeOf(mxlc));
mxlc.cbStruct := SizeOf(mxlc);
mxlc.dwLineID := mxl.dwLineID;
mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls := 1;
mxlc.cbmxctrl := SizeOf(mxc);
mxlc.pamxctrl := @mxc;
intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
if intRet = MMSYSERR_NOERROR then
begin
ZeroMemory(@mxcd, SizeOf(mxcd));
mxcd.dwControlID := mxc.dwControlID;
mxcd.cbStruct := SizeOf(mxcd);
mxcd.cMultipleItems := 0;
mxcd.cbDetails := SizeOf(vol);
mxcd.paDetails := @vol;
mxcd.cChannels := 1;
intRet := mixerGetControlDetails(hMix, @mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
if intRet <> MMSYSERR_NOERROR then
ShowMessage('GetControlDetails Error')
else begin
bValue := vol.dwValue;
Result := True;
end;
end
else
ShowMessage('GetLineInfo Error');
end;
intRet := mixerClose(hMix);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Vol: Word;
begin
if GetSpeakerVolume(Vol) then
ShowMessage(IntToStr(Round(Vol * 100/65535)));
end;
Esta pregunta no tiene nada que ver en particular con Delphi, sino solo con la API de Windows. Este enlace podría ayudar: http://blogs.msdn.com/b/alejacma/archive/2010/01/13/how-to-set-sound-volume-programmatically.aspx –
No estoy diciendo que esto tenga que estar con Delphi, pero que quiero saber _cómo hacer_ esto _with_ delphi. – eKek0
Ese enlace trata sobre el volumen de la onda, no el volumen maestro. – eKek0