sdl_mixer no reproduce mp3

Iniciado por Guillermo575, 29 Marzo 2011, 05:49 AM

0 Miembros y 5 Visitantes están viendo este tema.

Guillermo575

Hola, escribo por un problema que tengo con la libreria sdl:
Segun lei en internet el sdl_mixer es capaz de reproducir desde midi a mp3, el problema es que cuando reproduzco midi me funciona, pero cuando intento reproducir un archivo mp3 no me lo reproduce y me tira error.
El codigo es este:
Cita de: Guillermo575
#include <stdio.h>
#include <stdlib.h>;
#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>

int main(int argc, char *argv[])
{
   SDL_Surface *screen;
   Mix_Music *cancion;
   SDL_Event event;
   int salir = 0;
   
   screen = SDL_SetVideoMode(320, 240, 16, SDL_HWSURFACE);


   if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1)
   {
      printf("Error en Mix_OpenAudio: %s\n", Mix_GetError());
      return 1;
   }

   cancion = Mix_LoadMUS("music.mid");

   if (!cancion)
      printf("Error en Mix_LoadMUS: %s\n", Mix_GetError());

   if (cancion)
   {
      if (Mix_PlayMusic(cancion, -1) == -1)
         printf("Error en Mix_PlayMusic: %s\n", Mix_GetError());
   }

   while (! salir)
   {
      SDL_PollEvent(&event);

      if (event.type == SDL_QUIT)
         salir = 1;

      SDL_Flip(screen);
      SDL_Delay(10);
   }

   if (cancion)
   {
      Mix_HaltMusic();
      Mix_FreeMusic(cancion);
   }

   Mix_CloseAudio();
   SDL_Quit();
   return 0;
}

Lo unico que hace es abrir una ventana y reproducir la cancion que esta dentro de la carpeta
En donde dice
   cancion = Mix_LoadMUS("music.mid");
remplacen "music.mid" con el nombre de algun midi que tengan y luego con un mp3
¿les paso lo mismo u otra cosa?
Saludos

anonimo12121

#1
Mix_LoadMP3("music.mp3"); prueba  a ver si  funciona.

EDITO: No funciona creo...

CitarSDL_Mixer se encarga de reservar un canal exclusivo para la reproducción de música para nuestra aplicación. Como en la gestión de sonidos da soporte a multitud de formatos. Como ocurría con los chunks, la música tiene que ser cargada de un fichero y una vez que terminemos de trabajar con ella deberemos de liberar el recurso. Para cargar la música del videojuego utilizamos la función:
Mix_Music *Mix_LoadMUS(const char *file);

Esta función recibe como parámetro el fichero donde se encuentra la música que queremos cargar. La función devuelve un puntero a la estructura de datos que guarda la música del videojuego de tipo Mix_Music. La única diferencia con la función de cargar sonidos "convencionales es que no tenemos que espeficiar el canal en el que queremos colocar el sonido. Como puedes observar existe un tipo exclusivo de datos dedicado a este tipo de sonidos. Como pasa con otros tipos de datos la definición de Mix_Music está oculta al usuario, lo que no nos supone ningún problema ya que trabajaremos siempre con un puntero a esa estructura y alterando los campos de la misma directamente.

Si ocurre algún error al cargar el fichero de música la función devuelve el valor NULL. El tipo de formato que podemos reproducir es muy amplio como comentabamos al principo del capítulo. Entre ellos se encuentran el MP3, MOD, WAV... y otros.

Como comentamos hace unas líneas cuando no necesitemos tener la música disponible en memoria principal deberemos liberar ésta para realizar una buena gestión de nuestros recursos. La función que permite realizar esta tarea es:
void Mix_FreeMusic(Mix_Music);

Esta función recibe como parámetro el puntero devuelto al cargar el fichero de música y como ya hemos dicho libera los recursos ocupados por ella.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Guillermo575

Cita de: Xafi en 29 Marzo 2011, 11:02 AM
Mix_LoadMP3("music.mp3"); prueba  a ver si  funciona.

EDITO: No funciona creo...


ya lo probe y tienes razon no funciona...
Y en cuanto a lo de liberar la variable que contiene el archivo que tiene si los tenia pero los borre en esta ocasion para que no abarcara tanto espacio para publicarlas
¿No hay alguna libreria tanto en sdl o en otra que me permita reproducir mp3?
Saludos

