PDA

Ver la versión completa : Compilando SDL_sound



Segata Sanshiro
24/04/2010, 14:35
Estoy intentando compilar la librería SDL_sound para Wiz, pero entre que no es algo trivial, y que nunca me había estado pegando con compiladores, configures, etc., no lo consigo.

Por un lado, he intentado compilarla siguiendo las instrucciones que venían con el código fuente. Primero se ejecuta un script que usa libtoolize y luego ya configure con las opciones deseadas (por ejemplo --enable-vorbis para compilar con soporte OGG). Sin embargo, configure acaba cerrándose con el siguiente mensaje:


/bin/bash: ./ltconfig: No such file or directory
configure: error: libtool configure failed

Efectivamente ltconfig no está en el directorio y no sé de dónde debería salir o dónde debería generarse. Las búsquedas en google no han arrojado mucha luz al asunto. ¿Alguien sabe por dónde van los tiros?

Por otro lado, he intentado hacer lo mismo pero con el Code::Blocks. En este caso sí he conseguido que compilara, después de estar un tiempo configurando librerías, rutas, etc. Sin embargo, el binario que se genera ocupa menos de 16 KB, por lo que evidentemente algo ha ido mal. He pensado que quizás no se compilara con soporte a ningún formato, ya que hay que activarlos a mano. He mirado las cabeceras y tal y juraría que se hace incluyendo líneas como


#define SOUND_SUPPORTS_OGG 1
#define SOUND_SUPPORTS_WAV 1

pero el libSDL_sound.so generado solo aumenta unos pocos KB de tamaño, por lo que sigue mal. Una vez copiada a /lib en la Wiz, cuando ejecuto mi programa de prueba (que en PC funciona perfectamente) a través del terminal de Qtopia, termula, etc., lanza el siguiente error:


./2DTutorial.gpe: symbol lookup error: /lib/libSDL_sound.so: undefined symbol: __Sound_DecoderFunctions_WAV

Dicha variable se menciona en SDL_sound.c:


#if (defined SOUND_SUPPORTS_WAV)
extern const Sound_DecoderFunctions __Sound_DecoderFunctions_WAV;
#endif

y se declara en /decoders/wav.c:


const Sound_DecoderFunctions __Sound_DecoderFunctions_WAV =
{
{
extensions_wav,
"Microsoft WAVE audio format",
"Ryan C. Gordon <icculus@clutteredmind.org>",
"http://www.icculus.org/SDL_sound/"
},

WAV_init, /* init() method */
WAV_quit, /* quit() method */
WAV_open, /* open() method */
WAV_close, /* close() method */
WAV_read, /* read() method */
WAV_rewind /* rewind() method */
};

y wav.c es uno de los ficheros que aparece correctamente compilado en el "build log". Que por cierto, todos los ficheros objeto generados tienen unos tamaños irrisorios, la mayoría de alrededor de 500 bytes! Así no me extraña que luego la librería ocupe tan sumamente poco :confused:

En fin, gracias si habéis llegado hasta el final y estaré agradecido a todo aquél que me pueda echar un cable.

hardyx
24/04/2010, 17:33
Lo mismo me equivoco, pero creo que has puesto los defines en algún sitio en el que no están incluídas en algunos ficheros. Cada fichero .cpp se compila aparte y debería tener un include general para todos. Lo más fácil es pasarle las opciones al compilador con los flags -DSOUND_SUPPORTS_OGG, -DSOUND_SUPPORTS_WAV. Estas opciones son globales a todos los módulos del proyecto. Si hay un Makefile (a veces se autogenera) se pueden mirar las opciones que se pasan al compilador.

Segata Sanshiro
24/04/2010, 18:24
Los había puesto en SDL_sound.c, que es el único fichero donde luego se hace referencia a esos defines, pero probaré lo que dices, gracias. Miraré donde se meten en code::blocks, aunque me suena haberlo visto muchas veces.

