es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Fallo al inicializar el audio SDL

Cuando llamo a SDL_Init pasando SDL_AUDIO_INIT, la función devuelve un fallo.

Llamé a SDL_GetError() pero no parece haber ningún mensaje.
No tengo problemas para inicializar el VIDEO, solo el audio. No obtengo ningún error al compilar. He vinculado la biblioteca SDL mixer en mi makefile.

Aquí tienes un código mínimo de ejemplo:

#include <SDL2/SDL.h>
#include <stdio.h>
#include

int main( int argc, char* args[] )
{

//Inicializar SDL
if( SDL_Init( SDL_INIT_VIDEO < 0))
{
printf(“¡No se pudo inicializar el VIDEO de SDL! Error de SDL: %s\n”, SDL_GetError() );
}
else if ( SDL_Init( SDL_INIT_AUDIO) < 0)
{
printf(“¡No se pudo inicializar el AUDIO de SDL! Error de SDL: %s\n”, SDL_GetError() );
}
else
{
printf(“video y audio inicializados”);
}

return 0;
}

output: ¡No se pudo inicializar el AUDIO de SDL! Error de SDL:

(no hay mensaje para el error)

Aquí está el makefile:

#OBJS especifica qué archivos compilar como parte del proyecto
OBJS = 21_sound_effects_and_music.cpp

#CC especifica qué compilador estamos usando
CC = g++

#COMPILER_FLAGS especifica las opciones de compilación adicionales que estamos usando

-w suprime todas las advertencias

COMPILER_FLAGS = -g -Wall

#LINKER_FLAGS especifica las bibliotecas con las que estamos enlazando
LINKER_FLAGS = -lSDL2 -lSDL2_image -lSDL2_ttf -lSDL2_mixer

#OBJ_NAME especifica el nombre de nuestro ejecutable
OBJ_NAME = sdl_program

#Este es el objetivo que compila nuestro ejecutable
all : $(OBJS)
$(CC) $(OBJS) $(COMPILER_FLAGS) $(LINKER_FLAGS) -o $(OBJ_NAME)

Estoy usando Ubuntu 20.04

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según el código y la información proporcionada, parece que el problema radica en el orden en que se llama a la función SDL_Init(). El código primero inicializa SDL con SDL_INIT_VIDEO y verifica si tiene éxito. Si falla, imprime un mensaje de error con SDL_GetError(). Sin embargo, si tiene éxito, luego inicializa SDL con SDL_INIT_AUDIO sin volver a verificar el valor de retorno de SDL_Init().

    Para solucionar este problema, el código debe separar la inicialización de video y audio, y verificar errores después de cada llamada a SDL_Init(), de la siguiente manera:

    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        printf("¡SDL VIDEO no pudo inicializarse! Error de SDL: %s\n", SDL_GetError());
        return -1;
    }
    
    if (SDL_Init(SDL_INIT_AUDIO) < 0)
    {
        printf("¡SDL AUDIO no pudo inicializarse! Error de SDL: %s\n", SDL_GetError());
        return -1;
    }
    
    // Tanto video como audio se han inicializado correctamente en este punto
    printf("Video y audio han sido inicializados\n");
    

    Además, es buena práctica devolver explícitamente un código de error si alguna de las llamadas a SDL_Init() falla, y verificar el valor de retorno de SDL_Init() antes de proceder con cualquier otra operación relacionada con SDL.

Comments are closed.