aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/system/AudioSystem.cpp
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
	}
}