Problemas cargando musica con SDL_mixer

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Problemas cargando musica con SDL_mixer

Notapor lacabra25 » Lun Jul 07, 2008 7:12 pm

Hola, tengo un pequeño problemilla intentando cargar un archivo de musica que no llega ni a un mega, el resto del programa esta bien, pues si quito la parte de cargar la musica el resto del programa va bien pero si no no responde al llegar a esa parte:

Código: Seleccionar todo
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_mixer.h>

/*Definicion de constantes*/
/*Titulo de la ventana y texto del icono*/
#define TV "Tanks Wars"
#define TI "Tanks Wars"
/*Maximo de caracteres para el nombre de los drivers*/
#define MAXIMO_NOMBRES_DRIVERS 20
/*Cantidad de rojo, verde y azul para color que se utilizara como transparente en las imagenes*/
#define RT 255
#define VT 0
#define AT 255
/* Fin de la definicion de constantes*/

/*Declaracion de funciones*/
/*Repite fondomenu en toda pantalla*/
int dibujar_fondo_menu(SDL_Surface *fondomenu, SDL_Surface *pantalla);
/*Carga una imagen, comprueba que ha sido cargada, define el color que se usara como transparente y devuelve el puntero a la imagen cargada convertida al tipo de pixel de la pantalla*/
SDL_Surface * cargar_img(const char *a, SDL_Surface *p);
/*Borra la superficie que se le pase dibujando un rectangulo negro en toda la superficie (por ejemplo borra la pantalla)*/
int borrar_superficie(SDL_Surface *s);
/* Fin de la declaracion de funciones*/

