Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/platform/web/audio_driver_web.h
10277 views
1
/**************************************************************************/
2
/* audio_driver_web.h */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#pragma once
32
33
#include "godot_audio.h"
34
#include "godot_js.h"
35
36
#include "core/os/mutex.h"
37
#include "core/os/thread.h"
38
#include "servers/audio_server.h"
39
40
class AudioDriverWeb : public AudioDriver {
41
private:
42
struct AudioContext {
43
bool inited = false;
44
float output_latency = 0.0;
45
int state = -1;
46
int channel_count = 0;
47
int mix_rate = 0;
48
};
49
static AudioContext audio_context;
50
51
float *output_rb = nullptr;
52
float *input_rb = nullptr;
53
54
int buffer_length = 0;
55
int mix_rate = 0;
56
int channel_count = 0;
57
58
WASM_EXPORT static void _state_change_callback(int p_state);
59
WASM_EXPORT static void _latency_update_callback(float p_latency);
60
WASM_EXPORT static void _sample_playback_finished_callback(const char *p_playback_object_id);
61
62
static AudioDriverWeb *singleton;
63
64
protected:
65
void _audio_driver_process(int p_from = 0, int p_samples = 0);
66
void _audio_driver_capture(int p_from = 0, int p_samples = 0);
67
float *get_output_rb() const { return output_rb; }
68
float *get_input_rb() const { return input_rb; }
69
70
virtual Error create(int &p_buffer_samples, int p_channels) = 0;
71
virtual void start(float *p_out_buf, int p_out_buf_size, float *p_in_buf, int p_in_buf_size) = 0;
72
virtual void finish_driver() {}
73
74
public:
75
static bool is_available();
76
77
virtual Error init() final;
78
virtual void start() final;
79
virtual void finish() final;
80
81
virtual int get_mix_rate() const override;
82
virtual SpeakerMode get_speaker_mode() const override;
83
virtual float get_latency() override;
84
85
virtual Error input_start() override;
86
virtual Error input_stop() override;
87
88
static void resume();
89
90
// Samples.
91
virtual bool is_stream_registered_as_sample(const Ref<AudioStream> &p_stream) const override;
92
virtual void register_sample(const Ref<AudioSample> &p_sample) override;
93
virtual void unregister_sample(const Ref<AudioSample> &p_sample) override;
94
virtual void start_sample_playback(const Ref<AudioSamplePlayback> &p_playback) override;
95
virtual void stop_sample_playback(const Ref<AudioSamplePlayback> &p_playback) override;
96
virtual void set_sample_playback_pause(const Ref<AudioSamplePlayback> &p_playback, bool p_paused) override;
97
virtual bool is_sample_playback_active(const Ref<AudioSamplePlayback> &p_playback) override;
98
virtual double get_sample_playback_position(const Ref<AudioSamplePlayback> &p_playback) override;
99
virtual void update_sample_playback_pitch_scale(const Ref<AudioSamplePlayback> &p_playback, float p_pitch_scale = 0.0f) override;
100
virtual void set_sample_playback_bus_volumes_linear(const Ref<AudioSamplePlayback> &p_playback, const HashMap<StringName, Vector<AudioFrame>> &p_bus_volumes) override;
101
102
virtual void set_sample_bus_count(int p_count) override;
103
virtual void remove_sample_bus(int p_index) override;
104
virtual void add_sample_bus(int p_at_pos = -1) override;
105
virtual void move_sample_bus(int p_bus, int p_to_pos) override;
106
virtual void set_sample_bus_send(int p_bus, const StringName &p_send) override;
107
virtual void set_sample_bus_volume_db(int p_bus, float p_volume_db) override;
108
virtual void set_sample_bus_solo(int p_bus, bool p_enable) override;
109
virtual void set_sample_bus_mute(int p_bus, bool p_enable) override;
110
111
AudioDriverWeb() {}
112
};
113
114
#ifdef THREADS_ENABLED
115
class AudioDriverWorklet : public AudioDriverWeb {
116
private:
117
enum {
118
STATE_LOCK,
119
STATE_PROCESS,
120
STATE_SAMPLES_IN,
121
STATE_SAMPLES_OUT,
122
STATE_MAX,
123
};
124
Mutex mutex;
125
Thread thread;
126
bool quit = false;
127
int32_t state[STATE_MAX] = { 0 };
128
129
static void _audio_thread_func(void *p_data);
130
131
protected:
132
virtual Error create(int &p_buffer_size, int p_output_channels) override;
133
virtual void start(float *p_out_buf, int p_out_buf_size, float *p_in_buf, int p_in_buf_size) override;
134
virtual void finish_driver() override;
135
136
public:
137
virtual const char *get_name() const override {
138
return "AudioWorklet";
139
}
140
141
virtual void lock() override;
142
virtual void unlock() override;
143
};
144
145
#else
146
147
class AudioDriverWorklet : public AudioDriverWeb {
148
private:
149
static void _process_callback(int p_pos, int p_samples);
150
static void _capture_callback(int p_pos, int p_samples);
151
152
static AudioDriverWorklet *singleton;
153
154
protected:
155
virtual Error create(int &p_buffer_size, int p_output_channels) override;
156
virtual void start(float *p_out_buf, int p_out_buf_size, float *p_in_buf, int p_in_buf_size) override;
157
158
public:
159
virtual const char *get_name() const override {
160
return "AudioWorklet";
161
}
162
163
virtual void lock() override {}
164
virtual void unlock() override {}
165
166
static AudioDriverWorklet *get_singleton() { return singleton; }
167
168
AudioDriverWorklet() { singleton = this; }
169
};
170
171
#endif // THREADS_ENABLED
172
173
class AudioDriverScriptProcessor : public AudioDriverWeb {
174
private:
175
static void _process_callback();
176
177
static AudioDriverScriptProcessor *singleton;
178
179
protected:
180
virtual Error create(int &p_buffer_size, int p_output_channels) override;
181
virtual void start(float *p_out_buf, int p_out_buf_size, float *p_in_buf, int p_in_buf_size) override;
182
183
public:
184
virtual const char *get_name() const override { return "ScriptProcessor"; }
185
186
virtual void lock() override {}
187
virtual void unlock() override {}
188
189
static AudioDriverScriptProcessor *get_singleton() { return singleton; }
190
191
AudioDriverScriptProcessor() { singleton = this; }
192
};
193
194