Ver Mensaje Individual
  #4  
Antiguo 12-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 26
seoane Va por buen camino
Pensándolo mejor podemos darle otra vuelta de tuerca al código. Estaría bien que el sonido se reproducirá de forma asíncrona al resto del programa, pero manteniendo el orden de reproducción. Así que vamos a utilizar un Thread que se ejecutara el paralelo con el resto de la aplicación, para ello vamos a definir una clase derivada de TThread a la que llamaremos TSound. Esta clase tendrá un método llamado Add que permitirá añadir archivos wav a la lista de reproducción. Por lo demás se comportara como un Thread normal, que podremos pausar y continuar. Vamos con un poco de código:

Código Delphi [-]
type
  TSound = class(TThread)
  private
    FList: TStringList;
    FMutex: THandle;
  protected
    procedure Execute; override;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Add(Path: String);
  end;


uses mmsystem;

{ TSound }

procedure TSound.Add(Path: String);
begin
  WaitForSingleObject(FMutex, INFINITE);
  try
    FList.Add(Path);
  finally
    ReleaseMutex(FMutex);
  end;
end;

constructor TSound.Create;
begin
  FList:= TStringList.Create;
  FMutex:= CreateMutex(nil,FALSE,nil);
  FreeOnTerminate:= TRUE;
  inherited Create(FALSE);
end;

destructor TSound.Destroy;
begin
  FList.Free;
  CloseHandle(FMutex);
  inherited;
end;

procedure TSound.Execute;
var
  Path: String;
begin
  inherited;
  while not Terminated do
  begin
    WaitForSingleObject(FMutex, INFINITE);
    try
      if FList.Count > 0 then
      begin
        Path:= FList[0];
        FList.Delete(0);
      end else
        Path:= '';
    finally
      ReleaseMutex(FMutex);
    end;
    if Path <> '' then
      PlaySound(PChar(Path),0,SND_FILENAME or SND_SYNC)
    else
      Sleep(10);
  end;
end;


Para utilizarlo, tenemos que crearlo y añadirle archivos a la lista de reproducción. Algo así:
Código Delphi [-]
var
  Sound: TSound;

//Para crearlo
Sound:= TSound.Create;

//Para destruirlo
Sound.Terminate;

//Para añadir un sonido
Sound.Add('d:\1.wav');

Como ves este código es sensiblemente mas complejo que el que puse en el mensaje anterior, puedes usar uno u otro dependiendo de las necesidades de tu aplicación.

EDITO: Corregir un error con la propiedad FreeOnTerminate

Última edición por seoane fecha: 12-11-2006 a las 18:20:46.
Responder Con Cita