diff options
Diffstat (limited to 'servers')
| -rw-r--r-- | servers/audio/audio_stream.cpp | 32 | ||||
| -rw-r--r-- | servers/audio_server.h | 2 |
2 files changed, 24 insertions, 10 deletions
diff --git a/servers/audio/audio_stream.cpp b/servers/audio/audio_stream.cpp index 0c8a1810d2..f7622b8a4e 100644 --- a/servers/audio/audio_stream.cpp +++ b/servers/audio/audio_stream.cpp @@ -135,19 +135,31 @@ void AudioStreamPlaybackMicrophone::_mix_internal(AudioFrame *p_buffer, int p_fr AudioDriver::get_singleton()->lock(); Vector<int32_t> buf = AudioDriver::get_singleton()->get_audio_input_buffer(); + unsigned int audio_input_size = AudioDriver::get_singleton()->get_audio_input_size(); - for (int i = 0; i < p_frames; i++) { - - float l = (buf[input_ofs++] >> 16) / 32768.f; - if (input_ofs >= buf.size()) { - input_ofs = 0; - } - float r = (buf[input_ofs++] >> 16) / 32768.f; - if (input_ofs >= buf.size()) { - input_ofs = 0; + // p_frames is multipled by two since an AudioFrame is stereo + if ((p_frames * 2) > audio_input_size) { + for (int i = 0; i < p_frames; i++) { + p_buffer[i] = AudioFrame(0.0f, 0.0f); } + input_ofs = 0; + } else { + for (int i = 0; i < p_frames; i++) { + if (audio_input_size >= input_ofs) { + float l = (buf[input_ofs++] >> 16) / 32768.f; + if (input_ofs >= buf.size()) { + input_ofs = 0; + } + float r = (buf[input_ofs++] >> 16) / 32768.f; + if (input_ofs >= buf.size()) { + input_ofs = 0; + } - p_buffer[i] = AudioFrame(l, r); + p_buffer[i] = AudioFrame(l, r); + } else { + p_buffer[i] = AudioFrame(0.0f, 0.0f); + } + } } AudioDriver::get_singleton()->unlock(); diff --git a/servers/audio_server.h b/servers/audio_server.h index c199a337eb..a9ed66a2d5 100644 --- a/servers/audio_server.h +++ b/servers/audio_server.h @@ -55,6 +55,7 @@ class AudioDriver { protected: Vector<int32_t> audio_input_buffer; unsigned int audio_input_position; + unsigned int audio_input_size; void audio_server_process(int p_frames, int32_t *p_buffer, bool p_update_mix_time = true); void update_mix_time(int p_frames); @@ -109,6 +110,7 @@ public: Vector<int32_t> get_audio_input_buffer() { return audio_input_buffer; } unsigned int get_audio_input_position() { return audio_input_position; } + unsigned int get_audio_input_size() { return audio_input_size; } #ifdef DEBUG_ENABLED uint64_t get_profiling_time() const { return prof_time; } |