diff options
Diffstat (limited to 'servers/audio/audio_stream.cpp')
| -rw-r--r-- | servers/audio/audio_stream.cpp | 32 |
1 files changed, 22 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(); |
