dungeon_crawler

annotate prototype/src/audio/auman.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
children d57df51f6b50
rev   line source
nuclear@48 1 #include <algorithm>
nuclear@48 2 #include <new>
nuclear@48 3 #include "auman.h"
nuclear@48 4
nuclear@48 5 AudioManager::AudioManager()
nuclear@48 6 {
nuclear@48 7 if(!(sources = kd_create(3))) {
nuclear@48 8 fprintf(stderr, "failed to create kd tree\n");
nuclear@48 9 throw std::bad_alloc();
nuclear@48 10 }
nuclear@48 11 }
nuclear@48 12
nuclear@48 13 AudioManager::~AudioManager()
nuclear@48 14 {
nuclear@48 15 kd_free(sources);
nuclear@48 16 }
nuclear@48 17
nuclear@48 18 void AudioManager::clear()
nuclear@48 19 {
nuclear@48 20 kd_clear(sources);
nuclear@48 21
nuclear@48 22 for(auto s : active_set) {
nuclear@48 23 s->stop();
nuclear@48 24 }
nuclear@48 25 active_set.clear();
nuclear@48 26 }
nuclear@48 27
nuclear@48 28 void AudioManager::add_source(AudioSource *s)
nuclear@48 29 {
nuclear@48 30 Vector3 pos = s->get_position();
nuclear@48 31 if(kd_insert3f(sources, pos.x, pos.y, pos.z, s) == -1) {
nuclear@48 32 fprintf(stderr, "AudioManager: failed to add source!\n");
nuclear@48 33 }
nuclear@48 34 }
nuclear@48 35
nuclear@48 36 void AudioManager::active_range(const Vector3 &pos, float range)
nuclear@48 37 {
nuclear@48 38 std::set<AudioSource*> newset;
nuclear@48 39
nuclear@48 40 // find all the sources in the given range and construct newset.
nuclear@48 41 struct kdres *results = kd_nearest_range3f(sources, pos.x, pos.y, pos.z, range);
nuclear@48 42 while(!kd_res_end(results)) {
nuclear@48 43 newset.insert((AudioSource*)kd_res_item_data(results));
nuclear@48 44 kd_res_next(results);
nuclear@48 45 }
nuclear@48 46 kd_res_free(results);
nuclear@48 47
nuclear@48 48 /* for each of the currently active sources, if they're not in the
nuclear@48 49 * new set, stop the playback.
nuclear@48 50 */
nuclear@48 51 for(auto s : active_set) {
nuclear@48 52 if(newset.find(s) == newset.end()) {
nuclear@48 53 s->stop();
nuclear@48 54 }
nuclear@48 55 }
nuclear@48 56
nuclear@48 57 /* for each of the new active sources not found in the currently active
nuclear@48 58 * set, start the playback.
nuclear@48 59 */
nuclear@48 60 for(auto s : newset) {
nuclear@48 61 if(active_set.find(s) == active_set.end()) {
nuclear@48 62 s->play();
nuclear@48 63 }
nuclear@48 64 }
nuclear@48 65
nuclear@48 66 // swap the current with the new, previous current will be destroyed at end of scope
nuclear@48 67 std::swap(active_set, newset);
nuclear@48 68 }