Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Desactivar y activar sonido del sistema (https://www.clubdelphi.com/foros/showthread.php?t=62071)

nandynna 03-12-2008 01:32:24

Desactivar y activar sonido del sistema
 
HOla! Les escribo porque necesito saber como hacer en delphi para desactivar o activar el sonido del sistema operativo(general), es decir manejar activando y desactivando el mute del control del volumen. busco en google, en el foro y no encuentro nada. Bueno.. si me pudieran ayudar estaria muy agradecida..salu2!

seoane 03-12-2008 20:42:41

Cita:

Empezado por nandynna (Mensaje 329308)
busco en google, en el foro y no encuentro nada.

¿Probaste a buscar MUTE? :rolleyes:

http://www.clubdelphi.com/foros/show...highlight=mute

delphi.com.ar 03-12-2008 20:47:55

Ante todo, te aclaro que lo que te estoy subiendo es un rejunte de código, que sería bueno que lo pruebes a fondo, se trata de una unit con una función genérica y dos implementaciones de esta, y un proyecto de ejemplo:

Código Delphi [-]
unit MMUtils;

interface

uses
  Windows;

procedure mmMixSetVolume(AComponentType, AValue: DWORD);
procedure mmMixSetMute(AComponentType: DWORD; AValue: boolean);

implementation

uses
  SysUtils, MMSystem;

procedure RaiseLastMMError;
begin
  { TODO : .. }
  RaiseLastOsError;
end;

procedure mmMixSetDetail(AComponentType, AControlType: DWORD; Data: Pointer; DataSize: DWORD);
var
  hMix: HMIXER;
  mxlc: MIXERLINECONTROLS;
  mxcd: TMIXERCONTROLDETAILS;
  mxc: MIXERCONTROL;
  mxl: TMixerLine;
begin
  if (mixerGetNumDevs() > 0) then
  begin
    if mixerOpen(@hMix, 0, 0, 0, 0) = MMSYSERR_NOERROR then
      try
        mxl.dwComponentType := AComponentType;
        mxl.cbStruct := SizeOf(mxl);

        if mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE) = MMSYSERR_NOERROR then
        begin
          ZeroMemory(@mxlc, SizeOf(mxlc));

          mxlc.cbStruct := SizeOf(mxlc);
          mxlc.dwLineID := mxl.dwLineID;
          mxlc.dwControlType := AControlType;
          mxlc.cControls := 1;
          mxlc.cbmxctrl := SizeOf(mxc);
          mxlc.pamxctrl := @mxc;

          if mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE) = MMSYSERR_NOERROR then
            ZeroMemory(@mxcd, SizeOf(mxcd));
            mxcd.dwControlID := mxc.dwControlID;
            mxcd.cbStruct := SizeOf(mxcd);
            mxcd.cMultipleItems := 0;
            mxcd.cbDetails := DataSize;
            mxcd.paDetails := Data;
            mxcd.cChannels := 1;

            if mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE) <> MMSYSERR_NOERROR then
              RaiseLastMMError;
          end else
            RaiseLastMMError;
      finally
        if mixerClose(hMix) <> MMSYSERR_NOERROR then
         RaiseLastMMError;
      end;
  end;
end;

procedure mmMixSetVolume(AComponentType, AValue: DWORD);
var
  uValue: TMIXERCONTROLDETAILS_UNSIGNED;
begin
  uValue.dwValue := AValue;
  mmMixSetDetail(AComponentType, MIXERCONTROL_CONTROLTYPE_VOLUME, @uValue, SizeOf(uValue));
end;


procedure mmMixSetMute(AComponentType: DWORD; AValue: boolean);
var
  bValue: MIXERCONTROLDETAILS_BOOLEAN;
begin
  bValue.fValue := Ord(AValue);
  mmMixSetDetail(AComponentType, MIXERCONTROL_CONTROLTYPE_MUTE, @bValue, SizeOf(bValue));
end;


end.

El proyecto de ejemplo:
Código Delphi [-]
program MMMixer;

uses
  Windows, SysUtils, MMSystem,
  MMUtils in '..\Comunes\MMUtils.pas';

begin
  { Pone el volúmen a la mitad de la escala}
  mmMixSetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, MaxWord div 2);

  { Silencia la mezcladora }
  mmMixSetMute(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, True);
end.

Saludos!

nandynna 04-12-2008 00:16:51

Cita:

Empezado por seoane (Mensaje 329499)
¿Probaste a buscar MUTE? :rolleyes:

