Un par de cosas con mod_sound

Started by josebita, November 01, 2009, 05:48:44 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

josebita

¿Es normal que el siguiente código me de un segmentation fault?
[code language="bennu"]#ifdef NOWII
import "mod_say";
import "mod_sound";
#endif

Process main()
Private
        int song=0;
        string fname="sound.wav";
Begin
        say("Going to play "+fname+", hope you like it");
        song = load_wav(fname);
        if(song > 0)
                play_wav(song, 0);
                while(is_playing_wav(song))
                        FRAME;
                end;
                stop_wav(song);
                unload_wav(song);
        end;
End;[/code]

Y otra (pequeña) cosa:
En el fichero modules/mod_sound.c, línea 178, aparece:
[code language="c" options="singleline"]audio_format = AUDIO_S16;[/code]
que se usa como parámetro para la función Mix_OpenAudio() al inicializar el sistema de sonido.
Sin embargo, en la documentación de Mix_OpenAudio dice:
QuoteNote: You must not use AUDIO_S16, AUDIO_U16, AUDIO_S16LSB, or AUDIO_U16LSB. They are not portable, and SDL will not return an error code when they fail. The result will be a horrible staticy noise. You can usually use AUDIO_S16SYS, though not always.

Así que parece que sería mejor usar:
[code language="c" options="singleline"]audio_format = AUDIO_S16SYS;[/code]

¡Gracias!

SplinterGU

"...though not always."


seria bueno saber donde da ese error... una compilacion con -g y una ejecucion con -d de eso no vendria mal...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

Desde luego, pero lo que seguro desaconsejan es lo otro...

En cuanto al código, aquí va el resultado:
[code language="bash"]joseba@joseba-AAO:examples$ bgdi -d 07_mod_sound.dcb
Loading... mod_say.so
Loading... mod_sound.so

***** INSTANCE MAIN(65536) ENTRY StackBase=0x8f60fb0 StackPTR=0x8f60fb4
                                              [   0] 000000FF 0000000B          ------              07_mod_sound.prg:11 -> say("Going to play "+fname+", hope you like it");

                                              [   2] 00000384 00000008 STRING   PUSH                8       

00000008
                                              [   4] 00000397 00000004 STRING   GET_PRIVATE         4       

00000008 00000007
                                              [   6] 00000325          STRING   ADD                 

00000022
                                              [   7] 00000384 00000009 STRING   PUSH                9       

00000022 00000009
                                              [   9] 00000325          STRING   ADD                 

00000023
                                              [  10] 0000008C 00000003          SYSPROC             SAY      (3)

Going to play sound.wav, hope you like it
                                              [  12] 000000FF 0000000C          ------              07_mod_sound.prg:12 -> song = load_wav(fname);

                                              [  14] 00000092 00000000          PRIVATE             0       

08F60C50
                                              [  16] 00000397 00000004 STRING   GET_PRIVATE         4       

08F60C50 00000007
                                              [  18] 0000008A 0000000D          SYSCALL             LOAD_WAV (13)

08F60C50 08F69920
                                              [  20] 00000047                   LETNP               

                                              [  21] 000000FF 0000000D          ------              07_mod_sound.prg:13 -> if(song > 0)

                                              [  23] 00000097 00000000          GET_PRIVATE         0       

08F69920
                                              [  25] 00000084 00000000          PUSH                0       

08F69920 00000000
                                              [  27] 0000002F                   GT                 

00000001
                                              [  28] 0000009C 00000043          JFALSE              67     

                                              [  30] 000000FF 0000000E          ------              07_mod_sound.prg:14 -> play_wav(song, 0);

                                              [  32] 00000097 00000000          GET_PRIVATE         0       

08F69920
                                              [  34] 00000084 00000000          PUSH                0       

08F69920 00000000
                                              [  36] 0000008C 0000000E          SYSPROC             PLAY_WAV (14)

                                              [  38] 000000FF 0000000F          ------              07_mod_sound.prg:15 -> while(is_playing_wav(song))

                                              [  40] 00000097 00000000          GET_PRIVATE         0       

08F69920
                                              [  42] 0000008A 00000013          SYSCALL             IS_PLAYING_WAV (19)

Fallo de segmentación[/code]

SplinterGU

#3
si mal no recuerdo, is_playing_wav, sound_stop y otras que hacen referencia a un sonido que esta sonando deben usar como parametro el retorno del play_wav... puede que me equivoque, pero creo que es asi...

mira el codigo de mi juego en el crap2009... ahi veras como se usan estas funciones...


creo que este tema debe ser movido a dudas o algo parecido...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

Quote from: SplinterGU on November 01, 2009, 07:01:57 PM
si mal no recuerdo, is_playing_wav, sound_stop y otras que hacen referencia a un sonido que esta sonando deben usar como parametro el retorno del play_wav... puede que me equivoque, pero creo que es asi...

