Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[audiofilter] fade #432

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions avidemux/common/ADM_audioFilter/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ audiofilter_encoder.cpp
audiofilter_interface.cpp
audiofilter_channels.cpp
audiofilter_eq.cpp
audiofilter_fade.cpp
audiocopy.cpp
ADM_audioResample.cpp
audiofilter.cpp
Expand Down
7 changes: 7 additions & 0 deletions avidemux/common/ADM_audioFilter/src/audiofilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ AUDMAudioFilter *createPlaybackFilter(uint64_t startTime,int32_t shift)
//
uint32_t downmix;
ADM_AUDIOFILTER_CONFIG playback;
playback.playBack = true;
playback.startTimeInUs=startTime;
playback.shiftInMs=shift;
if(shift)
Expand Down Expand Up @@ -133,6 +134,12 @@ bool ADM_buildFilterChain(ADM_edAudioTrack *source,VectorOfAudioFilter *vec,ADM_
AUDMAudioFilter_Bridge *nw=new AUDMAudioFilter_Bridge(source,(uint32_t)( config->startTimeInUs/1000),actualShift);
ADD_FILTER(nw);

if (!config->playBack)
{
AUDMAudioFilterFade *fade=new AUDMAudioFilterFade(last,&config->fadeConf);
ADD_FILTER(fade);
}

// Equalizer
if(config->eqConf.enable)
{
Expand Down
188 changes: 188 additions & 0 deletions avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
/***************************************************************************
\file audiofilter_fade.cpp
\brief Fade
(c) 2022 szlldm
***************************************************************************/


/***************************************************************************
* *
* 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 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "ADM_default.h"

#include "ADM_audioFilter.h"
#include "audiofilter_fade.h"
#include <math.h>


void AUDMAudioFilterFade::resetConf(FADEparam * cfg)
{
cfg->fadeIn = 0.0;
cfg->fadeOut = 0.0;
cfg->videoFilterBridge = false;
}

uint8_t AUDMAudioFilterFade::rewind(void)
{
_currentSampleCount = 0;
return AUDMAudioFilter::rewind();
}

AUDMAudioFilterFade::AUDMAudioFilterFade(AUDMAudioFilter *instream, FADEparam * cfg):AUDMAudioFilter (instream)
{
_previous->rewind(); // rewind

_scanned = 1;
_totalSampleCount = -1;
_currentSampleCount = 0;

fadeInSamples = cfg->fadeIn * _wavHeader.frequency;
fadeOutSamples = cfg->fadeOut * _wavHeader.frequency;
if (fadeOutSamples > 0)
{
_scanned = 0;
}

channels = _wavHeader.channels;
bypass = false;
};

AUDMAudioFilterFade::~AUDMAudioFilterFade()
{

};

uint8_t AUDMAudioFilterFade::preprocess(void)
{
_totalSampleCount = 0;
AUD_Status status;

_previous->rewind();
ADM_info("Seeking for sample count, that can take a while\n");
while (1)
{
int ready=_previous->fill(AUD_PROCESS_BUFFER_SIZE>>2,_incomingBuffer.at(0),&status);
if(!ready)
{
if(status==AUD_END_OF_STREAM)
{
break;
}
else
{
ADM_error("Unknown cause : %d\n",status);
ADM_assert(0);
}
}
ADM_assert(!(ready %_wavHeader.channels));

int sample= ready /_wavHeader.channels;
_totalSampleCount += sample;
}
_scanned = 1;
_previous->rewind();
return 1;
}

uint32_t AUDMAudioFilterFade::fill(uint32_t max,float *output,AUD_Status *status)
{
if(bypass)
{
*status=AUD_END_OF_STREAM; // not recoverable for now
return 0;
}

if ((fadeInSamples <= 0) && (fadeOutSamples <= 0)) // nothing to do
{
return _previous->fill(max, output, status);
}

if(!_scanned) preprocess();

uint32_t rd = 0;
int nbSampleMax=max/channels;
if(!nbSampleMax) nbSampleMax=1;

// Fill incoming buffer
shrink();
fillIncomingBuffer(status);
// Block not filled ?
if((_tail-_head)<channels)
{
if(*status==AUD_END_OF_STREAM && _head)
{
memset(_incomingBuffer.at(_head),0,sizeof(float) * channels);
_tail=_head+channels;
printf("[Fade] Warning asked %u symbols\n",max);
}
else
{
return 0;
}
}
// How many ?

// Let's go
int available=0;
if(!nbSampleMax)
{
printf("[Fade] Warning max %u, channels %u\n",max,channels);
}
available=(_tail-_head)/channels; // nb Sample
ADM_assert(available);
if(available > nbSampleMax) available=nbSampleMax;

ADM_assert(available);


float *in = _incomingBuffer.at(_head);
float * out = output;

if ( (_currentSampleCount >= fadeInSamples) && ((fadeOutSamples <= 0) || (_totalSampleCount <= 0) || ((fadeOutSamples > 0) && (_totalSampleCount > 0) && ((_totalSampleCount - fadeOutSamples) > (_currentSampleCount + available))) ) )
{
memcpy(out, in, sizeof(float) * available * channels);
}
else
{
memset(out, 0, sizeof(float) * available * channels);
for (int i = 0; i < available; i++) {
float fader = 1.0;
if ((fadeInSamples > 0) && ((_currentSampleCount + i) < fadeInSamples))
{
float f = (_currentSampleCount + i);
f /= fadeInSamples;
fader *= f;
}
if ((fadeOutSamples > 0) && (_totalSampleCount > 0))
{
if ((_currentSampleCount + i) >= (_totalSampleCount - fadeOutSamples))
{
float f = (_totalSampleCount - (_currentSampleCount + i));
f /= fadeOutSamples;
fader *= f;
}
}

fader *= fader; // better than linear, probably a log-like would be the best

for (int c = 0; c < channels; c++) {
out[c] = *in * fader;
in++;
}
out += channels;
}
}

_currentSampleCount += available;
rd = available*channels;

_head+=available*channels;
return rd;

}
23 changes: 23 additions & 0 deletions avidemux/common/ADM_audioFilter/src/audiofilter_interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,29 @@ bool ADM_AUDIOFILTER_CONFIG::audioFilterGetEqConfig(bool * active, float * lo, f
return true;
}

/**
\fn audioFilterSetFadeConfig
\brief
*/
bool ADM_AUDIOFILTER_CONFIG::audioFilterSetFadeConfig(float fadeIn, float fadeOut, bool videoFilterBridge)
{
fadeConf.fadeIn = fadeIn;
fadeConf.fadeOut = fadeOut;
fadeConf.videoFilterBridge = videoFilterBridge;
return true;
}

/**
\fn audioFilterGetFadeConfig
\brief
*/
bool ADM_AUDIOFILTER_CONFIG::audioFilterGetFadeConfig(float * fadeIn, float * fadeOut, bool * videoFilterBridge)
{
*fadeIn = fadeConf.fadeIn;
*fadeOut = fadeConf.fadeOut;
*videoFilterBridge = fadeConf.videoFilterBridge;
return true;
}

/**
\fn audioFilterSetChannelGains
Expand Down
20 changes: 19 additions & 1 deletion avidemux/common/ADM_commonUI/DIA_audioFilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ int DIA_getAudioFilter(ADM_AUDIOFILTER_CONFIG *config, double tempoHint)
ELEM_TYPE_FLOAT eqHighDB = config->eqConf.highDB;
ELEM_TYPE_FLOAT eqCutLM = config->eqConf.cutOffLM;
ELEM_TYPE_FLOAT eqCutMH = config->eqConf.cutOffMH;

bool vFadeVideoFilterBridge = config->fadeConf.videoFilterBridge;
ELEM_TYPE_FLOAT fadeIn = config->fadeConf.fadeIn;
ELEM_TYPE_FLOAT fadeOut = config->fadeConf.fadeOut;


#define PX(x) (&(config->x))
Expand Down Expand Up @@ -178,6 +182,14 @@ int DIA_getAudioFilter(ADM_AUDIOFILTER_CONFIG *config, double tempoHint)
diaElem *eqElems[]={&tEQ, &eEqLow, &eEqMid, &eEqHigh, &eEqCutLM, &eEqCutMH, &noteEq};
diaElemTabs tabEq(QT_TRANSLATE_NOOP("adm","Equalizer"),NB_ELEM(eqElems),eqElems);

//*** Fade tab ******
diaElemFloatResettable eFadeIn(&fadeIn,QT_TRANSLATE_NOOP("adm","Fade in (sec):"),0,1000,0,NULL,3);
diaElemFloatResettable eFadeOut(&fadeOut,QT_TRANSLATE_NOOP("adm","Fade out (sec):"),0,1000,0,NULL,3);
//diaElemToggle tFadeVideoFilterBridge(&vFadeVideoFilterBridge,QT_TRANSLATE_NOOP("adm","Enable Video Filter Audio fading"));

diaElem *fadeElems[]={&eFadeIn, &eFadeOut /*, &tFadeVideoFilterBridge*/};
diaElemTabs tabFade(QT_TRANSLATE_NOOP("adm","Fade"),NB_ELEM(fadeElems),fadeElems);

//*** Channel gains tab ******
diaElemFloat eChGainFLValue(chGainDB+ADM_CH_FRONT_LEFT,QT_TRANSLATE_NOOP("adm","Front left (dB):"),-30,+30);
diaElemFloat eChGainFRValue(chGainDB+ADM_CH_FRONT_RIGHT,QT_TRANSLATE_NOOP("adm","Front right (dB):"),-30,+30);
Expand Down Expand Up @@ -258,6 +270,7 @@ int DIA_getAudioFilter(ADM_AUDIOFILTER_CONFIG *config, double tempoHint)
diaElemTabs *tabs[] = {
&tabMain,
&tabDRC,
&tabFade,
&tabEq,
&tabChanGains,
&tabChanDelays,
Expand Down Expand Up @@ -304,7 +317,12 @@ int DIA_getAudioFilter(ADM_AUDIOFILTER_CONFIG *config, double tempoHint)
config->eqConf.midDB = eqMidDB;
config->eqConf.highDB = eqHighDB;
config->eqConf.cutOffLM = eqCutLM;
config->eqConf.cutOffMH = eqCutMH;
config->eqConf.cutOffMH = eqCutMH;

config->fadeConf.fadeIn = fadeIn;
config->fadeConf.fadeOut = fadeOut;
config->fadeConf.videoFilterBridge = vFadeVideoFilterBridge;

return true;
}

Expand Down
2 changes: 2 additions & 0 deletions avidemux/common/ADM_editor/include/ADM_edit.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,8 @@ public:
bool getAudioDrc(int track, bool * active, int * normalize, float * nFloor, float * attTime, float * decTime, float * ratio, float * thresDB);
bool setAudioEq(int track, bool active, float lo, float md, float hi, float lmcut, float mhcut);
bool getAudioEq(int track, bool * active, float * lo, float * md, float * hi, float * lmcut, float * mhcut);
bool setAudioFade(int track, float fadeIn, float fadeOut, bool videoFilterBridge);
bool getAudioFade(int track, float * fadeIn, float * fadeOut, bool * videoFilterBridge);
bool setAudioChannelGains(int dex, float fL, float fR, float fC, float sL, float sR, float rL, float rR, float rC, float LFE);
bool getAudioChannelGains(int dex, float * fL, float * fR, float * fC, float * sL, float * sR, float * rL, float * rR, float * rC, float * LFE);
bool setAudioChannelDelays(int dex, int fL, int fR, int fC, int sL, int sR, int rL, int rR, int rC, int LFE);
Expand Down
2 changes: 2 additions & 0 deletions avidemux/common/ADM_editor/include/IEditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ class IEditor {
virtual bool getAudioDrc(int track, bool * active, int * normalize, float * nFloor, float * attTime, float * decTime, float * ratio, float * thresDB) = 0;
virtual bool setAudioEq(int track, bool active, float lo, float md, float hi, float lmcut, float mhcut) = 0;
virtual bool getAudioEq(int track, bool * active, float * lo, float * md, float * hi, float * lmcut, float * mhcut) = 0;
virtual bool setAudioFade(int track, float fadeIn, float fadeOut, bool videoFilterBridge) = 0;
virtual bool getAudioFade(int track, float * fadeIn, float * fadeOut, bool * videoFilterBridge) = 0;
virtual bool setAudioChannelGains(int dex, float fL, float fR, float fC, float sL, float sR, float rL, float rR, float rC, float LFE) = 0;
virtual bool getAudioChannelGains(int dex, float * fL, float * fR, float * fC, float * sL, float * sR, float * rL, float * rR, float * rC, float * LFE) = 0;
virtual bool setAudioChannelDelays(int dex, int fL, int fR, int fC, int sL, int sR, int rL, int rR, int rC, int LFE) = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,11 @@ void ADM_ScriptGenerator::generateScript(std::iostream& stream,const GeneratorTy
track->audioEncodingConfig.audioFilterGetEqConfig(&eqActive, &eqLo, &eqMd, &eqHi, &eqLmcut, &eqMhcut);
this->_scriptWriter->setAudioEq(i, eqActive, eqLo, eqMd, eqHi, eqLmcut, eqMhcut);

float fadeIn, fadeOut;
bool fadeVideoFilterBridge;
track->audioEncodingConfig.audioFilterGetFadeConfig(&fadeIn, &fadeOut, &fadeVideoFilterBridge);
this->_scriptWriter->setAudioFade(i, fadeIn, fadeOut, fadeVideoFilterBridge);

float chf[9];
track->audioEncodingConfig.audioFilterGetChannelGains(chf+0, chf+1, chf+2, chf+3, chf+4, chf+5, chf+6, chf+7, chf+8);
this->_scriptWriter->setAudioChannelGains(i, chf[0], chf[1], chf[2], chf[3], chf[4], chf[5], chf[6], chf[7], chf[8]);
Expand Down
21 changes: 21 additions & 0 deletions avidemux/common/ADM_editor/src/utils/ADM_editIface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,27 @@ bool ADM_Composer::getAudioEq(int dex, bool * active, float * lo, float *
return ed->audioEncodingConfig.audioFilterGetEqConfig(active, lo, md, hi, lmcut, mhcut);
}

/**
\fn setAudioFade
*/

bool ADM_Composer::setAudioFade(int dex, float fadeIn, float fadeOut, bool videoFilterBridge)
{
EditableAudioTrack *ed=getEditableAudioTrackAt(dex);
if(!ed) return false;
return ed->audioEncodingConfig.audioFilterSetFadeConfig(fadeIn, fadeOut, videoFilterBridge);
}

/**
\fn getAudioFade
*/

bool ADM_Composer::getAudioFade(int dex, float * fadeIn, float * fadeOut, bool * videoFilterBridge)
{
EditableAudioTrack *ed=getEditableAudioTrackAt(dex);
if(!ed) return false;
return ed->audioEncodingConfig.audioFilterGetFadeConfig(fadeIn, fadeOut, videoFilterBridge);
}

/**
\fn setAudioChannelGains
Expand Down
Loading