int main(int argc, char *argv[])
{
    /*Declaraciones de variables y punteros*/
    /* Declaracion de variables y punteros para el video*/
    SDL_Surface *pantalla, *fondomenu, *bmenua, *bmenue, *bcargando;
    SDL_Rect destino;
    char n_driver_video[MAXIMO_NOMBRES_DRIVERS];
    /*  Fin*/
    /* Declaracion de variables y punteros para los eventos*/
    SDL_Event evento;
    /*  Fin*/
    /* Declaracion de variables y punteros para el control de la ejecucion*/
    register int e=1;
    register unsigned long int xd=0, yd=0;
    Uint32 tiempo;
    /*  Fin*/
    /* Declaracion de variables y punteros para la reproduccion y control de el audio*/
    unsigned int inicializadoaudio=0, musica=0;
    Mix_Music *musicamenu1;
    /*  Fin*/
    /* Fin*/
    /*Iniciando SDL*/
    if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) < 0)
    {
        printf("No se pudo iniciar SDL: %s\n",SDL_GetError());
        exit(1);
    }
    atexit(SDL_Quit);
    /* Fin del inicio de SDL*/
    /*Iniciar modo de video*/
    pantalla = SDL_SetVideoMode(1280,1024,24,SDL_SWSURFACE| SDL_DOUBLEBUF| SDL_NOFRAME| SDL_FULLSCREEN);
    if (pantalla == NULL)
    {
        printf("No se pudo iniciar el modo gráfico: %s\n", SDL_GetError());
        exit(1);
    }
    /* Fin del inicio del modo de video*/
    /*   Dejando la pantalla en negro*/
    borrar_superficie(pantalla);
    /*   Fin de dejando la pantalla en negro*/
    /*   Ocultando cursor hasta mostrar el menu despues de haber cargado las imagenes*/
    SDL_ShowCursor (SDL_DISABLE);
    /*   Fin del ocultamiento del cursor*/
    /*Iniciar audio*/
    if (Mix_OpenAudio(44100, AUDIO_S16, 2, 4096) != 0)
    {
        inicializadoaudio= 1;
        printf("No se pudo inicializar el audio: %s\n", SDL_GetError());
    }
    else
    {
        atexit(Mix_CloseAudio);
        Mix_VolumeMusic(128);
    }
    /* Fin del inicio de audio*/
    /*   Cambiando titulo a ventana*/
    SDL_WM_SetCaption(TV,TI);
    /*   Fin de cambiando titulo a ventana*/
    /*   Escribiendo propiedades del modo de video admitido y usado para la correccion de errores*/
    printf("Modo grafico: %uX%u\n", pantalla->w, pantalla->h);
    /*    Fin*/
    /*Obtencion del nombre del driver de video utilizado*/
    SDL_VideoDriverName(&n_driver_video[0], MAXIMO_NOMBRES_DRIVERS);
    /*  Escribiendo nomre del driver para correccion de errores*/
    if (&n_driver_video[0] != NULL)
    {
        printf("Driver de video: %s\n", n_driver_video);
    }
    /*    Fin*/
    /* Fin de la obtencion del driver de video*/
    /*Dibujando primer menu para indicar la carga*/
    fondomenu= cargar_img("Imagenes/fondo_menup.jpg", pantalla);
    dibujar_fondo_menu(fondomenu, pantalla);
    bmenua= cargar_img("Imagenes/boton_menup_apagado.png", pantalla);
    destino.w= bmenua->w;
    destino.h= bmenua->h;
    destino.x= ((pantalla->w / 2) - (bmenua->w / 2));
    destino.y= ((pantalla->h / 2) - (bmenua->h / 2));
    SDL_BlitSurface(bmenua, NULL, pantalla, &destino);
    SDL_Flip(pantalla);
    SDL_Delay(1000);
    bmenue= cargar_img("Imagenes/boton_menup_encendido.png", pantalla);
    SDL_BlitSurface(bmenue, NULL, pantalla, &destino);
    SDL_Flip(pantalla);
    SDL_Delay(500);
    bcargando= cargar_img("Imagenes/boton_menup_cargando.png", pantalla);
    SDL_BlitSurface(bcargando, NULL, pantalla, &destino);
    SDL_Flip(pantalla);
    /* Fin*/
    /*Creacion de las superficies para todas las imagenes del juego y carga de las imagenes*/
    SDL_Surface *suelo, *bsalir, *bjugar, *bred, *bacercade, *bopciones, *cseleccion, *ecolor, *objetos;
    SDL_Surface *tamarillo, *trojo, *tazul, *tverde, *trosado, *tnegro;
    suelo= cargar_img("Imagenes/suelo.jpg", pantalla);
    bsalir= cargar_img("Imagenes/boton_menup_salir.png", pantalla);
    bjugar= cargar_img("Imagenes/boton_menup_jugar.png", pantalla);
    bred= cargar_img("Imagenes/boton_menup_red.png", pantalla);
    bacercade= cargar_img("Imagenes/boton_menup_acercade.png", pantalla);
    bopciones= cargar_img("Imagenes/boton_menup_opciones.png", pantalla);
    cseleccion= cargar_img("Imagenes/controles_seleccion.png", pantalla);
    ecolor= cargar_img("Imagenes/elige_color.png", pantalla);
    objetos= cargar_img("Imagenes/objetos_escenario.png", pantalla);
    tamarillo= cargar_img("Imagenes/tanque_ligero_amarillo.png", pantalla);
    trojo= cargar_img("Imagenes/tanque_ligero_rojo.png", pantalla);
    tazul= cargar_img("Imagenes/tanque_ligero_azul.png", pantalla);
    tverde= cargar_img("Imagenes/tanque_ligero_verde.png", pantalla);
    trosado= cargar_img("Imagenes/tanque_ligero_rosa.png", pantalla);
    tnegro= cargar_img("Imagenes/tanque_ligero_negro.png", pantalla);
    /* Fin*/
    printf("Imagenes cargadas\n");
    /*Cargando audio*/
    if (inicializadoaudio == 0)
    {
        musicamenu1= Mix_LoadMUS("Sonido/musica_menu_1.mp3");
    }
    /* Fin*/
    printf("Sonidos y musica cargados\n");
    /*  Mostrando el cursor*/
    SDL_ShowCursor (SDL_ENABLE);
    /*  Fin de mostrando el cursor*/
    /*Bucle de ejecucion*/
    while (e > 0)
    {
        /*Iniciando musica si hace falta*/
        if (inicializadoaudio == 0 && musicamenu1 != NULL && musica == 0 && Mix_PlayingMusic() == 0)
        {
            Mix_FadeInMusic(musicamenu1, 0, 2000);
        }
        /* Fin*/
        /*Preparando variable destino para el dibujado del menu*/
        destino.w= bmenua->w;
        destino.h= bmenua->h;
        destino.x= ((pantalla->w / 2) - (bmenua->w / 2));
        /*Dibujando menu principal del juego si es necesario (con animacion sencilla) e=1*/
        if (e == 1)
        {
            dibujar_fondo_menu(fondomenu, pantalla);
            xd= 1;
            for (destino.y=10; destino.y < pantalla->h && xd <= 5; destino.y+= (bmenua->h + 10))
            {
                SDL_BlitSurface(bmenua, NULL, pantalla, &destino);
                xd++;
            }
            SDL_Flip(pantalla);
            SDL_Delay(1000);
            xd= 1;
            for (destino.y=10; destino.y < pantalla->h && xd <= 5; destino.y+= (bmenua->h + 10))
            {
                SDL_BlitSurface(bmenue, NULL, pantalla, &destino);
                SDL_Flip(pantalla);
                if (xd > 1)
                {
                    SDL_Delay(100);
                }
                xd++;
            }
            SDL_Delay(400);
            destino.y= 10;
            SDL_BlitSurface(bjugar, NULL, pantalla, &destino);
            destino.y+=(bmenua->h + 10);
            SDL_BlitSurface(bred, NULL, pantalla, &destino);
            destino.y+=(bmenua->h + 10);
            SDL_BlitSurface(bopciones, NULL, pantalla, &destino);
            destino.y+=(bmenua->h + 10);
            SDL_BlitSurface(bacercade, NULL, pantalla, &destino);
            destino.y+=(bmenua->h + 10);
            SDL_BlitSurface(bsalir, NULL, pantalla, &destino);
            SDL_Flip(pantalla);
        }
        /* Fin*/
        /*Dibujando menu principal del juego si es necesario (sin animacion) e=2*/
        if (e == 2)
        {
            dibujar_fondo_menu(fondomenu, pantalla);
            destino.y= 10;
            SDL_BlitSurface(bjugar, NULL, pantalla, &destino);
            destino.y+=(bmenua->h + 10);
            SDL_BlitSurface(bred, NULL, pantalla, &destino);
            destino.y+=(bmenua->h + 10);
            SDL_BlitSurface(bopciones, NULL, pantalla, &destino);
            destino.y+=(bmenua->h + 10);
            SDL_BlitSurface(bacercade, NULL, pantalla, &destino);
            destino.y+=(bmenua->h + 10);
            SDL_BlitSurface(bsalir, NULL, pantalla, &destino);
            SDL_Flip(pantalla);
        }
        /* Fin*/
        /*  e=3 para no volver a dibujar el menu en cada ejecucion del bucle mientras no sea necesario*/
        e= 3;
        /*  Fin*/
        /*Lectura de eventos*/
        while ( SDL_PollEvent(&evento))
        {
            /*Comprobando la pulsacion de teclas*/
            if (evento.type == SDL_KEYDOWN)
            {
                switch (evento.key.keysym.sym)
                {
                case SDLK_j:
                    printf("Eleccion de jugar\n");
                    break;
                case SDLK_r:
                    printf("Eleccion de jugar en red\n");
                    break;
                case SDLK_o:
                    printf("Eleccion de opciones\n");
                    break;
                case SDLK_a:
                    printf("Eleccion de acerca de tanks wars\n");
                    break;
                case SDLK_s:
                    e= 0;
                    break;
                default:
                    e= 3;
                    break;
                }
            }
            /* Fin de la comprobacion de pulsacion de teclas*/
            /*Comprobando los clicks del raton*/
            if (evento.type == SDL_MOUSEBUTTONDOWN && evento.button.button == SDL_BUTTON_LEFT)
            {
                /* Preparacion de destino para comparacion con coordenadas del raton*/
                destino.x= ((pantalla->w / 2) - (bmenua->w / 2));
                destino.y= 10;
                destino.w= ((pantalla->w / 2) + (bmenua->w / 2));
                destino.h= 10 + bmenua->h;
                for (xd= 1; xd <= 5; xd++)
                {
                    if (evento.button.y > destino.y && evento.button.x > destino.x && evento.button.x < destino.w && evento.button.y < destino.h)
                    {
                        switch (xd)
                        {
                        case 1:
                            printf("Eleccion de jugar\n");
                            break;
                        case 2:
                            printf("Eleccion de jugar en red\n");
                            break;
                        case 3:
                            printf("Eleccion de opciones\n");
                            break;
                        case 4:
                            printf("Eleccion de acerca de tanks wars\n");
                            break;
                        case 5:
                            e= 0;
                            break;
                        default:
                            e=3;
                            break;
                        }
                        break;
                    }
                    destino.y+= 10 + bmenua->h;
                    destino.h= destino.y + bmenua->h;
                }
            }
            /* Fin de la comprobacion del raton*/
            /*Comprobando si la aplicacion debe ser redibujada por peticion del sistema operativo o refresco de pantalla*/
            if (evento.type == SDL_VIDEOEXPOSE)
            {
                e= 2;
            }
            /* Fin de la comprobacion de refresco*/
            /*Comprobando si el sistema operativo intenta cerrar la aplicacion*/
            if (evento.type == SDL_QUIT)
            {
                /* Cuando este preparado los eventos del menu quitar la pulsacion de tecla de esta condicion */
                e= 0;
                break;
            }
            /* Fin de la comprobacion de intento de cerrar la aplicacion por parte del sistema operativo*/
        }
        /* Fin de la lectura de eventos*/
    }
    /* Fin del bucle de ejecucion*/
    /*Parando la musica*/
    Mix_FadeOutMusic(2000);
    /* Fin*/
    /*Finalizando la aplicacion*/
    /*  Ocultando el cursor*/
    SDL_ShowCursor (SDL_DISABLE);
    /*  Fin de ocultando el cursor*/
    /*Dejando la pantalla en negro*/
    borrar_superficie(pantalla);
    /* Fin de dejando la pantalla en negro*/
    /*Liberando superficies antes de finalizar la aplicacion*/
    SDL_FreeSurface(tamarillo);
    SDL_FreeSurface(trojo);
    SDL_FreeSurface(tazul);
    SDL_FreeSurface(tverde);
    SDL_FreeSurface(trosado);
    SDL_FreeSurface(tnegro);
    SDL_FreeSurface(suelo);
    SDL_FreeSurface(bsalir);
    SDL_FreeSurface(bjugar);
    SDL_FreeSurface(bred);
    SDL_FreeSurface(bacercade);
    SDL_FreeSurface(bopciones);
    SDL_FreeSurface(cseleccion);
    SDL_FreeSurface(ecolor);
    SDL_FreeSurface(objetos);
    SDL_FreeSurface(bcargando);
    SDL_FreeSurface(bmenue);
    SDL_FreeSurface(bmenua);
    SDL_FreeSurface(fondomenu);
    SDL_FreeSurface(pantalla);
    /* Fin*/
    /*Liberando audio antes de finalizar la aplicacion*/
    if (musicamenu1 != NULL)
    {
        Mix_FreeMusic(musicamenu1);
    }
    /* Fin*/
    /* Mostrando cursor antes de slir por completo*/
    SDL_ShowCursor(SDL_ENABLE);
    /*  Fin de mostrar el cursor*/
    /*Finalizando SDL antes de salir*/
    Mix_CloseAudio();
    SDL_Quit();
    /* Fin de la finalizacion de SDL*/
    return 0;
}