De todas formas lo he medio solucionado, aunque de forma un poco guarra. Cuento cómo lo he hecho para ver si podéis decirme qué pasaba y si hay mejor forma de hacerlo. Si por ejemplo __Sound_DecoderFunctions_WAV se declaraba en decoders/wav.c, lo que he hecho ha sido incluirlo en SDL_sound.c (#include "decoders/wav.c"). Entonces ya no me da ese error de símbolo no definido.

El problema ahora es más gordo y es que me sale algo del estilo de "Memory corruption. malloc() Abort", y arreglarlo me parece que definitivamente se escapa de mis conocimientos. Puede que tenga que ver con que las cosas que he cambiado para que compilara con Tremor en vez de con el codec normal Vorbis (Tremor es la implementación de Vorbis usando coma fija, y es la que se incluye con la Wiz).

tSuKiYoMi
24/04/2010, 20:46
yo coincido con el comentario que te hacen má arriba, es decir ponerlo en las opciones de compilación. Lo has probado?

Segata Sanshiro
24/04/2010, 22:20
Sí, lo he hecho y efectivamente ha funcionado, gracias. Si lo defino correctamente no tengo que hacer la chapuza que comentaba.

Sin embargo sigo teniendo el otro problema. Mi programa se inicia, muestra varios mensajes de depuración correctos y de repente esto:

*** glibc detected *** malloc(): memory corruption: 0x000bd840 ***

Tengo que compilar con soporte para OGG, y eso me obliga a hacer la modificación para que SDL_sound use libvorbisidec en lugar de la libvorbis normal (ya que libvorbis no existe para Wiz, ni falta que hace). Así que no tengo manera de saber si es culpa de mi modificación o si seguiría ocurriendo incluso si no la modificara.

En fin, gracias por las respuestas. El último fallo tiene pinta de ser chungo de encontrar y arreglar, así que voy a ver si alguien portó SDL_sound a GP2X (me suena que sí) y a ver si puedo tirar de ahí.

Gammenon
24/04/2010, 22:27
No te sirve el SDL_mixer? Con el SDK oficial consegui hacer sonar un mod sin problemas

Segata Sanshiro
24/04/2010, 22:33
No te sirve el SDL_mixer? Con el SDK oficial consegui hacer sonar un mod sin problemas

SDL_mixer está muy bien, pero no puede reproducir más de un OGG a la vez, a no ser que los cargues enteros descomprimidos en memoria (no factible en mi caso). Con SDL_sound es fácil reproducir varios OGG a medida que los lees de la SD. Otra cosa es que luego la Wiz no tenga potencia suficiente para hacerlo (al menos a 533 MHz), pero hasta que no se pruebe...

GameMaster
24/04/2010, 22:34
Con el oficial olvidate del formato, los soporta todos con la misma llamada (tira del SDL de igual modo), sólo no te olvides de poner despúes las dll's necesarias según el formato, junto al EXE si lo pruebas en Windows.

Segata Sanshiro
24/04/2010, 23:34
Con el oficial olvidate del formato, los soporta todos con la misma llamada (tira del SDL de igual modo), sólo no te olvides de poner despúes las dll's necesarias según el formato, junto al EXE si lo pruebas en Windows.

Sí, pero igualmente no puedo hacer lo que quiero de reproducir varios OGG a la vez sin descomprimirlos en memoria. Y la forma más fácil de hacer eso es con SDL_sound. Que ha sido portada a GP32, GP2X y Dingoo, pero en Wiz no la veo, y mi compilación da ese error.

GameMaster
25/04/2010, 00:55
El Bennu la usa y esta portado a Wiz, así que si quieres bajate el código, y mira esa parte...

El modulo mod_sound.c, tiene 2 funciones que tiran de SDL, una play_song y otra play_wav (mira sus funciones para que veas la llamada que hace cada una del SDL), ambas permiten reproducir ficheros ogg, y si no me equivoco una de ellas le los ogg's como si fueran ficheros mod, en tiempo real del disco sin descomprimirlos en memória (ya que sirve para leer estos ficheros mod y es compatible con ambos).

Segata Sanshiro
25/04/2010, 12:38
El Bennu la usa y esta portado a Wiz, así que si quieres bajate el código, y mira esa parte...

El modulo mod_sound.c, tiene 2 funciones que tiran de SDL, una play_song y otra play_wav (mira sus funciones para que veas la llamada que hace cada una del SDL), ambas permiten reproducir ficheros ogg, y si no me equivoco una de ellas le los ogg's como si fueran ficheros mod, en tiempo real del disco sin descomprimirlos en memória (ya que sirve para leer estos ficheros mod y es compatible con ambos).

No, Bennu no la usa, Bennu usa SDL_mixer, que como ya he explicado NO me sirve porque solo puede ir leyendo un OGG a la vez.

A ver si este lunes puedo buscar el código fuente de SDL_sound para GP2X, que me consta que fue portada.