Cosas extrañas pasan en el mundo del audio

Started by osk, August 28, 2009, 11:14:49 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

osk

Hola chicos.
Vuelvo a ser yo otra vez, con unos problemillas, como de costumbre.
Estoy haciendo un ejemplo muy simple y básico de la función play_wav -con dos y tres parámetros- y resulta que no puedo seguir (buen maestro estoy hecho que se atranca a la primera de cambio, en fin). Seguramente tengo mal entendido conceptos sobre el funcionamiento de la reserva de canales, pero como esto fue una de las novedades de las últimas versiones de Fenix de Splinter, no hay mucha documentación al respecto y lo que he ido pillando por ahí han sido post de foros y tal...Bueno, al lío, el código es el siguiente:

[code language="bennu"]
import "mod_key";
import "mod_text";
import "mod_sound";

process main()
Private
  int idwav;
  int idcanal;
end
begin
  idwav=load_wav("a.wav");
  write(0,50,50,0,sound_channels);
  repeat
    if(key(_a))
     idcanal=play_wav(idwav,0);
     delete_text(0);
     write(0,0,0,0,idcanal);
    end
    if(key(_s))
     idcanal=play_wav(idwav,0,4);
     delete_text(0);
//Debería salir un 4 siempre, porque los primeros 8 canales ya están reservados por defecto.OK
     write(0,0,0,0,idcanal);
    end
    if(key(_d))
          /*Se produce un error (se sale del programa), porque se ha especificado un canal que no está reservado por defecto. OK, pero tal vez sería bueno que no petara así, no se´.. */
     idcanal=play_wav(idwav,0,20);
    end
    if(key(_f))
     reserve_channels(21);
     idcanal=play_wav(idwav,0,14);
     delete_text(0);
     write(0,0,0,0,idcanal);
    end
    frame;
  until(key(_esc))
  unload_wav(idwav);
end
[/code]

Cosas que no me esperaba:
-Si pones como segundo parámetro de play_wav el número 1, el sonido se repite (una vez). Supongo que es el comportamiento correcto, pero entonces hay alguna documentación que hay que revisar porque se dice que poniendo 0 ó 1 es lo mismo. Bueno, es un detalle.
-Si pulsas la tecla a, aparece en pantalla como identificador de canal o bien un 1 o bien un 2, depende (lo del 2 supongo que es porque en ese momento el 1 está ocupado todavía aunque haya acabado de sonar). Yo tengo entendido que los 8 primeros canales están reservados gracias a sound_channels (del 0 al 7). Por lo tanto, el primer canal "libre" para uso dinámico de Bennu tendría que ser el número 8 precisamente, ¿no? ¿Qué es lo que estoy diciendo mal?
-Si probáis de hacer sonar un sonido con la tecla a y luego con la s, veréis que se oye diferente: con la s se oye mucho mejor. ¿Es normal esto? No tengo ahora un wav que ocupe menos del máximo permitido para adjuntar, si no os lo pasaría.
-Y lo más importante: fijarse que con la tecla d el programa peta porque (entiendo yo) estamos intentando utilizar un canal que no está reservado. Para probar esta hipótesis, pulsando f reservo los 21 primeros canales (del 0 al 20) y entonces hago sonar el sonido por un canal cualquiera de estos. Bien. Poniendo hasta el canal 14 en play_wav() no ocurre ningún error pero no suena nada. Y a partir del canal 15, el programa peta como cuando se pulsa d. Einn??

Graaaciaaaaasss!!

SplinterGU

lei muy por arriba, te comento...

1) pasar 1 significa que se REPITE el sonido una vez luego de reproducirlo... pasar 0, significa que NO SE REPITE, solo se toca una vez y termina... y si mal no recuerdo -1 es repeticion infinita... el parametro significa REPETICION

2) los canales reservados se reservan con RESERVE_CHANNELS, sound_channels indica cuantos canales se pueden usar no los reserva.

3) no lo se... lo unico que haces es seleccionar el canal... no deberia oirse diferente... pero como sea, me suena algo que escapa del control que podamos hacer...

4) casi exacto, no podes superar sound_channels, pero recorda, de esta forma no los reservas, solo decis cual es el maximo.
deberia petarte si superas los 8, quizas internamente lo minimo que reserva son 16... o estas pisando memoria, no lo se... eso depende de la SDL_Mixer...

al reservarlos evitas que el motor de sonidos asigne automaticamente sonidos a los canales reservados... no es el caso...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

TYCO

osk vaya cacao tienes tio XD.

sound_channels=32;       // Especifica el numero total de canales.
reserve_channels(10);    // Reserva los canales del 0 a 9 para uso particular tuyo, dejando para uso libre del 10 al 31.
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

osk

Aaahh...muchas gracias. Es verdad, estaba confundido con lo que significa sound_channels.

No obstante, he añadido al principio del código anterior la línea
sound_channels=32;
y sigue pasando más o menos lo mismo.

Básicamente lo que pasa es que pulsando "f" no suena nunca nada. También me he fijado que si se usa la opción "f" y después la "a", entonces el play_wav() de "a" devuelve -1 y no suena nada,claro.

...y he descubierto otra cosa: cambiando de archivo wav, pulsando "d" el programa ya no peta (aunque no hace nada de nada, claro) y en "f" se puede poner en play_wav() hasta el último canal.
Qué raro.

Os dejo un wav pequeño (le he añadido .txt al final para poderlo adjuntar).

Graacias!!


TYCO

import "mod_key";
import "mod_text";
import "mod_sound";

process main()

Private
int idwav;
int idcanal;
end

begin
    sound_channels=32;
    reserve_channels(21);

    idwav=load_wav("a.wav");
    write(0,50,50,0,sound_channels);
    write_int(0,0,0,0,&idcanal);

    repeat
        if(key(_a))
            while (key(_a)) frame; end
            idcanal=play_wav(idwav,0);
        end
        if(key(_s))
            while (key(_s)) frame; end
            idcanal=play_wav(idwav,0,4);
        end
        if(key(_d))
            while (key(_d)) frame; end
            idcanal=play_wav(idwav,0,20);
        end
        if(key(_f))
            while (key(_f)) frame; end
            idcanal=play_wav(idwav,0,14);
        end
        frame;
    until(key(_esc))
    unload_wav(idwav);
end


El problema creo te viene porque al no reservar ningún canal... no puedes hacer un play_wav indicando el canal sin haber reservado primero los canales (da error al hacerlo).
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

osk

Pero es lo que estoy haciendo con reserve_channels, no?
Con sound_channels digo que tengo 32 canales en total, y de éstos con reserve_channels(21) digo que del 0 al 20 están reservados....No entiendo entonces por qué play_wav(wav,0,14); por ejemplo, no suena. Y en vez del canal 14 pones cualquier otro de los reservados y tampoco.

SplinterGU

que pongas 32 canales no significa que los tengas... tengo entendido que dependera del hardware... aunque supongo que a esta altura 32 canales tiene que ser algo standard...

por otro lado, en tu ejemplo original no estabas haciendo eso... ponias reserve_channels, pero sound_channels (valor default) estaba por debajo del valor de reserve_channels...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

TYCO

El codigo que te he puesto funciona perfectamente en mi equipo vamos.
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

osk

¡Ostras, ya he encontrado el error (de mi código)!
Me ha costado eh, pero viendo el de TYCO (gracias!) línea a línea, al final lo he visto.
Parece ser que sound_channels y reserve_channels hay que ponerlo siempre antes de cualquier load_wav!!! Si se pone después, tururú. Aaaahh...era eso!!! (Por otro lado, no deja de ser bastante lógico, realmente).
En fin, muchísimas gracias y perdón por haberos dado el tostón.

SplinterGU

jo! en mi respuesta te iba a poner que eso debia ser antes de cualquier accion de sonidos, pero viendo tu ejemplo supuse que no lo hacias asi, asi que borre ese texto...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2