Problemas de sonido; mis archivos no suenan

Started by poletro, October 26, 2012, 02:19:04 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

poletro

Muy buenas otra vez. ¡Hoy os traigo mi problemilla con el sonido!

Bien, he estado haciendo pruebas con load_song(), play_song(), stop_song(), fade_music_in(), fade_music_off() y unload_song(), y dos archivos de sonido, uno .ogg y otro .mid.
Ahora mismo, tengo un sistema de niveles en el proceso Main(). Cargo los sonidos antes de empezar el LOOP (sé que no es lo más eficiente, son pruebas) y, dependiendo del nivel, hago un play_song() o similar del archivo correspondiente.
Las dos o tres primeras veces que he hecho un RUN, ha ido bien; las demás, no. Actualmente, el archivo .ogg (el del menú) no suena y, si cambio al nivel 1, empieza a sonar, tal y como debe ser, el archivo .mid (del nivel 1).

He intentado reproducir ésta situación en un programa de prueba y ha pasado más o menos lo mismo. En este programa, he asignado una tecla a cada canción, haciendo un stop_song() seguido de un play_song() con una canción u otra. Al principio todo correcto y, al cabo de unos cuantos RUNs, han dejado de escucharse. No suenan ni una ni la otra.

Os dejo el código de prueba a ver si me podéis echar una mano.

PROGRAM videogame;

// Imports
import "mod_proc";
import "mod_video";
import "mod_say";
import "mod_key";
import "mod_screen";
import "mod_sound";

GLOBAL
int song_menu;
int song_level1;
int e;
END

PROCESS Main()
BEGIN
set_mode(300,100,32,MODE_WINDOW);
song_level1 = load_song("snd\level1.mid");
song_menu = load_song("snd\menu.ogg");
set_song_volume(60);
play_song(song_menu,-1);

LOOP
IF(key(_D))
e = stop_song();
say("STOP: "+e);
e = play_song(song_level1,0);
say("PLAY: "+e);
say(" ");
END
IF(key(_A))
e = stop_song();
say("STOP: "+e);
e = play_song(song_menu,0);
say("PLAY: "+e);
say(" ");
END
IF(key(_ESC))
stop_song();
unload_song(song_menu);
unload_song(song_level1);
let_me_alone();
exit(0);
END
FRAME;
END
END


Por otro lado, he estado buscando algo sobre éste tema y he entendido algo sobre la librería SDL_Mixer; pero no he encontrado algo estrictamente relacionado con mis problemas... ¡gracias!


EDIT: Por cierto, en mi programa principal (el que no es de prueba) aunque cambie la música del menú por el .mid (dejando así, el mismo archivo cargado dos veces y guardado en dos variables diferentes), sigue sin sonar.
También he hecho pruebas para ver si cargaban bien o no, asignando una variable para el retorno de load_song() y play_song(). Las dos funcionan correctamente.

FreeYourMind

esta mal el código no uses la variable 'e', dentro del loop pones un if (is_playing_sound(id)) stop_sound(id) ; y despues la reinicias de nuevo. para ficheros ogg tambien puedes usar play_wav, pero de este modo se cargan en memoria, con play_sound no se cargan en memoria, se leen directamente del disco

poletro

El código anterior está mal? En qué sentido?

De todas maneras, el código anterior es el resultado de muchas otras pruebas, si te refieres a que ponga algo así
LOOP
IF(key(_S) AND is_playing_song())
stop_song();
say("STOP ALL THE SONGS!");
END
IF(key(_D) AND !is_playing_song())
play_song(song_menu,0);
say("Playing menu song");
END
IF(key(_A) AND !is_playing_song())
play_song(song_level1,0);
say("Playing level1 song");
END
IF(key(_ESC))
stop_song();
unload_song(song_menu);
unload_song(song_level1);
let_me_alone();
exit(0);
END
FRAME;
END


tampoco funciona... siguen sin sonar las canciones. Adjunto .prg y archivos de audio. >.<

FreeYourMind

en el foro ya se ha hablado muchas veces, tenia un sound test que subi pero no encuentro el post, sin envargo se habla en varios sitios, ahora mismo reviso tu codigo en mi pc.