http://www.clubdelphi.com/foros/show...highlight=mute

Hola! muchas gracias por la pronta respuesta, lo voy a probar adaptandolo a mi programa, necesito que cuando se cliquee la imagen se habilite el mute o deshabilite. En realidad, creo que hay una sentencia (yo la use hace unos años en un programa y me funcionaba), pero lo grabé en cds que ya no se pueden leer por el paso de los años , y bueno. hoy estoy aqui.. (no hay que guardar nada en cds!!!) aviso cualquier cosa y muchas gracias de nuevo!salu2.

nandynna 04-12-2008 00:18:37

Cita:

Empezado por delphi.com.ar (Mensaje 329500)
Ante todo, te aclaro que lo que te estoy subiendo es un rejunte de código, que sería bueno que lo pruebes a fondo, se trata de una unit con una función genérica y dos implementaciones de esta, y un proyecto de ejemplo:

Código Delphi [-]
unit MMUtils;

interface

uses
  Windows;

procedure mmMixSetVolume(AComponentType, AValue: DWORD);
procedure mmMixSetMute(AComponentType: DWORD; AValue: boolean);

implementation

uses
  SysUtils, MMSystem;

procedure RaiseLastMMError;
begin
  { TODO : .. }
  RaiseLastOsError;
end;

procedure mmMixSetDetail(AComponentType, AControlType: DWORD; Data: Pointer; DataSize: DWORD);
var
  hMix: HMIXER;
  mxlc: MIXERLINECONTROLS;
  mxcd: TMIXERCONTROLDETAILS;
  mxc: MIXERCONTROL;
  mxl: TMixerLine;
begin
  if (mixerGetNumDevs() > 0) then
  begin
    if mixerOpen(@hMix, 0, 0, 0, 0) = MMSYSERR_NOERROR then
      try
        mxl.dwComponentType := AComponentType;
        mxl.cbStruct := SizeOf(mxl);

        if mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE) = MMSYSERR_NOERROR then
        begin
          ZeroMemory(@mxlc, SizeOf(mxlc));

          mxlc.cbStruct := SizeOf(mxlc);
          mxlc.dwLineID := mxl.dwLineID;
          mxlc.dwControlType := AControlType;
          mxlc.cControls := 1;
          mxlc.cbmxctrl := SizeOf(mxc);
          mxlc.pamxctrl := @mxc;

          if mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE) = MMSYSERR_NOERROR then
            ZeroMemory(@mxcd, SizeOf(mxcd));
            mxcd.dwControlID := mxc.dwControlID;
            mxcd.cbStruct := SizeOf(mxcd);
            mxcd.cMultipleItems := 0;
            mxcd.cbDetails := DataSize;
            mxcd.paDetails := Data;
            mxcd.cChannels := 1;

            if mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE) <> MMSYSERR_NOERROR then
              RaiseLastMMError;
          end else
            RaiseLastMMError;
      finally
        if mixerClose(hMix) <> MMSYSERR_NOERROR then
         RaiseLastMMError;
      end;
  end;
end;

procedure mmMixSetVolume(AComponentType, AValue: DWORD);
var
  uValue: TMIXERCONTROLDETAILS_UNSIGNED;
begin
  uValue.dwValue := AValue;
  mmMixSetDetail(AComponentType, MIXERCONTROL_CONTROLTYPE_VOLUME, @uValue, SizeOf(uValue));
end;


procedure mmMixSetMute(AComponentType: DWORD; AValue: boolean);
var
  bValue: MIXERCONTROLDETAILS_BOOLEAN;
begin
  bValue.fValue := Ord(AValue);
  mmMixSetDetail(AComponentType, MIXERCONTROL_CONTROLTYPE_MUTE, @bValue, SizeOf(bValue));
end;


end.

El proyecto de ejemplo:
Código Delphi [-]
program MMMixer;

uses
  Windows, SysUtils, MMSystem,
  MMUtils in '..\Comunes\MMUtils.pas';

begin
  { Pone el volúmen a la mitad de la escala}
  mmMixSetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, MaxWord div 2);

  { Silencia la mezcladora }
  mmMixSetMute(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, True);
end.

Saludos!

muchas gracias! voy a probar tambien estas opciones y cuento los resultados. thanks again and salu2!

osmuar_exp 08-01-2009 00:12:21

Thanks
 
Fue de gran utilidad.


La franja horaria es GMT +2. Ahora son las 10:12:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi