blob: c8dae9d91dfd150764cc747cb2d9a68095ac106a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#include "AudioSystem.h"
#include "ComponentManager.h"
#include "../api/AudioSource.h"
using namespace crepe;
using namespace std;
void AudioSystem::update() {
ComponentManager & mgr = this->component_manager;
vector<reference_wrapper<AudioSource>> components = mgr.get_components_by_type<AudioSource>();
for (auto component_ref : components) {
AudioSource & component = component_ref.get();
if (!component.active) continue;
/**
* How this is supposed to work:
* - Get an instance of Sound for this resource/component combo (Sound
* instance is supposed to be unique per component, even if they use the
* same underlying asset).
* OR
* - Use the same instance of Sound if this is what the cache returns
* (= what the game programmer's wishes to do).
*
* NOT supposed to happen but still the case:
* - Below function call causes assets to be cached unintentionally
* - Cached assets are deleted at the end of a scene (i think?)
* - I'm not sure if the ResourceManager is even supposed to have a public
* `.clear()` method since the control over resource lifetime is
* explicitly handed over to the game programmer by using ResourceManager
* to cache/uncache. I believe the proper methods are supposed to be:
*
* - get() get a reference to resource (used here)
* - clear() clears NON-cached assets
* - cache() marks asset as "do not delete at end of scene"
* - uncache() undoes the above
*
* I think somewhere in the above function calls a unique identifier for
* the Asset/GameObject should be given to make sure the unique instance
* shit works as intended. The resource manager is also used for things
* other than sounds.
*
* Also need to check:
* - Is it an issue if there are multiple AudioSource components playing
* the same sample (= identical Asset), while they are all triggered
* using the same underlying instance of Sound (esp. w/
* play/pause/retrigger behavior).
*/
Sound & sound = this->resman.cache<Sound>(component.source);
sound.set_context(this->context);
// TODO: lots of state diffing
}
}
|