summaryrefslogtreecommitdiff
path: root/src/audio-types.hpp
blob: c573f2baf5765fce372aeee653721d497fc36dbd (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
57
58
59
60
61
62
63
64
65
#ifndef PKE_AUDIO_TYPES_INTERNAL_HPP
#define PKE_AUDIO_TYPES_INTERNAL_HPP

#include "asset-manager.hpp"
#include "components.hpp"
#include "pk.h"

#include "vendor-glm-include.hpp"

#define PKE_AUDIO_MAX_CONCURRENT_COUNT 8
#define PKE_AUDIO_MAX_SPATIAL_DISTANCE 256.f
#define PKE_AUDIO_BITRATE              48000
#define PKE_AUDIO_BUFFER_FRAMES        2048

TypeSafeInt_constexpr(pke_audio_flags, uint8_t, 0xFF);
TypeSafeInt_constexpr(pke_audio_source, uint8_t, 0x40);

const pke_audio_flags  pke_audio_flag_none        = pke_audio_flags{0x00};
const pke_audio_flags  pke_audio_flag_pos_spatial = pke_audio_flags{0x01};

const pke_audio_source pke_audio_source_music   = pke_audio_source{0x00};
const pke_audio_source pke_audio_source_ambient = pke_audio_source{0x01};
const pke_audio_source pke_audio_source_voices  = pke_audio_source{0x02};
const pke_audio_source pke_audio_source_sfx     = pke_audio_source{0x03};

struct pke_audio_fx_params_reverb {
	float reverb_strength;
};

struct pke_audio_fx_params_delay {
	int64_t delay_frames;
};

struct pke_audio_fx_params_low_pass_filter {
	float cutoff_freq;
	float prev_output;
};

struct pke_audio_obj {
	AssetHandle      handle; // key
	pke_audio_source source; // key
	InstanceHandle   instance_handle[PKE_AUDIO_MAX_CONCURRENT_COUNT];
	glm::vec3        position_source[PKE_AUDIO_MAX_CONCURRENT_COUNT];
	pke_audio_flags  flags[PKE_AUDIO_MAX_CONCURRENT_COUNT];
	uint32_t         play_heads[PKE_AUDIO_MAX_CONCURRENT_COUNT];
	uint8_t          play_count;
};

struct pke_audio_master {
	pk_arr_t<pke_audio_obj>  playing_objects;
	pk_membucket            *bkt;
	float                    master_volume;
	float                    source_volumes[pke_audio_source_T_MAX];
	uint32_t                 channel_count; // mono, stereo, 7.1
	float                   *buffer;
	int64_t                  buffer_size;
	int64_t                  buffer_frames;
	int64_t                  elapsed_ns;
	std::mutex               mtx_buffer;
	std::chrono::time_point<std::chrono::steady_clock> last_tick_tp{};
};

extern struct pke_audio_master pke_audio_mstr;

#endif /* PKE_AUDIO_TYPES_INTERNAL_HPP */