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