Created
May 31, 2017 20:57
-
-
Save ander94lakx/66fbc22e60e708027f68bb4f7a4394db to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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