int borrar_superficie(SDL_Surface *s)
{
    SDL_Rect rb;
    rb.x = 0;
    rb.y = 0;
    rb.w = s->w;
    rb.h = s->h;
    SDL_FillRect(s,&rb,SDL_MapRGB(s->format,0,0,0));
    SDL_Flip(s);
    return 0;
}

SDL_Surface * cargar_img(const char *a, SDL_Surface *p)
{
    SDL_Surface *img;
    SDL_Surface *imgc;
    img= IMG_Load(a);
    if (img == NULL)
    {
        printf("No se ha podido cargar correctamente la imagen: %s\n", SDL_GetError());
        exit(1);
    }
    else
    {
        printf("Cargada la imagen %s\n", a);
        if (p == NULL)
        {
            SDL_SetColorKey(img,SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(img->format,RT,VT,AT));
            return img;
        }
        else
        {
            imgc= SDL_ConvertSurface(img, p->format,SDL_HWSURFACE|SDL_SRCCOLORKEY|SDL_SRCALPHA);
            SDL_FreeSurface(img);
            SDL_SetColorKey(imgc,SDL_SRCCOLORKEY|SDL_RLEACCEL,SDL_MapRGB(imgc->format,RT,VT,AT));
            return imgc;
        }
    }
}

int dibujar_fondo_menu(SDL_Surface *fondomenu, SDL_Surface *pantalla)
{
    SDL_Rect destino;
    destino.w= fondomenu->w;
    destino.h= fondomenu->h;
    for (destino.x=0; destino.x < pantalla->w; destino.x+= (fondomenu->w))
    {
        for (destino.y=0; destino.y < pantalla->h; destino.y+= (fondomenu->h))
        {
            SDL_BlitSurface(fondomenu, NULL, pantalla, &destino);
        }
    }
    return 0;
}


¿cual puede ser el error?

EDITO (hugoruscitti): Coloco identación ANSI en el código
fuente para que sea legible.

EDITO (lacabra25): Se me olvido mencionarlo con las prisas de buscar respuesta a este problema al que no le encuentro sentido, este error me ha surgido en el sistema Windows XP, lo he compilado con DevC++, el archivo de audio pesa 786 Kb y cuando quite la parte de cargar el archivo de musica todo funciono bien pero con el codigo de cargar el audio no llega ha realizar la carga de la ultima imagen, se para en la penultima y en la ventana que sale en windows al pulsar Ctrl., Alt. y Supr. pone directamente que el programa no responde.

Gracias hugoruscitti por editar el codigo del programa, con las prisas porque tenia que salir lo pegue directamente.

EDITO (lacabra25): Creo que he encontrado una solucion pero parcial, resulta que leyendo el foro volvi a ver una pregunta similar pero sobre MP3, yo ya habia echo anteriormente otro programa usando musica que funcionaba bien con MP3 por lo que no pense que tuviera relacion, y resulta que si cambio el tipo de la musica a wav o ogg funciona bien, pero no entiendo por que no funciona con MP3 si SDL_mixer soporta MP3 y yo ya he hecho anteriormente un programa en el que funcionaba la musica en MP3, ¿a que se debe que no funcione si el archivo es MP3?
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron