4#ifndef YAZE_APP_EMU_PLATFORM_WASM_WASM_AUDIO_H
5#define YAZE_APP_EMU_PLATFORM_WASM_WASM_AUDIO_H
37class WasmAudioBackend :
public IAudioBackend {
40 ~WasmAudioBackend()
override;
43 bool Initialize(
const AudioConfig& config)
override;
44 void Shutdown()
override;
48 void Pause()
override;
50 void Clear()
override;
53 bool QueueSamples(
const int16_t* samples,
int num_samples)
override;
54 bool QueueSamples(
const float* samples,
int num_samples)
override;
55 bool QueueSamplesNative(
const int16_t* samples,
int frames_per_channel,
56 int channels,
int native_rate)
override;
59 AudioStatus GetStatus()
const override;
60 bool IsInitialized()
const override;
61 AudioConfig GetConfig()
const override;
64 void SetVolume(
float volume)
override;
65 float GetVolume()
const override;
68 void SetAudioStreamResampling(
bool enable,
int native_rate,
69 int channels)
override;
70 bool SupportsAudioStream()
const override {
return true; }
73 std::string GetBackendName()
const override {
return "WebAudio"; }
76 void HandleUserInteraction();
79 bool IsContextSuspended()
const;
84 std::vector<float> samples;
90 void ProcessAudioQueue();
91 bool ConvertToFloat32(
const int16_t* input,
float* output,
int num_samples);
92 void ApplyVolumeToBuffer(
float* buffer,
int num_samples);
95 void* audio_context_ =
nullptr;
98 void* script_processor_ =
nullptr;
104 std::atomic<bool> initialized_{
false};
105 std::atomic<bool> playing_{
false};
106 std::atomic<bool> context_suspended_{
true};
107 std::atomic<float> volume_{1.0f};
110 std::mutex queue_mutex_;
111 std::queue<AudioBuffer> sample_queue_;
112 std::atomic<size_t> queued_samples_{0};
115 bool resampling_enabled_ =
false;
116 int native_rate_ = 32000;
117 int native_channels_ = 2;
120 std::vector<float> conversion_buffer_;
121 std::vector<float> resampling_buffer_;
124 mutable std::atomic<bool> has_underrun_{
false};
125 std::atomic<size_t> total_samples_played_{0};
128 static constexpr int kDefaultBufferSize = 2048;
129 static constexpr int kMaxQueuedBuffers = 16;
130 static constexpr float kInt16ToFloat = 1.0f / 32768.0f;