Skip to content

Instantly share code, notes, and snippets.

@armornick
Created August 24, 2012 07:31
Show Gist options
  • Select an option

  • Save armornick/3447121 to your computer and use it in GitHub Desktop.

Select an option

Save armornick/3447121 to your computer and use it in GitHub Desktop.

Revisions

  1. armornick created this gist Aug 24, 2012.
    76 changes: 76 additions & 0 deletions playwav.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,76 @@
    #include <SDL2/SDL.h>

    #define MUS_PATH "Roland-GR-1-Trumpet-C5.wav"

    // prototype for our audio callback
    // see the implementation for more information
    void my_audio_callback(void *userdata, Uint8 *stream, int len);

    // variable declarations
    static Uint8 *audio_pos; // global pointer to the audio buffer to be played
    static Uint32 audio_len; // remaining length of the sample we have to play


    /*
    ** PLAYING A SOUND IS MUCH MORE COMPLICATED THAN IT SHOULD BE
    */
    int main(int argc, char* argv[]){

    // Initialize SDL.
    if (SDL_Init(SDL_INIT_AUDIO) < 0)
    return 1;

    // local variables
    static Uint32 wav_length; // length of our sample
    static Uint8 *wav_buffer; // buffer containing our audio file
    static SDL_AudioSpec wav_spec; // the specs of our piece of music


    /* Load the WAV */
    // the specs, length and buffer of our wav are filled
    if( SDL_LoadWAV(MUS_PATH, &wav_spec, &wav_buffer, &wav_length) == NULL ){
    return 1;
    }
    // set the callback function
    wav_spec.callback = my_audio_callback;
    wav_spec.userdata = NULL;
    // set our global static variables
    audio_pos = wav_buffer; // copy sound buffer
    audio_len = wav_length; // copy file length

    /* Open the audio device */
    if ( SDL_OpenAudio(&wav_spec, NULL) < 0 ){
    fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
    exit(-1);
    }

    /* Start playing */
    SDL_PauseAudio(0);

    // wait until we're don't playing
    while ( audio_len > 0 ) {
    SDL_Delay(100);
    }

    // shut everything down
    SDL_CloseAudio();
    SDL_FreeWAV(wav_buffer);

    }

    // audio callback function
    // here you have to copy the data of your audio buffer into the
    // requesting audio buffer (stream)
    // you should only copy as much as the requested length (len)
    void my_audio_callback(void *userdata, Uint8 *stream, int len) {

    if (audio_len ==0)
    return;

    len = ( len > audio_len ? audio_len : len );
    //SDL_memcpy (stream, audio_pos, len); // simply copy from one buffer into the other
    SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);// mix from one buffer into another

    audio_pos += len;
    audio_len -= len;
    }