dungeon_crawler

annotate prototype/src/audio/auman.cc @ 51:d57df51f6b50

- fixed audio panning (listener direction) - particles had no fog - sound sources were not destroyed properly
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 18 Sep 2012 09:40:56 +0300
parents aa9e28670ae2
children
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@51 11 kd_data_destructor(sources, [](void *s) { delete (AudioSource*)s; });
nuclear@48 12 }
nuclear@48 13
nuclear@48 14 AudioManager::~AudioManager()
nuclear@48 15 {
nuclear@48 16 kd_free(sources);
nuclear@48 17 }
nuclear@48 18
nuclear@48 19 void AudioManager::clear()
nuclear@48 20 {
nuclear@48 21 for(auto s : active_set) {
nuclear@48 22 s->stop();
nuclear@48 23 }
nuclear@48 24 active_set.clear();
nuclear@51 25
nuclear@51 26 kd_clear(sources);
nuclear@48 27 }
nuclear@48 28
nuclear@48 29 void AudioManager::add_source(AudioSource *s)
nuclear@48 30 {
nuclear@48 31 Vector3 pos = s->get_position();
nuclear@48 32 if(kd_insert3f(sources, pos.x, pos.y, pos.z, s) == -1) {
nuclear@48 33 fprintf(stderr, "AudioManager: failed to add source!\n");
nuclear@48 34 }
nuclear@48 35 }
nuclear@48 36
nuclear@48 37 void AudioManager::active_range(const Vector3 &pos, float range)
nuclear@48 38 {
nuclear@48 39 std::set<AudioSource*> newset;
nuclear@48 40
nuclear@48 41 // find all the sources in the given range and construct newset.
nuclear@48 42 struct kdres *results = kd_nearest_range3f(sources, pos.x, pos.y, pos.z, range);
nuclear@48 43 while(!kd_res_end(results)) {
nuclear@48 44 newset.insert((AudioSource*)kd_res_item_data(results));
nuclear@48 45 kd_res_next(results);
nuclear@48 46 }
nuclear@48 47 kd_res_free(results);
nuclear@48 48
nuclear@48 49 /* for each of the currently active sources, if they're not in the
nuclear@48 50 * new set, stop the playback.
nuclear@48 51 */
nuclear@48 52 for(auto s : active_set) {
nuclear@48 53 if(newset.find(s) == newset.end()) {
nuclear@48 54 s->stop();
nuclear@48 55 }
nuclear@48 56 }
nuclear@48 57
nuclear@48 58 /* for each of the new active sources not found in the currently active
nuclear@48 59 * set, start the playback.
nuclear@48 60 */
nuclear@48 61 for(auto s : newset) {
nuclear@48 62 if(active_set.find(s) == active_set.end()) {
nuclear@48 63 s->play();
nuclear@48 64 }
nuclear@48 65 }
nuclear@48 66
nuclear@48 67 // swap the current with the new, previous current will be destroyed at end of scope
nuclear@48 68 std::swap(active_set, newset);
nuclear@48 69 }