fixed audio effects sometimes being applied more than once

This commit is contained in:
itsmattkc
2018-06-20 02:40:45 -07:00
parent 37b5ee35c4
commit 6c0bf62f51
6 changed files with 47 additions and 33 deletions
+18 -16
View File
@@ -47,22 +47,24 @@ void PanEffect::save(QXmlStreamWriter *stream) {
}
void PanEffect::process_audio(quint8 *samples, int nb_bytes) {
for (int i=0;i<nb_bytes;i+=4) {
qint16 left_sample = (qint16) ((samples[i+1] << 8) | samples[i]);
qint16 right_sample = (qint16) ((samples[i+3] << 8) | samples[i+2]);
if (pan_val->value() != 0) {
for (int i=0;i<nb_bytes;i+=4) {
qint16 left_sample = (qint16) ((samples[i+1] << 8) | samples[i]);
qint16 right_sample = (qint16) ((samples[i+3] << 8) | samples[i+2]);
float val = pan_val->value()*0.01;
if (val < 0) {
// affect right channel
right_sample *= (1-std::abs(val));
} else {
// affect left channel
left_sample *= (1-val);
}
float val = pan_val->value()*0.01f;
if (val < 0) {
// affect right channel
right_sample *= (1-std::abs(val));
} else {
// affect left channel
left_sample *= (1-val);
}
samples[i+3] = (quint8) (right_sample >> 8);
samples[i+2] = (quint8) right_sample;
samples[i+1] = (quint8) (left_sample >> 8);
samples[i] = (quint8) left_sample;
}
samples[i+3] = (quint8) (right_sample >> 8);
samples[i+2] = (quint8) right_sample;
samples[i+1] = (quint8) (left_sample >> 8);
samples[i] = (quint8) left_sample;
}
}
}
+12 -11
View File
@@ -3,6 +3,7 @@
#include <QGridLayout>
#include <QSpinBox>
#include <QLabel>
#include <QDebug>
#include "ui/collapsiblewidget.h"
@@ -31,7 +32,7 @@ Effect* VolumeEffect::copy(Clip* c) {
return v;
}
void VolumeEffect::load(QXmlStreamReader *stream) {
void VolumeEffect::load(QXmlStreamReader* stream) {
while (!(stream->isEndElement() && stream->name() == "effect") && !stream->atEnd()) {
stream->readNext();
if (stream->isStartElement() && stream->name() == "volume") {
@@ -41,17 +42,17 @@ void VolumeEffect::load(QXmlStreamReader *stream) {
}
}
void VolumeEffect::save(QXmlStreamWriter *stream) {
void VolumeEffect::save(QXmlStreamWriter* stream) {
stream->writeTextElement("volume", QString::number(volume_val->value()));
}
void VolumeEffect::process_audio(quint8 *samples, int nb_bytes) {
for (int i=0;i<nb_bytes;i+=2) {
qint16 full_sample = (qint16) ((samples[i+1] << 8) | samples[i]);
full_sample *= volume_val->value()*0.01;
samples[i+1] = (quint8) (full_sample >> 8);
samples[i] = (quint8) full_sample;
}
void VolumeEffect::process_audio(quint8* samples, int nb_bytes) {
if (volume_val->value() != 0) {
for (int i=0;i<nb_bytes;i+=2) {
qint16 samp = (qint16) ((samples[i+1] << 8) | samples[i]);
samp *= (volume_val->value()*0.01f);
samples[i+1] = (quint8) (samp >> 8);
samples[i] = (quint8) samp;
}
}
}
+7 -5
View File
@@ -32,6 +32,13 @@ void cache_audio_worker(Clip* c) {
// but there still may be samples in swresample
swr_convert_frame(c->swr_ctx, frame, NULL);
}
// perform all audio effects
int nb_bytes = av_samples_get_buffer_size(NULL, frame->channels, frame->nb_samples, static_cast<AVSampleFormat>(frame->format), 1);
for (int j=0;j<c->effects.size();j++) {
Effect* e = c->effects.at(j);
if (e->is_enabled()) e->process_audio(frame->data[0], nb_bytes);
}
}
if (frame->nb_samples == 0) {
@@ -39,11 +46,6 @@ void cache_audio_worker(Clip* c) {
} else {
int nb_bytes = av_samples_get_buffer_size(NULL, frame->channels, frame->nb_samples, static_cast<AVSampleFormat>(frame->format), 1);
// perform all audio effects
for (int j=0;j<c->effects.size();j++) {
c->effects.at(j)->process_audio(frame->data[0], nb_bytes);
}
if (c->audio_buffer_write == 0) c->audio_buffer_write = (((int)(audio_ibuffer_read/2))*2) + 1024;
int half_buffer = (audio_ibuffer_size/2);
while (c->frame_sample_index < nb_bytes) {
+6
View File
@@ -6,6 +6,8 @@
#include "ui/collapsiblewidget.h"
#include "effects/effects.h"
#include <QCheckBox>
Effect::Effect(Clip* c) : parent_clip(c)
{
name = "<unnamed effect>";
@@ -28,6 +30,10 @@ void Effect::field_changed() {
panel_viewer->viewer_widget->update();
}
bool Effect::is_enabled() {
return container->enabled_check->isChecked();
}
Effect* Effect::copy(Clip*) {return NULL;}
void Effect::load(QXmlStreamReader*) {}
void Effect::save(QXmlStreamWriter*) {}
+2
View File
@@ -24,6 +24,8 @@ public:
QWidget* ui;
Clip* parent_clip;
bool is_enabled();
virtual Effect* copy(Clip* c);
virtual void load(QXmlStreamReader* stream);
virtual void save(QXmlStreamWriter* stream);
+2 -1
View File
@@ -16,9 +16,10 @@ public:
CollapsibleWidget(QWidget* parent = 0);
void setContents(QWidget* c);
void setText(const QString &);
QCheckBox* enabled_check;
private:
QLabel* header;
QCheckBox* enabled_check;
QHBoxLayout* title_bar;
QVBoxLayout* layout;
QPushButton* collapse_button;