fixed audio effects sometimes being applied more than once
This commit is contained in:
+18
-16
@@ -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
@@ -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
@@ -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,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*) {}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user