Mercurial > hg > beaglert
diff projects/tank_wars/main.cpp @ 22:fbfeb5895efd matrix_gpio
Updated tank wars demo for new API
author | andrewm |
---|---|
date | Sun, 03 May 2015 01:10:17 +0100 |
parents | 901d205d1a3c |
children | 3c3a1357657d |
line wrap: on
line diff
--- a/projects/tank_wars/main.cpp Thu Apr 30 17:43:08 2015 +0100 +++ b/projects/tank_wars/main.cpp Sun May 03 01:10:17 2015 +0100 @@ -10,12 +10,54 @@ #include <libgen.h> #include <signal.h> #include <getopt.h> +#include <sndfile.h> #include "../../include/RTAudio.h" extern int gScreenFramesPerSecond; +float *gMusicBuffer = 0; +int gMusicBufferLength = 0; +float *gSoundBoomBuffer = 0; +int gSoundBoomBufferLength = 0; + using namespace std; +// Load a sound sample from file +int loadSoundFile(const string& path, float **buffer, int *bufferLength) +{ + SNDFILE *sndfile ; + SF_INFO sfinfo ; + + if (!(sndfile = sf_open (path.c_str(), SFM_READ, &sfinfo))) { + cout << "Couldn't open file " << path << endl; + return 1; + } + + int numChan = sfinfo.channels; + if(numChan != 1) + { + cout << "Error: " << path << " is not a mono file" << endl; + return 1; + } + + *bufferLength = sfinfo.frames * numChan; + *buffer = new float[*bufferLength]; + if(*buffer == 0){ + cout << "Could not allocate buffer" << endl; + return 1; + } + + int subformat = sfinfo.format & SF_FORMAT_SUBMASK; + int readcount = sf_read_float(sndfile, *buffer, *bufferLength); + + // Pad with zeros in case we couldn't read whole file + for(int k = readcount; k < *bufferLength; k++) + (*buffer)[k] = 0; + + sf_close(sndfile); + return 0; +} + // Handle Ctrl-C by requesting that the audio rendering stop void interrupt_handler(int var) { @@ -36,6 +78,8 @@ int main(int argc, char *argv[]) { RTAudioSettings settings; // Standard audio settings + string musicFileName = "music.wav"; + string soundBoomFileName = "boom.wav"; struct option customOptions[] = { @@ -70,6 +114,14 @@ } } + // Load the sound files + if(loadSoundFile(musicFileName, &gMusicBuffer, &gMusicBufferLength) != 0) { + cout << "Warning: unable to load sound file " << musicFileName << endl; + } + if(loadSoundFile(soundBoomFileName, &gSoundBoomBuffer, &gSoundBoomBufferLength) != 0) { + cout << "Warning: unable to load sound file " << soundBoomFileName << endl; + } + // Initialise the PRU audio device if(BeagleRT_initAudio(&settings, 0) != 0) { cout << "Error: unable to initialise audio" << endl; @@ -97,6 +149,12 @@ // Clean up any resources allocated for audio BeagleRT_cleanupAudio(); + // Release sound files + if(gMusicBuffer != 0) + free(gMusicBuffer); + if(gSoundBoomBuffer != 0) + free(gSoundBoomBuffer); + // All done! return 0; }