Delphi - AYUDA CON PROBLEMA DE CONCURRENCIA DE SONIDO

   
Vista:

AYUDA CON PROBLEMA DE CONCURRENCIA DE SONIDO

Publicado por Chema (17 intervenciones) el 16/10/2015 13:15:10
Hola amigos. Estoy desarrollando una pequeña aplicación, algo así como un juego de pistoleros.

El caso es que tengo algún problema con el sonido y me explico:
El juego tiene una banda sonora que suena de fondo y en determinados momentos, cuando el jugador presiona el ratón, debe sonar un disparo.

Para gestionar los sonidos estoy utilizando el procedimiento:

sndPlaySound(Pointer(Sonido), SND_MEMORY Or SND_NODEFAULT Or SND_ASYNC);

donde el "sonido" lo tengo previamente cargado en memoria.

Ésto funciona perfectamente, los sonidos se reproducen sin problemas. El problema viene cuando deseo que dos sonidos se reproduzcan concurrentemente. Por ejemplo, que mientras suena la banda sonora del juego, se reproduzca el sonido de un disparo.
Lo que ocurre en éste caso es que al reproducir el sonido del disparo, se detiene la banda sonora.

Para intentar solucionar ésto, he utilizado hilos de ejecución. Pero sucede igual: al ejecutar un sonido determinado, el sonido que estuviera en ejecución en ése momento se detiene y no continúa.

Bueno, quería consultarles si alguien se le ocurre de qué manera solucionar éste problema.
En definitiva, lo que necesito es que varios sonidos se reproduzcan simultáneamente y de forma concurrente, sin que unos sonidos detengan a otros.
No sé si me he explicado.

Muchas gracias. Espero me puedan ayudar.



PD: Adjunto un código de prueba que he utilizado para intentar solucionar éste problema:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Function cargarSonidoEnMemoria(const fichero : TFileName):String;
begin
    with TFileStream.Create(fichero,fmOpenRead or fmShareDenyWrite) do
    begin
      try
        SetLength(Result, Size);
        Read(Pointer(Result)^, Size);
      except
        Result := '';
        Free;
        raise;
      end;
      Free;
    end;
end; // Function cargarSonidoEnMemoria(const fichero : TFileName):String;
 
 
procedure TForm1.FormCreate(Sender: TObject);
VAr
  Hilo1, Hilo2: TMiHilo;
  Path: String;
  Son: String;
begin
  Randomize; // Iniciamos el generador de números aleatorios
 
  Path:= ExtractFilePath(ParamStr(0))+'sounds\Bang.wav';
  if FileExists(Path) then
    Son:= CargarSonidoEnMemoria(Path);
  sndPlaySound(Pointer(son), SND_MEMORY Or SND_NODEFAULT Or SND_ASYNC);
 
  Hilo1:= TMiHilo.Create(false,Label1,ExtractFilePath(ParamStr(0))+'sounds\Bang.wav');
  Hilo2:= TMiHilo.Create(false,Label2,ExtractFilePath(ParamStr(0))+'sounds\Disparo3.wav');
end;
 
procedure TForm1.Button1Click(Sender: TObject);
VAR
  Son: String;
begin
  Son:= CargarSonidoEnMemoria(ExtractFilePath(ParamStr(0))+'sounds\Disparo3.wav');
  sndPlaySound(Pointer(son), SND_MEMORY Or SND_NODEFAULT Or SND_ASYNC);
end;
 
 
constructor TMiHilo.Create(CrearSuspendido : boolean; LabelDest: TLabel; Path: String);
 begin
   FreeOnTerminate:= false;
   self.Sonido:= cargarSonidoEnMemoria(Path);
   self.labelDestino:= LabelDest;
   inherited Create(CrearSuspendido);
 end;
 
Procedure TMiHilo.CargarSonido (Path: String);
begin
  self.Sonido:= cargarSonidoEnMemoria(Path);
end;
 
procedure TMiHilo.Execute;
const fin=500;
  var
    i: integer;
  begin
   i:=0;
    while (i<=fin) do
      begin
           LabelDestino.Caption:= 'Contador= '+IntToStr(i);
           inc(i);
 
           sndPlaySound(Pointer(self.Sonido), SND_MEMORY Or SND_NODEFAULT Or SND_ASYNC);
           Sleep(Round(random(5)*1000));
      end;
    LabelDestino.Caption:= 'Labor Terminada';
  end;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder