dungeon_crawler

diff prototype/src/audio/sample.cc @ 48:aa9e28670ae2

added sound playback, more to do
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 17 Sep 2012 08:40:59 +0300
parents d52711f2b9a1
children 45172d087ebe
line diff
     1.1 --- a/prototype/src/audio/sample.cc	Sun Sep 16 08:16:50 2012 +0300
     1.2 +++ b/prototype/src/audio/sample.cc	Mon Sep 17 08:40:59 2012 +0300
     1.3 @@ -5,6 +5,17 @@
     1.4  #include "openal.h"
     1.5  #include "sample.h"
     1.6  
     1.7 +
     1.8 +#define CHECK_ERROR \
     1.9 +    do { \
    1.10 +        unsigned int err = alGetError(); \
    1.11 +        if(err != 0) { \
    1.12 +            fprintf(stderr, "%s:%d: AL error: %#x\n", __FILE__, __LINE__, err); \
    1.13 +            abort(); \
    1.14 +        } \
    1.15 +    } while(0)
    1.16 +
    1.17 +
    1.18  AudioSample::AudioSample()
    1.19  {
    1.20  	albuffer = 0;
    1.21 @@ -36,7 +47,7 @@
    1.22  	printf("loading sample: %s: %ld samples/s, %s (%d chan)\n", fname, vinfo->rate,
    1.23  			vinfo->channels == 1 ? "mono" : "stereo", vinfo->channels);
    1.24  
    1.25 -	long num_samples = ov_pcm_total(&vf, -1);
    1.26 +	long num_samples = ov_pcm_total(&vf, -1) * vinfo->channels;
    1.27  	int16_t *samples = new int16_t[num_samples];
    1.28  
    1.29  	long bufsz = num_samples * sizeof *samples;
    1.30 @@ -62,6 +73,7 @@
    1.31  	}
    1.32  
    1.33  	alBufferData(bufobj, alfmt, samples, bufsz, vinfo->rate);
    1.34 +	CHECK_ERROR;
    1.35  	if(alGetError()) {
    1.36  		fprintf(stderr, "failed to load sample data into OpenAL buffer: %u\n", bufobj);
    1.37  		goto err;
    1.38 @@ -82,3 +94,19 @@
    1.39  	}
    1.40  	return false;
    1.41  }
    1.42 +
    1.43 +AudioSample *load_audio_sample(const char *fname)
    1.44 +{
    1.45 +	AudioSample *s = new AudioSample;
    1.46 +
    1.47 +	if(!s->load(fname)) {
    1.48 +		delete s;
    1.49 +		s = 0;
    1.50 +	}
    1.51 +	return s;
    1.52 +}
    1.53 +
    1.54 +void destroy_audio_sample(AudioSample *s)
    1.55 +{
    1.56 +	delete s;
    1.57 +}