Bienvenidos sean a este post, hoy les traigo una solucion a un inconveniente o issue que me sucedio.
Mientras armo el curso de SDL, que actualmente se esta publicando, me surgio un inconveniente pero relacionado a SDL3_Mixer. Cuando quise cargar un archivo de audio, me arrojo el siguiente error:
Audio data is in unknown/unsupported/corrupt format
Siendo que, en teoria, de manera predeterminada esta libreria soporta los siguientes formatos:
- ogg
- wav
- mod
- gme
Porque tenemos las librerias (.dll) en la solucion para poder utilizarlos pero en la practica cuando queremos usarlos, por lo menos en mi caso, me devolvio el mensaje que comente anteriorente.
Investigando un poco y usando la funcion MIX_GetAudioDecoder, me entere que los unicos decodificadores disponibles son:
- RAW
- SINEWAVE
Como son los mas basicos de los mas basicos de los decodificadores, al cargar un archivo de los permitidos devuelve el error anteriormente citado.
Hasta aca, tenemos todo el contexto del error. Cual es y porque creo que se genera; con todo esto comentado podemos pasar a solucionarlo. Todo esto que haremos es suponiendo que ya tienen habilitado a SDL3_Mixer en su proyecto. Y me voy a centrar en como habilitar dos de los cuatro tipos de audio en la libreria. Estos van a ser OGG y WAV porque son los que utilizo en el curso para la musica y los efectos respectivamente.
Pasemos a habilitar a WAV, y para ello debemos ir a decoder_wav.c en Sources del Explorador de Vistas en Visual Studio, o en el directorio src de la replica del repositorio.

En este archivo, agregaremos la definicion de un preprocesador antes de esta linea:
#ifdef DECODER_WAV
Y la nueva definicion que agregaremos, sera la siguiente:
#define DECODER_WAV
Esta es basicamente para poder hacer que se cumpla ese condicional y se definan todas las propiedades y funciones para poder decodificar este tipo de formato y asi poder utilizarlo. Les dejo una imagen para que vean donde se agrega esta linea:

Como dijimos, ya habilitamos la decodificacion para los WAV. Nuestro siguiente paso es ir a decoder_stb_vorbis.c, tambien en Sources, para poder realizar las mismas modificaciones. Antes del condicional #ifdef DECODER_OGGVORBIS_STB agregaremos la siguiente linea:
#define DECODER_OGGVORBIS_STB
Al igual que en el caso anterior, servira para que se cumpla el condicional y poder habilitar todas las propiedades y funciones para poder decodificar los OGG. Otra opcion que podemos implementar es eliminar a los condicionales para que no verifique si existen esas definiciones. Esto lo hago asi por un tema de practicidad, siento que es mas simple agregar la definicion para cumplir la condicion y se defina todo. Con esto, tenemos parcialmente habilitado todo lo necesario. Para completarlo, debemos ir a SDL_mixer.c, tambien en Sources, donde agregaremos las siguientes lineas al inicio:
#define DECODER_WAV
#define DECODER_OGGVORBIS_STB
Estas seran las verdaderas lineas encargadas de hacer que todo funcione. Porque permitiran que se cumplan un par de condiciones para que se agreguen estos decodificadores para poder ser enlistados en donde se informan los decodificadores habilitados y la libreria sepa que puede utilizarlos. Les dejo una imagen para que sepan donde ubicarlos

