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:
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


0