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 +}