mientras tanto te pongo algunos apuntes:

http://forum.bennugd.org/index.php?topic=2362.msg42146#msg42146

FreeYourMind

me funciona, uso bennu r270, te paso la prueba, ejecuta 'Ejecutar.bat' y dime si ya te suena.

poletro

Okay, tu código funciona. Y he descubierto que el problema está en mi proyecto real. De hecho, los códigos que te he puesto yo (los de prueba) funcionan. Los dos.

Como ya dije en el anterior post, me gustaría no postear el código del proyecto principal (no, hasta que se pase la fecha del concurso :p), pero si tenéis alguna noción de por qué pasa esto, me ayudaría muchísimo!

Por partes:

En el proceso Main(), en el apartado BEGIN, cargo las canciones:
song_menu = load_song("snd\menu.ogg");
song_level1 = load_song("snd\level1.mid");


Declaradas, anteriormente como variables globales.
int song_menu;
int song_level1;


Luego tengo el LOOP principal, dentro del cual hay un SWITCH que varia según el nivel actual:
SWITCH(level)
CASE 1:
    play_song(song_menu,-1);
    procesoCursorMenu();
    LOOP
        IF(opcion == 1) level = 2; BREAK; END
        IF(opcion == 2) exit(); END
    END
    stop_song();
    unload_song(song_menu);
END
CASE 2:
    fade_music_in(song_level1,-1,500);
    LOOP
        IF(cinematica == 1)
            put_screen(blablabla);
            LOOP
                IF(key(_D)) cinematica++; BREAK; END
                FRAME;
            END
            clear_screen();
        END
        IF(cinematica == 2)
            BREAK;
        END
    END
   
    fade_music_off();
    WHILE(is_playing_song()) FRAME;  END
    stop_song(); // Redundante
    unload_song(song_level1);
END


Todas las variables han sido declaradas como globales e inicializadas en el bloque BEGIN del proceso Main().
Pues bien, la primera vez que hago un RUN de esto, funciona perfectamente.
La segunda vez, si en el RUN anterior ha llegado a sonar la música del primer nivel (song_level1), la música del menú ya no suena. Y ya no sonará nunca más*.

* La manera que tengo de "arreglarlo" es haciendo un RUN de un programa bien hecho (como el que me has dado tú, por ejemplo). Entonces es como si se reseteara todo y nunca se hubiese hecho un RUN.

Entonces, tengo una level noción que el problema está en el cargado/descargado de las canciones... y poca cosa más. Si influye, song_menu es un .ogg y song_level1 es un .mid.



Sé que me explico mal, pero espero que haya quedado más o menos claro... xD
Y eso, si me podéis echar una mano, mejor que mejor.

FreeYourMind

no lo he entendido, pero te fallan las musicas a partir de que numero de repeticiones ? Mi compilado tb te falla ?

El juego es para mi concurso ? Si así es gracias por participar, y sobre lo de publicar lo que sea, en las reglas se deja bien claro que no se puede :)

poletro

Primero de todo, es para un concurso que se hace en Castellón; no sé si lo has organizado tu o no. xD
Tu compilado no me falla.

No es problema de repeticiones. Directamente suena o no suena (explico más abajo).
Bien, la cosa es que tengo una estructura de niveles en los que, por cada nivel, suena una música diferente.

Primer RUN:
Se abre el menú y suena la música del menú. Avanzas al level 1.
Empiezan las cinemáticas del nivel 1 y empieza a sonar la música. Se cierra el juego.

Segundo RUN:
Se abre el menú pero no suena ninguna música. Avanzas al level 1.
Empiezan las cinemáticas del nivel 1 y empieza a sonar la música. Se cierra el juego.

Y de aquí en adelante, todos los RUNs son como el segundo.

Si en el primer RUN no se avanza a level 1, la música del primer nivel sonará siempre, hasta que avances al level 1. A partir de entonces, la música del menú dejará de sonar.


Gracias.

FreeYourMind

bueno pues nada, suerte en ese concurso  :-[

poletro

Uhm... creo que era cosa del archivo ya que acabo de cambiarlo y va todo bien... T_T
Gracias y perdón por las molestias!