mira el codigo de mi juego en el crap2009... ahi veras como se usan estas funciones...


creo que este tema debe ser movido a dudas o algo parecido...

Cierto, cambiando a lo que dices funciona sin problemas, gracias,

Drumpi

Si, porque play_wav devuelve el canal (o ID del canal, según la ayuda de Fenix) por el que se reproduce el sonido, que es sobre lo que actúan el resto de funciones (is_playing_wav, sound_stop, etc, funcionan con un canal, no sobre un sonido).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

FreeYourMind

Hola, tengo un problema con is_playing_wav,
lo que quiero es poner un video pero que pueda salir de el pulsando esc o cuando este
termine, ya que al finalizar el video este sigue activo.

Lo puedo hacer con una variable tiempo que tenga la duracion del video, pero el
problema es que si muevo la ventana, este se descordina con el video, ya que la
variable sigue contando pero el video se congela.
Lo que pense es hacerlo comprobando que el sonido esta tocando, ya que esto permitiria
mover la ventana, ya que el video se adapta despues a la musica, la cual no se descuadra,
o sea, esta es una solución.

El problema es que la funcion is_playing_wav en el while me esta pentado Bennu,
y segun el ejemplo  de este post, tambin deberia funcionar sin problemas.


Os pongo el codigo que peta:

play_wav(Musica, 0);   
flic_id = fli_start("Intro.flc", 0, 20);
   
WHILE(!key(_esc) AND is_playing_wav(Musica))
      FRAME;
END

fli_end(flic_id);
end_fli();
stop_wav(all_sound);
Menu();


En cambio si pongo esto no peta:

play_wav(Musica, 0);   
flic_id = fli_start("Intro.flc", 0, 20);


WHILE(!key(_esc) AND tiempo <= 3500)
      FRAME;
      tiempo++;
END

fli_end(flic_id);
end_fli();
stop_wav(all_sound);
Menu();

OscarBraindeaD

Quote from: FreeYourMind on September 04, 2010, 06:06:25 PM
Hola, tengo un problema con is_playing_wav,
lo que quiero es poner un video pero que pueda salir de el pulsando esc o cuando este
termine, ya que al finalizar el video este sigue activo.

Lo puedo hacer con una variable tiempo que tenga la duracion del video, pero el
problema es que si muevo la ventana, este se descordina con el video, ya que la
variable sigue contando pero el video se congela.
Lo que pense es hacerlo comprobando que el sonido esta tocando, ya que esto permitiria
mover la ventana, ya que el video se adapta despues a la musica, la cual no se descuadra,
o sea, esta es una solución.

El problema es que la funcion is_playing_wav en el while me esta pentado Bennu,
y segun el ejemplo  de este post, tambin deberia funcionar sin problemas.


Os pongo el codigo que peta:

play_wav(Musica, 0);   
flic_id = fli_start("Intro.flc", 0, 20);
   
WHILE(!key(_esc) AND is_playing_wav(Musica))
      FRAME;
END

fli_end(flic_id);
end_fli();
stop_wav(all_sound);
Menu();


En cambio si pongo esto no peta:

play_wav(Musica, 0);   
flic_id = fli_start("Intro.flc", 0, 20);


WHILE(!key(_esc) AND tiempo <= 3500)
      FRAME;
      tiempo++;
END

fli_end(flic_id);
end_fli();
stop_wav(all_sound);
Menu();

Creo que is_playing_wav() debe comprobar un canal no un identificador de sonido... prueba recogiendo el canal al hacer el play_wav() y comprobar que el canal no ha terminado. Según el manual de the Osk:

Quote
PLAY_WAV(WAV, REPETICIONES)
../..
Esta función devuelve un identificador del
"canal de sonido" empleado para reproducir el efecto de sonido. Pueden existir hasta un máximo de 32 canales de
sonido disponibles para efectos, y esta función puede elegir cualquiera de ellos que esté libre de forma dinámica. Es
decir, el programador no necesita especificar qué canal se utilizará para reproducir un sonido: es el propio Bennu el
que se encarga de escoger el primer canal disponible que encuentre.
Si no es posible reproducir un sonido (por ejemplo, porque haya una gran cantidad de efectos sonando y ocupen los
todos los canales disponibles) esta función devolverá -1.

Salud

FreeYourMind

Karma up, tienes razón, ya lo habia probado antes, pero estaba solo comprobando la variable y eso no funcionaba, lo tenia así:

playing = play_wav(MusIntro, 0);
flic_id = fli_start("Vid/Intro.flc", 0, 20);
   
WHILE (!key(_esc) AND playing == 1)
FRAME;
END

....

O sea, asi no funciona, pero poniendo

WHILE (!key(_esc) AND is_playing_wav(playing) == 1)

ya chuta.

Muchas grácias.