Fix possible crash with VideoPlayer _mix_audio function

(cherry picked from commit ea43218bca)
This commit is contained in:
Marcelo Fernandez 2018-11-02 13:33:20 -03:00 committed by Rémi Verschelde
parent 53f484fbba
commit c658929cf3
1 changed files with 22 additions and 39 deletions

View File

@ -89,49 +89,32 @@ void VideoPlayer::_mix_audio() {
AudioFrame vol = AudioFrame(volume, volume); AudioFrame vol = AudioFrame(volume, volume);
// Copy to server's audio buffer int cc = AudioServer::get_singleton()->get_channel_count();
switch (AudioServer::get_singleton()->get_speaker_mode()) {
case AudioServer::SPEAKER_MODE_STEREO: { if (cc == 1) {
AudioFrame *target = AudioServer::get_singleton()->thread_get_channel_mix_buffer(bus_index, 0); AudioFrame *target = AudioServer::get_singleton()->thread_get_channel_mix_buffer(bus_index, 0);
ERR_FAIL_COND(!target);
for (int j = 0; j < buffer_size; j++) { for (int j = 0; j < buffer_size; j++) {
target[j] += buffer[j] * vol; target[j] += buffer[j] * vol;
}
} else {
AudioFrame *targets[4];
for (int k = 0; k < cc; k++) {
targets[k] = AudioServer::get_singleton()->thread_get_channel_mix_buffer(bus_index, k);
ERR_FAIL_COND(!targets[k]);
}
for (int j = 0; j < buffer_size; j++) {
AudioFrame frame = buffer[j] * vol;
for (int k = 0; k < cc; k++) {
targets[k][j] += frame;
} }
}
} break;
case AudioServer::SPEAKER_SURROUND_51: {
AudioFrame *targets[2] = {
AudioServer::get_singleton()->thread_get_channel_mix_buffer(bus_index, 1),
AudioServer::get_singleton()->thread_get_channel_mix_buffer(bus_index, 2),
};
for (int j = 0; j < buffer_size; j++) {
AudioFrame frame = buffer[j] * vol;
targets[0][j] = frame;
targets[1][j] = frame;
}
} break;
case AudioServer::SPEAKER_SURROUND_71: {
AudioFrame *targets[3] = {
AudioServer::get_singleton()->thread_get_channel_mix_buffer(bus_index, 1),
AudioServer::get_singleton()->thread_get_channel_mix_buffer(bus_index, 2),
AudioServer::get_singleton()->thread_get_channel_mix_buffer(bus_index, 3)
};
for (int j = 0; j < buffer_size; j++) {
AudioFrame frame = buffer[j] * vol;
targets[0][j] += frame;
targets[1][j] += frame;
targets[2][j] += frame;
}
} break;
} }
} }