PDA

Ver la versión completa : Problemas con SDL_Mixer y la música



Theck
07/06/2006, 23:16
Buenas de nuevo, abro otro tema con el que será la tónica de siempre "Problemas con..." [wei5]

En el problema de hoy tenemos una música que no quiere reproducirse.

Para ahorrar palabreria os pongo trozos de código que acabaremos antes:


...
#include <SDL.h>
#include <SDL_mixer.h>
...
int main (int argc, char *argv[])
{
...
/* Initialize SDL */
if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO) < 0) {
fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ());
exit (1);
}
...
Mix_Music *musica = NULL;
if(Mix_OpenAudio(22050, AUDIO_S16, 2, 256)==-1)
{
fprintf (stderr, "Couldn't set audio mode: %s\n", SDL_GetError ());
exit (2);
}
...
musica = Mix_LoadMUS ("test.mp3");
Mix_PlayMusic (musica, 0);
while (!done)
{
...
}
...
Mix_FreeMusic(musica);
...
}


Weno, pues la cosa es que cuando compilo para Windows, se oye, cuando lo abro en la negrita, no.

Como otros datos no incluidos en el código también hago un Mix_loadWav y lo reproduzco al darle al botón A, y eso va perfectamente en la consola.

Alguien sabe pq estas cosas me pasan? Y__Y

Gracias por adelantado.

D_Skywalk
08/06/2006, 00:10
Hay un par de post de estos dias en los que se hablaba de estos problemas ¿has probado alguna de las soluciones propuestas?

Un Saludo :?

Theck
08/06/2006, 00:15
Si, en ambos hablavan de esta linia:
Mix_OpenAudio(22050, AUDIO_S16, 2, 256)

Más notas, toy con las SDL que vienen con el devKit oficial para windows. Lo digo porque en otro de estos temas se hablaba de poner otra libreria para OGG y las SDL aceleradas, aunque el mp3 es uno simple, y con midi tampoco iba.

Uncanny
08/06/2006, 00:16
¿Esa versión de SDL_mixer que usas está compilada con soporte de la librería SMPEG? Prueba con un OGG, seguramente SDL_mixer está compilada con soporte OGG (ya sea por libOGG/libVorbis o, mejor en la GP2X, Vorbis Tremor) pero es posible que no con soporte para la librería SMPEG que es la que le permite a SDL_mixer reproducir MP3.

Es facil de adivinar, si tu SDL_mixer tiene soporte SMPEG y en el Makefile no le pasas -lsmpeg (aunque no sea un MP3 lo que reproduzcas) el compilador (o mejor dicho, el enlazador/linkador) se quejará en su etapa de enlazado, pero si no se queja es que no tienes soporte SMPEG. Otra cosa que puedes mirar es el subdirectorio /lib de tu toolchain, si no ves una librería tipo libsmpeg.a es ya sabes que tu SDL_mixer no soporta el formato MP3, en todo caso has de compilar SMPEG y luego recompilar SDL_mixer con soporte SMPEG para poder reproducirlo.

Aun así no te recomiendo reproducir MP3s con SDL_mixer ya que SMPEG no da buenos resultados (tal y como está programada) en las arquitecturas sin FPU (como la GP2X) y la reproducción de los MP3 "petardea" bastante, es mejor que optes por OGG. Si quieres usar MP3 en la GP2X tendrás que usar las funciones de la librería MAD, que está escrita en punto fijo (como Vorbis Tremor), que es la que usa el propio reproductor de música de la GP2X.

D_Skywalk
08/06/2006, 00:18
Como dice Uncanny, prueba con un OGG, creo que las libMAD estan compiladas para SDL_Mixer pero no estoy seguro, prueba con un OGG y salimos de dudas xD

Un Saludo ^^_

Theck
08/06/2006, 00:20
Pues me miraré esa que me dices Uncanny porque me gustaría trabajar sobretodo con Mp3, aunque OGG también lo quiero mirar pa otros proyectos.

Ya os diré que tal ;)

D_Skywalk
08/06/2006, 00:23
Lo unico que tienes que hacer es esto:



...
#include <SDL.h>
#include <SDL_mixer.h>
...
int main (int argc, char *argv[])
{
...
/* Initialize SDL */
if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO) < 0) {
fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ());
exit (1);
}
...
Mix_Music *musica = NULL;
if(Mix_OpenAudio(22050, AUDIO_S16, 2, 256)==-1)
{
fprintf (stderr, "Couldn't set audio mode: %s\n", SDL_GetError ());
exit (2);
}
...
musica = Mix_LoadMUS ("test.ogg");
Mix_PlayMusic (musica, 0);
while (!done)
{
...
}
...
Mix_FreeMusic(musica);
...
}


Y ponerle un OGG al lado, no te lies con librerias ahora xD

Un Saludo [wei3]

Theck
13/06/2006, 21:27
Me interesa sobremanera reproducir tanto OGG como MP3, pero soy incapaz de encontrar un tutorial sobre las librerias que ha dicho Uncanny, agradecería ayuda en este tema :P

Gracias de antemano.

pakoloko
13/06/2006, 22:32
Atención, pregunta: ¿los ogg no necesitan más recursos para ser reproducidos que los mp3?

Uncanny
13/06/2006, 23:29
Me interesa sobremanera reproducir tanto OGG como MP3, pero soy incapaz de encontrar un tutorial sobre las librerias que ha dicho Uncanny, agradecería ayuda en este tema :P

Gracias de antemano.Lo malo de la librería MAD es su documentación, que practicamente brilla por su ausencia. En las propias fuentes de la librería MAD hay un ejemplo, minimad.c (http://www.koders.com/c/fid6A2C4681F2058870FEAA92EB3A0C7B2AF90C44F5.aspx) con bastantes comentarios descriptivos a modo de documentación para usar la API de alto nivel (también tiene una API de bajo nivel) de la librería. También existe un documento (http://trac.videolan.org/vlc/browser/trunk/plugins/mad_adec/API?rev=1264&format=raw) de los desarrolladores de VLC donde intentaron documentar la API de libMAD y como usar sus funciones, quizás te sirva.

Si necesitas algún ejemplo más puedes ver el código de Madplay y Oldplay, dos reproductores que hacen uso de esta librería.
Atención, pregunta: ¿los ogg no necesitan más recursos para ser reproducidos que los mp3?Tal y como has hecho la pregunta no podría darse una respuesta sencilla. Sea cual sea el formato de compresión de audio, y en el tema de la reproducción/decodificación de audio, lo que es común a todas es que a mayor tasa de bits por unidad de tiempo (bitrate) implica mayor calidad a costa de un aumento del especio en disco y de los recursos de hardware necesarios para decodificarlo y poder reproducirlo, igual si hablamos del número de canales usados o la frecuencia de muestreo. Por otro lado estáría la eficiencia del decodificador por software que se encarga (en este caso hablamos de librerías), si usas SMPEG para decodificar MP3 en la GP2X, al ser un sistema sin FPU por hardware y estar escrita la librería usando muchos datos de tipo punto flotante, es escucha fatal, sin embargo con libMAD la cosa cambia notablemente al estar escrita de forma más optimizada y en punto fijo con la idea de usarse en sistemas embebidos como un reproductor portatil.

De igual forma para OGG Vorbis está la librería libOGG y libVorbis las cuales no están optimizadas para sistemas embebidos (y aun así dan mejores resultados con los OGG que comparativamente SMPEG con los MP3) pero para eso está Tremor Vorbis, una librería de decodificación de Ogg Vorbis escrita en punto fijo, es más, hay una subrama de Tremor ideada para equipos embebidos con pocos recursos, lo cual habla mucho de la optimización.

Esto te lo digo para que veas que no es facil de responder, podría pensarse que la relación calidad/compresión superior del formato Ogg Vorbis en comparación al de MP3, es a costa de consumir más recursos y puede que sea así en parte, pero también, como expliqué antes, depende de la eficiencia y el grado de optimización del decodificador por software que se use, para el formato que sea, que consuma más o menos recursos. Si te puedo decir que con un archivo Ogg Vorbis tienes la misma o más calidad a 64 kbps de bitrate que con un MP3 a 128-160 kbps (y eso si lo comprimes con LAME), con lo cual, si usas la librería Tremor en la GP2X, además de ahorrar espacio en disco, seguro que no consume tantos recursos que un MP3 que para tener la misma calidad necesita tener un mayor bitrate.

Theck
14/06/2006, 00:36
Me repito como las halubias: luego te preguntas porque estás en la lista xD

Muchas gracias, a ver si le puedo echar un ojo porque es lo único que me queda de lo que podríamos llamar "básico" para empezar a programar.

pakoloko
14/06/2006, 06:16
Lo malo de la librería MAD es su documentación, que practicamente brilla por su ausencia. En las propias fuentes de la librería MAD hay un ejemplo, minimad.c (http://www.koders.com/c/fid6A2C4681F2058870FEAA92EB3A0C7B2AF90C44F5.aspx) con bastantes comentarios descriptivos a modo de documentación para usar la API de alto nivel (también tiene una API de bajo nivel) de la librería. También existe un documento (http://trac.videolan.org/vlc/browser/trunk/plugins/mad_adec/API?rev=1264&format=raw) de los desarrolladores de VLC donde intentaron documentar la API de libMAD y como usar sus funciones, quizás te sirva.

Si necesitas algún ejemplo más puedes ver el código de Madplay y Oldplay, dos reproductores que hacen uso de esta librería.Tal y como has hecho la pregunta no podría darse una respuesta sencilla. Sea cual sea el formato de compresión de audio, y en el tema de la reproducción/decodificación de audio, lo que es común a todas es que a mayor tasa de bits por unidad de tiempo (bitrate) implica mayor calidad a costa de un aumento del especio en disco y de los recursos de hardware necesarios para decodificarlo y poder reproducirlo, igual si hablamos del número de canales usados o la frecuencia de muestreo. Por otro lado estáría la eficiencia del decodificador por software que se encarga (en este caso hablamos de librerías), si usas SMPEG para decodificar MP3 en la GP2X, al ser un sistema sin FPU por hardware y estar escrita la librería usando muchos datos de tipo punto flotante, es escucha fatal, sin embargo con libMAD la cosa cambia notablemente al estar escrita de forma más optimizada y en punto fijo con la idea de usarse en sistemas embebidos como un reproductor portatil.

De igual forma para OGG Vorbis está la librería libOGG y libVorbis las cuales no están optimizadas para sistemas embebidos (y aun así dan mejores resultados con los OGG que comparativamente SMPEG con los MP3) pero para eso está Tremor Vorbis, una librería de decodificación de Ogg Vorbis escrita en punto fijo, es más, hay una subrama de Tremor ideada para equipos embebidos con pocos recursos, lo cual habla mucho de la optimización.

Esto te lo digo para que veas que no es facil de responder, podría pensarse que la relación calidad/compresión superior del formato Ogg Vorbis en comparación al de MP3, es a costa de consumir más recursos y puede que sea así en parte, pero también, como expliqué antes, depende de la eficiencia y el grado de optimización del decodificador por software que se use, para el formato que sea, que consuma más o menos recursos. Si te puedo decir que con un archivo Ogg Vorbis tienes la misma o más calidad a 64 kbps de bitrate que con un MP3 a 128-160 kbps (y eso si lo comprimes con LAME), con lo cual, si usas la librería Tremor en la GP2X, además de ahorrar espacio en disco, seguro que no consume tantos recursos que un MP3 que para tener la misma calidad necesita tener un mayor bitrate.

Buena explicación, muchas gracias :). Es que hace poco en otra web salió una noticia sobre un nuevo firmware disponible para varios reproductores mp3, que entre otras les añadía capacidad para leer Ogg, y en los comentarios la gente decía que a donde iban con Ogg, que chupaba demasiado para usar en un reproductor portátil, por eso tenía mi duda.