Skip to content

Instantly share code, notes, and snippets.

@ander94lakx
Created May 31, 2017 20:57
Show Gist options
  • Save ander94lakx/66fbc22e60e708027f68bb4f7a4394db to your computer and use it in GitHub Desktop.
Save ander94lakx/66fbc22e60e708027f68bb4f7a4394db to your computer and use it in GitHub Desktop.
#include <SDL2/SDL.h>
#include <stdint.h>
// Definimos la funcion "callback" (para usarla en el main())
void my_audio_callback(void *userdata, Uint8 *stream, int len);
// Variables par aindicar en que posicion esta y la lognitud de el audio QUE SE ESTA REPRODUCIENDO
static Uint8 *audio_pos; // Posicion
static Uint32 audio_len; // Longitud
int main(int argc, char* argv[]){
// PASO 1: Inicializar SDL
if (SDL_Init(SDL_INIT_AUDIO) < 0) {
return 1;
}
// PASO 2: Creamos una serie de variables para nuestro audio
char* wav_path= "soinuak/piano/DO.wav"; // Donde se encuentra nuestro audio
static Uint32 wav_length; // El tamaño de el audio (lo recibimos al cargarlo)
static Uint8 *wav_buffer; // El buffer de nuestro audio (el audio en si vaya) (lo recibimos al cargarlo)
static SDL_AudioSpec wav_spec; // Diversa informacion sobre nuestro audio (lo recibimos al cargarlo)
// PASO 3: Cargamos el audio
// Pasamos la direccion de memoria de los ultimos 3 parametros para que asi pueda
// la funcion guardar los datos en esas variables (como cuando hacemos, por ejemplo, un sscanf)
if (SDL_LoadWAV(wav_path, &wav_spec, &wav_buffer, &wav_length) == NULL) {
return 1;
}
// PASO 4: Creamos la función "Callback"
wav_spec.callback = my_audio_callback;
wav_spec.userdata = NULL;
// PASO 5: Ponemos las variables para que nuestro audio se reproduzca
audio_pos = wav_buffer;
audio_len = wav_length;
// PASO 6: Abrimos nuestro dispositivo de audio
if (SDL_OpenAudio(&wav_spec, NULL) < 0) {
fprintf(stderr, "No se ha podido abrir el audio: %s\n", SDL_GetError());
exit(-1);
}
// PASO 7: Lo reproducimos
SDL_PauseAudio(0); // Con 0 hacemos play, con 1 lo pausamos
// PASO 8: Esperamos a que se haya reproducido
while (audio_len > 0) {
SDL_Delay(1000);
}
// PASO 9: cerramos todo
SDL_CloseAudio();
SDL_FreeWAV(wav_buffer);
}
/*
* Función callback:
*
* Esta funcion es la que verdaderamente va a reproducir nuestro archivo
*
* Cuando usamos PauseAudio(0) lo que hace SDL2 el solito es llamar todo el rato a esta función
*
* Las funciones callback son un tipo de funciones que no debemos usar nosotros directamente,
* están pensadas para que se llamen solas
*/
void my_audio_callback(void *userdata, Uint8 *stream, int len) {
if (audio_len == 0)
return;
len = ( len > audio_len ? audio_len : len );
SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
audio_pos += len;
audio_len -= len;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment