From 7926f3d33f9aba1dc28c8268b8ba8e7e5e53e5ac Mon Sep 17 00:00:00 2001 From: Jonathan Noble Date: Sun, 3 Mar 2019 14:14:51 +0000 Subject: [PATCH] Using library instead of rand() (cherry picked from commit c9c155d0a897299c7eb2387d68579cdd6ede82f1) --- effects/internal/audionoiseeffect.cpp | 124 +++++++++++++------------- effects/internal/shakeeffect.cpp | 81 +++++++++-------- project/effect.h | 10 +++ 3 files changed, 110 insertions(+), 105 deletions(-) diff --git a/effects/internal/audionoiseeffect.cpp b/effects/internal/audionoiseeffect.cpp index d43fd5545..26671f253 100644 --- a/effects/internal/audionoiseeffect.cpp +++ b/effects/internal/audionoiseeffect.cpp @@ -1,64 +1,60 @@ -/*** - - Olive - Non-Linear Video Editor - Copyright (C) 2019 Olive Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -***/ - -#include "audionoiseeffect.h" - -#include -#include - -AudioNoiseEffect::AudioNoiseEffect(Clip* c, const EffectMeta *em) : Effect(c, em) { - amount_val = add_row(tr("Amount"))->add_field(EFFECT_FIELD_DOUBLE, "amount"); - amount_val->set_double_minimum_value(0); - amount_val->set_double_maximum_value(100); - amount_val->set_double_default_value(20); - - mix_val = add_row(tr("Mix"))->add_field(EFFECT_FIELD_BOOL, "mix"); - mix_val->set_bool_value(true); - - srand(QDateTime::currentMSecsSinceEpoch()); -} - -void AudioNoiseEffect::process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int) { - double interval = (timecode_end - timecode_start)/nb_bytes; - for (int i=0;iget_double_value(timecode, true)*0.01 ); - left_noise_sample *= vol; - right_noise_sample *= vol; - - // mix with source audio - if (mix_val->get_bool_value(timecode, true)) { - qint16 left_sample = (qint16) (((samples[i+1] & 0xFF) << 8) | (samples[i] & 0xFF)); - qint16 right_sample = (qint16) (((samples[i+3] & 0xFF) << 8) | (samples[i+2] & 0xFF)); - left_noise_sample = mix_audio_sample(left_noise_sample, left_sample); - right_noise_sample = mix_audio_sample(right_noise_sample, right_sample); - } - - samples[i+3] = (quint8) (right_noise_sample >> 8); - samples[i+2] = (quint8) right_noise_sample; - samples[i+1] = (quint8) (left_noise_sample >> 8); - samples[i] = (quint8) left_noise_sample; - } -} +/* + * Olive. Olive is a free non-linear video editor for Windows, macOS, and Linux. + * Copyright (C) 2018 {{ organization }} + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + *along with this program. If not, see . + */ +#include "audionoiseeffect.h" + +#include +#include + +AudioNoiseEffect::AudioNoiseEffect(Clip* c, const EffectMeta *em) : Effect(c, em) { + amount_val = add_row(tr("Amount"))->add_field(EFFECT_FIELD_DOUBLE, "amount"); + amount_val->set_double_minimum_value(0); + amount_val->set_double_maximum_value(100); + amount_val->set_double_default_value(20); + + mix_val = add_row(tr("Mix"))->add_field(EFFECT_FIELD_BOOL, "mix"); + mix_val->set_bool_value(true); + +} + +void AudioNoiseEffect::process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int) { + double interval = (timecode_end - timecode_start)/nb_bytes; + for (int i=0;irandomNumber(); + qint16 right_noise_sample = this->randomNumber(); + + // set noise volume + double vol = log_volume( amount_val->get_double_value(timecode, true)*0.01 ); + left_noise_sample *= vol; + right_noise_sample *= vol; + + // mix with source audio + if (mix_val->get_bool_value(timecode, true)) { + qint16 left_sample = static_cast (((samples[i+1] & 0xFF) << 8) | (samples[i] & 0xFF)); + qint16 right_sample = static_cast (((samples[i+3] & 0xFF) << 8) | (samples[i+2] & 0xFF)); + left_noise_sample = mix_audio_sample(left_noise_sample, left_sample); + right_noise_sample = mix_audio_sample(right_noise_sample, right_sample); + } + + samples[i+3] = static_cast (right_noise_sample >> 8); + samples[i+2] = static_cast (right_noise_sample); + samples[i+1] = static_cast (left_noise_sample >> 8); + samples[i] = static_cast (left_noise_sample); + } +} diff --git a/effects/internal/shakeeffect.cpp b/effects/internal/shakeeffect.cpp index 89bb39ecb..a8d5f53f7 100644 --- a/effects/internal/shakeeffect.cpp +++ b/effects/internal/shakeeffect.cpp @@ -34,63 +34,62 @@ #include "debug.h" ShakeEffect::ShakeEffect(Clip* c, const EffectMeta *em) : Effect(c, em) { - enable_coords = true; + enable_coords = true; EffectRow* intensity_row = add_row(tr("Intensity")); - intensity_val = intensity_row->add_field(EFFECT_FIELD_DOUBLE, "intensity"); - intensity_val->set_double_minimum_value(0); + intensity_val = intensity_row->add_field(EFFECT_FIELD_DOUBLE, "intensity"); + intensity_val->set_double_minimum_value(0); EffectRow* rotation_row = add_row(tr("Rotation")); - rotation_val = rotation_row->add_field(EFFECT_FIELD_DOUBLE, "rotation"); - rotation_val->set_double_minimum_value(0); + rotation_val = rotation_row->add_field(EFFECT_FIELD_DOUBLE, "rotation"); + rotation_val->set_double_minimum_value(0); EffectRow* frequency_row = add_row(tr("Frequency")); - frequency_val = frequency_row->add_field(EFFECT_FIELD_DOUBLE, "frequency"); - frequency_val->set_double_minimum_value(0); + frequency_val = frequency_row->add_field(EFFECT_FIELD_DOUBLE, "frequency"); + frequency_val->set_double_minimum_value(0); - // set defaults - intensity_val->set_double_default_value(25); - rotation_val->set_double_default_value(10); - frequency_val->set_double_default_value(5); + // set defaults + intensity_val->set_double_default_value(25); + rotation_val->set_double_default_value(10); + frequency_val->set_double_default_value(5); - srand(QDateTime::currentMSecsSinceEpoch()); - - for (int i=0;i::max(); + for (int i=0;i(this->randomNumber()) / limit; + } } void ShakeEffect::process_coords(double timecode, GLTextureCoords& coords, int) { - int lim = RANDOM_VAL_SIZE/6; + int lim = RANDOM_VAL_SIZE/6; - double multiplier = intensity_val->get_double_value(timecode)/lim; - double rotmult = rotation_val->get_double_value(timecode)/lim/10; - double x = timecode * frequency_val->get_double_value(timecode); + double multiplier = intensity_val->get_double_value(timecode)/lim; + double rotmult = rotation_val->get_double_value(timecode)/lim/10; + double x = timecode * frequency_val->get_double_value(timecode); - double xoff = 0; - double yoff = 0; - double rotoff = 0; + double xoff = 0; + double yoff = 0; + double rotoff = 0; - for (int i=0;i #include #include +#include #include "ui/collapsiblewidget.h" #include "ui/checkboxex.h" @@ -227,6 +228,15 @@ public: void gizmo_world_to_screen(); bool are_gizmos_enabled(); + template + T randomNumber() + { + static std::random_device device; + static std::mt19937 generator(device()); + static std::uniform_int_distribution<> distribution(std::numeric_limits::min(), std::numeric_limits::max()); + return distribution(generator); + } + static EffectPtr Create(Clip *c, const EffectMeta *em); static const EffectMeta* GetInternalMeta(int internal_id, int type); public slots: