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