nngn
Loading...
Searching...
No Matches
audio.h
Go to the documentation of this file.
1#ifndef NNGN_AUDIO_AUDIO_H
2#define NNGN_AUDIO_AUDIO_H
3
4#include <cstddef>
5#include <memory>
6#include <span>
7#include <string_view>
8#include <vector>
9
10#include "math/math.h"
11#include "math/vec3.h"
12#include "utils/def.h"
13
14namespace nngn {
15
17class Audio {
18public:
19 enum class source : std::size_t {};
20 // Utility
22 static constexpr float db(float x) { return std::pow(10.0f, x / 20.0f); }
23 // Audio generation
25 static void gain(std::span<float> s, float g);
27 static void over(std::span<float> s, float m, float mix);
29 static void fade(std::span<float> s, float g0, float g1);
37 static void exp_fade(
38 std::span<float> s, std::size_t ep, float g0, float g1, float exp);
40 static void env(
41 std::span<float> s,
42 std::size_t a, std::size_t d, float st, std::size_t r);
44 static void mix(std::span<float> dst, std::span<const float> src);
46 static void normalize(std::span<i16> dst, std::span<const float> src);
47 // Constructors, destructors
49 Audio(void) = default;
50 ~Audio(void);
51 // Initialization, accessors
57 bool init(Math *m, std::size_t rate);
58 std::size_t rate(void) const { return this->m_rate; }
59 std::size_t n_sources(void) const;
60 // I/O
62 bool read_wav(std::string_view path, std::vector<std::byte> *v) const;
64 bool write_wav(FILE *f, std::span<const std::byte> s) const;
67 std::span<std::byte> dst, std::span<const std::byte> src) const;
69 std::vector<std::byte> gen_wav(std::span<const float> s) const;
70 // Audio generation
72 void trem(std::span<float> s, float a, float freq, float mix) const;
74 void gen_sine(std::span<float> s, float freq) const;
84 std::span<float> s, float freq,
85 float lfo_a, float lfo_freq, float lfo_d) const;
87 void gen_square(std::span<float> s, float freq) const;
89 void gen_saw(std::span<float> s, float freq) const;
91 void gen_noise(std::span<float> s) const;
92 // Sources
93 bool set_pos(vec3 p);
95 source add_source(std::span<const std::byte> v);
98 std::size_t source_sample_pos(source s) const;
100 source s, std::size_t channels, std::size_t bit_depth,
101 std::span<const std::byte> v);
103 bool set_source_sample_pos(source s, std::size_t p);
105 bool set_source_gain(source s, float g);
106 bool play(source s) const;
107 bool stop(source s) const;
108private:
109 bool init_openal(void);
110 std::unique_ptr<void, void(*)(void*)> data = {nullptr, [](auto){}};
111 Math *math = nullptr;
112 std::size_t m_rate = 0;
113};
114
115}
116
117#endif
Audio manager.
Definition: audio.h:17
std::unique_ptr< void, void(*)(void *)> data
Definition: audio.h:110
void gen_square(std::span< float > s, float freq) const
Generates a square wave with amplitude 1 and frequency freq.
bool remove_source(source s)
vec3 source_pos(source s) const
static void fade(std::span< float > s, float g0, float g1)
Linearly fades from g0 to g1.
bool stop(source s) const
static constexpr float db(float x)
Multiplier to decibel conversion.
Definition: audio.h:22
bool play(source s) const
std::size_t m_rate
Definition: audio.h:112
void gen_wav_header(std::span< std::byte > dst, std::span< const std::byte > src) const
Generates WAV header for a buffer.
source add_source(void)
bool init_openal(void)
static void exp_fade(std::span< float > s, std::size_t ep, float g0, float g1, float exp)
Exponentially fades from g0 to g1.
bool set_source_sample_pos(source s, std::size_t p)
std::size_t n_sources(void) const
void gen_saw(std::span< float > s, float freq) const
Generates a saw-tooth wave with amplitude 1 and frequency freq.
bool set_source_loop(source s, bool l)
bool set_source_gain(source s, float g)
bool write_wav(FILE *f, std::span< const std::byte > s) const
Writes WAV data to a file.
std::vector< std::byte > gen_wav(std::span< const float > s) const
Generates a WAV file from floating-point data.
std::size_t rate(void) const
Definition: audio.h:58
void gen_sine(std::span< float > s, float freq) const
Generates a sine wave with amplitude 1 and frequency freq.
source
Definition: audio.h:19
bool set_pos(vec3 p)
static void gain(std::span< float > s, float g)
Applies the gain multiplier to each element.
static void env(std::span< float > s, std::size_t a, std::size_t d, float st, std::size_t r)
Attack/decay/sustain/release envelope.
std::size_t source_sample_pos(source s) const
static void mix(std::span< float > dst, std::span< const float > src)
Adds the samples from both buffers.
static void mix(std::span< float > dst, std::span< const float > src)
Adds the samples from both buffers.
Definition: gen.cpp:72
void gen_noise(std::span< float > s) const
Generates white (random) noise.
bool set_source_data(source s, std::size_t channels, std::size_t bit_depth, std::span< const std::byte > v)
void trem(std::span< float > s, float a, float freq, float mix) const
Applies a tremolo effect with amplitude a and frequency f.
static void normalize(std::span< i16 > dst, std::span< const float > src)
Generates 16-bit PCM data from floating-point data.
bool read_wav(std::string_view path, std::vector< std::byte > *v) const
Reads WAV data from a file.
void gen_sine_fm(std::span< float > s, float freq, float lfo_a, float lfo_freq, float lfo_d) const
Generates a sine wave with frequency modulation.
static void over(std::span< float > s, float m, float mix)
Applies an overdrive effect with input multiplier m.
source add_source(std::span< const std::byte > v)
bool set_source_pos(source s, vec3 p)
Math * math
Definition: audio.h:111
Definition: math.h:22
init
Definition: img_common.lua:34
r
Definition: gamma.lua:7
g
Definition: gamma.lua:7
l
Definition: light.lua:23
a
Definition: input.lua:31
m
Definition: input.lua:23
p
Definition: input.lua:29
function f()) end
v[1]
Definition: math.lua:19
std::chrono::seconds s
Definition: timing.cpp:6
#define NNGN_MOVE_ONLY(x)
Definition: utils.h:39
Definition: audio.cpp:7
Definition: debug.h:13