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;
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;
Sound:= TSound.Create;
Sound.Terminate;
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