Ya con esto, tenemos todo habilitado para poder usar tanto a WAV como OGG para poder poner musica y efectos en el juego. Les muestro como me aparecen ahora los decodificadores que tenemos habilitado:
#0: WAV
#1: STBVORBIS
#2: SINEWAVE
#3: RAW
Tambien podemos habilitarlo de otra manera, sin agregar las definiciones anteriores en SDL_mixer.c. En el mismo archivo debemos buscar la siguiente variable:
static const MIX_Decoder *decoders[] = {
#ifdef DECODER_WAV
&MIX_Decoder_WAV,
#endif
#ifdef DECODER_OGGVORBIS_VORBISFILE
&MIX_Decoder_VORBIS,
#endif
#ifdef DECODER_OGGVORBIS_STB
&MIX_Decoder_STBVORBIS,
#endif
#ifdef DECODER_OPUS
&MIX_Decoder_OPUS,
#endif
#ifdef DECODER_FLAC_LIBFLAC
&MIX_Decoder_FLAC,
#endif
#ifdef DECODER_FLAC_DRFLAC
&MIX_Decoder_DRFLAC,
#endif
#ifdef DECODER_MIDI_FLUIDSYNTH
&MIX_Decoder_FLUIDSYNTH,
#endif
#ifdef DECODER_MIDI_TIMIDITY
&MIX_Decoder_TIMIDITY,
#endif
#ifdef DECODER_WAVPACK
&MIX_Decoder_WAVPACK,
#endif
#ifdef DECODER_GME
&MIX_Decoder_GME,
#endif
#ifdef DECODER_MOD_XMP
&MIX_Decoder_XMP,
#endif
#ifdef DECODER_VOC
&MIX_Decoder_VOC,
#endif
#ifdef DECODER_AIFF
&MIX_Decoder_AIFF,
#endif
#ifdef DECODER_AU
&MIX_Decoder_AU,
#endif
#ifdef DECODER_MP3_MPG123
&MIX_Decoder_MPG123,
#endif
#ifdef DECODER_MP3_DRMP3
&MIX_Decoder_DRMP3,
#endif
// these are always available.
&MIX_Decoder_SINEWAVE,
&MIX_Decoder_RAW
};
Como mencionamos anteriorente, estos son los condicionales encargados de agregar los decodificadores que podemos utilizar, siempre y cuando se cumpla el condicional, y asi agregarlo en el array. Podemos modificar esta definicion de la siguiente manera:
static const MIX_Decoder *decoders[] = {
#ifdef DECODER_OGGVORBIS_VORBISFILE
&MIX_Decoder_VORBIS,
#endif
#ifdef DECODER_OPUS
&MIX_Decoder_OPUS,
#endif
#ifdef DECODER_FLAC_LIBFLAC
&MIX_Decoder_FLAC,
#endif
#ifdef DECODER_FLAC_DRFLAC
&MIX_Decoder_DRFLAC,
#endif
#ifdef DECODER_MIDI_FLUIDSYNTH
&MIX_Decoder_FLUIDSYNTH,
#endif
#ifdef DECODER_MIDI_TIMIDITY
&MIX_Decoder_TIMIDITY,
#endif
#ifdef DECODER_WAVPACK
&MIX_Decoder_WAVPACK,
#endif
#ifdef DECODER_GME
&MIX_Decoder_GME,
#endif
#ifdef DECODER_MOD_XMP
&MIX_Decoder_XMP,
#endif
#ifdef DECODER_VOC
&MIX_Decoder_VOC,
#endif
#ifdef DECODER_AIFF
&MIX_Decoder_AIFF,
#endif
#ifdef DECODER_AU
&MIX_Decoder_AU,
#endif
#ifdef DECODER_MP3_MPG123
&MIX_Decoder_MPG123,
#endif
#ifdef DECODER_MP3_DRMP3
&MIX_Decoder_DRMP3,
#endif
// these are always available.
&MIX_Decoder_WAV,
&MIX_Decoder_STBVORBIS,
&MIX_Decoder_SINEWAVE,
&MIX_Decoder_RAW
};
Esto funcionara siempre que hayamos habilitado la definicion de esos dos objetos. En cualquiera de los dos casos, una vez realizado estos cambios pueden usar tanto archivos WAV como OGG para reproducir. A continuacion, les dejo un video donde ahora si nuestro proyecto finalmente reproduce un archivo .ogg:
Esto es simplemente para cubrir una habilitacion basica de decodificadores que ya estan «habilitados» en el codigo de SDL3_Mixer. Y si miran en el ultimo segmento codigo, existen muchos mas pero no estan habilitados. De hecho, si miran en el codigo del repositorio tenemos todo para crear las nuevas librerias y usarlas. Por un tema de tiempos, no me puse a ver como implementar nuevas librerias. Pero si en algun momento, logro implementarlas y utilizarlas no duden que publicare un post explicando esto. Para finalizar, voy a citar a un gran amigo mio que siempre terminaba estos tutoriales de la siguiente manera:
A mi me funciono, y a vos?
Raul Picos
Tambien les dejo un link donde podran acceder a todo los posts del curso que estoy desarrollando para aprender sobre SDL3:
En resumen, hoy hemos visto un inconveniente que me surgio trabajando con SDL3_Mixer, la imposibilidad de abrir archivos con extension ogg o wav, hicimos todos los pasos necesarios para habilitar con una pequeña variante, asi como un link para acceder al curso, en el momento que finalice subire el listado con todos los posts. Espero les haya sido de utilidad y pueden seguirme en las siguientes redes sociales para recibir una notificacion sobre nuevos posts u otros contenidos:


Donación
Es para mantenimento del sitio, gracias!
$1.50