anonimo12121

Podrías poner el código que debería de funcionar en teoría para el .mp3.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Guillermo575

¿ya probaste el codigo?  es que no se si sea el ide o algun elemento ajeno al codigo

anonimo12121

el código que tienes puesto es para cargar una extensión .mid quizás tendrías que poner .mp3
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Guillermo575

Cita de: Xafi en 29 Marzo 2011, 23:06 PM
el código que tienes puesto es para cargar una extensión .mid quizás tendrías que poner .mp3
Eso era lo que queria decir, si cambias el nombre del archivo y lo cambias por el de un archivo mp3 (con todo y extension) no sonara nada

anonimo12121

Tendría que ser cancion = Mix_LoadMUS("music.mp3"); prueba otra canción  a ver si va pero entonces no sé que puede ser.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Guillermo575

oye,¿ sabes para que sirve esta linea de codigo?:
Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)

vi en internet que sugeria cambiarle  los parametros pero no se para que sirve

anonimo12121

Según el tutorial:

CitarInicializando la librería

Para poder utilizar esta librería el subsistema de audio debe estar inicializado. Para ello se utiliza la bandera SDL_INIT_AUDIO en la función SDL_Init(). Una vez inicializado este subsistema debemos de iniciar la librería como en las demás librerías adicionales. Las funciones de SDL_mixer tienen en común que comienzan por Mix_ por lo que son fácilmente diferenciables de las nativas de SDL.

Para inicializar librería llamaremos a la función:
int Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize);

En las nuevas versiones de SDL esta función se encarga también de abrir el dispositivo de audio por lo que no tenemos que inicializarlo previamente. Esta es la primera función de SDL_mixer a la que debemos llamar en nuestra aplicación. El primer parámetro que recibe la función es la frecuencia en hertzios (Hz) que queremos reproducir el sample. Los valores habituales para este parámetro los vimos estudiando el subsistema de audio de SDL. Ponemos aquí un recordatorio:
11025: Calidad telefónica.
22050: Calidad de radio. Es el máximo que permite recibir el oido humano.
44100: Calidad CD.

Como recordarás son valores idénticos a los utilizados en el subsistema de audio de SDL para el manejo del sonido. El campo format especifica los bits y el tipo del sample. Los posibles valores que puede tomar este campo son:
AUDIO_U8: Sample de 8 bits sin signo.
AUDIO_S8: Sample de 8 bits con signo.
AUDIO_U16 o AUDIO_U16LSB: Sample de 16 bits sin signo en formato little-endian.
AUDIO_S16 o AUDIO_S16LSB: Sample de 16 bits sin signo en formato little-endian.
AUDIO_16MSB: Sample de 16 bits sin signo en formato big-endian.
AUDIO_U16SYS: Dependiendo del diseño de nuestro sistema será AUDIO_U16LSB si es litle-endian o AUDIO_U16MSB si el sistema es big-endian.
AUDIO_S16SYS: Dependiendo del diseño de nuestro sistema será AUDIO_S16LSB si es litle-endian o AUDIO_S16MSB si el sistema es big-endian.

Como en el parámetro anterior los valores son los mismos que puede tomar dicho parámetro en las funciones que manejan el sonido nativamente en SDL. En el parámetro channels indicamos en el número de canales que queremos trabajar, 1 para mono, 2 para estéreo. El último de los parámetros, chunksize, es el tamaño de chunk que queremos especificar en nuestra aplicación. La documentación aconseja usar un valor de 4096.

Esta función de inicialización realiza las mismas tareas que la función SDL_OpenAudioSpec que estudiamos en el manejo nativo del sonido por parte de SDL. Existen varias constantes que podemos utilizar al definir el formato y la frecuencia que queremos utilizar si no somos unos expertos. MIX_DEFAULT_FREQUENCY es el valor por defecto a utilizar cuando hablamos de frecuencia, esta constate contiene el valor 22050. El formato por defecto viene dado por MIX_DEFAULT_FORMAT que es equivalente a AUDIO_S16SYS. La última de las constantes es MIX_DEFAULT_CHANNELS que especifica el número de canales por defecto y que equivale a establecer dos canales.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746