From 0121f9bd0701b4bf47d313ad62fb8b3f0b23b3ee Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 15 Jun 2022 17:42:35 +0200 Subject: [PATCH 1/3] [audiofilter] fade --- .../common/ADM_audioFilter/src/CMakeLists.txt | 1 + .../ADM_audioFilter/src/audiofilter.cpp | 7 + .../ADM_audioFilter/src/audiofilter_fade.cpp | 183 ++++++++++++++++++ .../src/audiofilter_interface.cpp | 23 +++ .../common/ADM_commonUI/DIA_audioFilter.cpp | 20 +- .../common/ADM_editor/include/ADM_edit.hxx | 2 + avidemux/common/ADM_editor/include/IEditor.h | 2 + .../src/utils/ADM_edScriptGenerator.cpp | 5 + .../ADM_editor/src/utils/ADM_editIface.cpp | 21 ++ .../include/audiofilter_conf.h | 7 + .../include/audiofilter_fade.h | 45 +++++ .../ADM_coreScript/include/IScriptWriter.h | 1 + .../tinyPy/src/ADM_pyAvidemux.h | 2 + .../tinyPy/src/ADM_pyAvidemuxAudio.cpp | 22 +++ .../tinyPy/src/PythonScriptWriter.cpp | 4 + .../tinyPy/src/PythonScriptWriter.h | 1 + .../ADM_scriptEngines/tinyPy/src/adm_gen.cpp | 22 +++ .../tinyPy/src/binding/adm.admPyClass | 1 + 18 files changed, 368 insertions(+), 1 deletion(-) create mode 100644 avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp create mode 100644 avidemux_core/ADM_coreAudioFilter/include/audiofilter_fade.h diff --git a/avidemux/common/ADM_audioFilter/src/CMakeLists.txt b/avidemux/common/ADM_audioFilter/src/CMakeLists.txt index 532a30f20b..f98bb5d675 100644 --- a/avidemux/common/ADM_audioFilter/src/CMakeLists.txt +++ b/avidemux/common/ADM_audioFilter/src/CMakeLists.txt @@ -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 diff --git a/avidemux/common/ADM_audioFilter/src/audiofilter.cpp b/avidemux/common/ADM_audioFilter/src/audiofilter.cpp index cf50beb370..369afffaa1 100644 --- a/avidemux/common/ADM_audioFilter/src/audiofilter.cpp +++ b/avidemux/common/ADM_audioFilter/src/audiofilter.cpp @@ -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) @@ -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) { diff --git a/avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp b/avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp new file mode 100644 index 0000000000..da2e40ed13 --- /dev/null +++ b/avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp @@ -0,0 +1,183 @@ +/*************************************************************************** + \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 + + +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(!_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) nbSampleMax) available=nbSampleMax; + + ADM_assert(available); + + + float *in = _incomingBuffer.at(_head); + float * out = output; + + if ((_currentSampleCount >= fadeInSamples) && ((_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; + +} diff --git a/avidemux/common/ADM_audioFilter/src/audiofilter_interface.cpp b/avidemux/common/ADM_audioFilter/src/audiofilter_interface.cpp index fa73fd48ef..c86f3b8541 100644 --- a/avidemux/common/ADM_audioFilter/src/audiofilter_interface.cpp +++ b/avidemux/common/ADM_audioFilter/src/audiofilter_interface.cpp @@ -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 diff --git a/avidemux/common/ADM_commonUI/DIA_audioFilter.cpp b/avidemux/common/ADM_commonUI/DIA_audioFilter.cpp index 58f9b73ae6..684e112fd3 100644 --- a/avidemux/common/ADM_commonUI/DIA_audioFilter.cpp +++ b/avidemux/common/ADM_commonUI/DIA_audioFilter.cpp @@ -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)) @@ -178,6 +182,14 @@ int DIA_getAudioFilter(ADM_AUDIOFILTER_CONFIG *config, double tempoHint) diaElem *eqElems[]={&tEQ, &eEqLow, &eEqMid, &eEqHigh, &eEqCutLM, &eEqCutMH, ¬eEq}; 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); @@ -258,6 +270,7 @@ int DIA_getAudioFilter(ADM_AUDIOFILTER_CONFIG *config, double tempoHint) diaElemTabs *tabs[] = { &tabMain, &tabDRC, + &tabFade, &tabEq, &tabChanGains, &tabChanDelays, @@ -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; } diff --git a/avidemux/common/ADM_editor/include/ADM_edit.hxx b/avidemux/common/ADM_editor/include/ADM_edit.hxx index 5820e75684..cd29601f69 100644 --- a/avidemux/common/ADM_editor/include/ADM_edit.hxx +++ b/avidemux/common/ADM_editor/include/ADM_edit.hxx @@ -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); diff --git a/avidemux/common/ADM_editor/include/IEditor.h b/avidemux/common/ADM_editor/include/IEditor.h index 424f44e85d..4dc944c905 100644 --- a/avidemux/common/ADM_editor/include/IEditor.h +++ b/avidemux/common/ADM_editor/include/IEditor.h @@ -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; diff --git a/avidemux/common/ADM_editor/src/utils/ADM_edScriptGenerator.cpp b/avidemux/common/ADM_editor/src/utils/ADM_edScriptGenerator.cpp index a1aa8f0080..b40584d039 100644 --- a/avidemux/common/ADM_editor/src/utils/ADM_edScriptGenerator.cpp +++ b/avidemux/common/ADM_editor/src/utils/ADM_edScriptGenerator.cpp @@ -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]); diff --git a/avidemux/common/ADM_editor/src/utils/ADM_editIface.cpp b/avidemux/common/ADM_editor/src/utils/ADM_editIface.cpp index cbf8cf425a..ef1219dc76 100644 --- a/avidemux/common/ADM_editor/src/utils/ADM_editIface.cpp +++ b/avidemux/common/ADM_editor/src/utils/ADM_editIface.cpp @@ -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 diff --git a/avidemux_core/ADM_coreAudioFilter/include/audiofilter_conf.h b/avidemux_core/ADM_coreAudioFilter/include/audiofilter_conf.h index 0cdc29273b..efc42d10b6 100644 --- a/avidemux_core/ADM_coreAudioFilter/include/audiofilter_conf.h +++ b/avidemux_core/ADM_coreAudioFilter/include/audiofilter_conf.h @@ -24,6 +24,7 @@ #include "audiofilter_limiter.h" #include "audiofilter_channels.h" #include "audiofilter_eq.h" +#include "audiofilter_fade.h" /** \class ADM_AUDIOFILTER_CONFIG @@ -38,6 +39,7 @@ public : } bool reset() { + playBack = false; startTimeInUs=0; shiftInMs=0; mixerEnabled=false; @@ -53,12 +55,14 @@ public : drcEnabled=false; drcConf=drcConfDefault; AUDMAudioFilterEq::resetConf(&eqConf); + AUDMAudioFilterFade::resetConf(&fadeConf); AUDMAudioFilterChannels::resetConf(&chansConf); shiftEnabled=false; shiftInMs=0; return true; } + bool playBack; uint64_t startTimeInUs; // bool shiftEnabled; @@ -79,6 +83,7 @@ public : bool drcEnabled; DRCparam drcConf; EQparam eqConf; + FADEparam fadeConf; CHANSparam chansConf; public: // accessor @@ -86,6 +91,8 @@ public : bool audioFilterGetDrcConfig(bool * active, int * normalize, float * nFloor, float * attTime, float * decTime, float * ratio, float * thresDB); bool audioFilterSetEqConfig(bool active, float lo, float md, float hi, float lmcut, float mhcut); bool audioFilterGetEqConfig(bool * active, float * lo, float * md, float * hi, float * lmcut, float * mhcut); + bool audioFilterSetFadeConfig(float fadeIn, float fadeOut, bool videoFilterBridge); + bool audioFilterGetFadeConfig(float * fadeIn, float * fadeOut, bool * videoFilterBridge); bool audioFilterSetChannelGains(float fL, float fR, float fC, float sL, float sR, float rL, float rR, float rC, float LFE); bool audioFilterGetChannelGains(float * fL, float * fR, float * fC, float * sL, float * sR, float * rL, float * rR, float * rC, float * LFE); bool audioFilterSetChannelDelays(int fL, int fR, int fC, int sL, int sR, int rL, int rR, int rC, int LFE); diff --git a/avidemux_core/ADM_coreAudioFilter/include/audiofilter_fade.h b/avidemux_core/ADM_coreAudioFilter/include/audiofilter_fade.h new file mode 100644 index 0000000000..c381d876a4 --- /dev/null +++ b/avidemux_core/ADM_coreAudioFilter/include/audiofilter_fade.h @@ -0,0 +1,45 @@ +/*************************************************************************** + \file audiofilter_fade + \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. * + * * + ***************************************************************************/ + +#ifndef AUDM_AUDIO_FADE_H +#define AUDM_AUDIO_FADE_H + + +typedef struct +{ + float fadeIn; + float fadeOut; + bool videoFilterBridge; +} FADEparam; + +class AUDMAudioFilterFade : public AUDMAudioFilter +{ + protected: + bool bypass; + uint32_t _scanned; + int64_t _totalSampleCount; + int64_t _currentSampleCount; + int fadeInSamples, fadeOutSamples; + uint32_t channels; + uint8_t preprocess(void); + public: + static void resetConf(FADEparam * cfg); + ~AUDMAudioFilterFade(); + AUDMAudioFilterFade(AUDMAudioFilter *instream, FADEparam * cfg); + uint32_t fill(uint32_t max,float *output,AUD_Status *status); + uint8_t rewind(void); + +}; +#endif diff --git a/avidemux_core/ADM_coreScript/include/IScriptWriter.h b/avidemux_core/ADM_coreScript/include/IScriptWriter.h index 60c21c00f5..154079e708 100644 --- a/avidemux_core/ADM_coreScript/include/IScriptWriter.h +++ b/avidemux_core/ADM_coreScript/include/IScriptWriter.h @@ -39,6 +39,7 @@ class IScriptWriter virtual void stretchAudioCustom(int trackIndex, double tempo, double pitch) = 0; virtual void setAudioDrc(int trackIndex, bool active, int normalize, float nFloor, float attTime, float decTime, float ratio, float thresDB) = 0; virtual void setAudioEq(int trackIndex, bool active, float lo, float md, float hi, float lmcut, float mhcut) = 0; + virtual void setAudioFade(int trackIndex, float fadeIn, float fadeOut, bool videoFilterBridge) = 0; virtual void setAudioChannelGains(int trackIndex, float fL, float fR, float fC, float sL, float sR, float rL, float rR, float rC, float LFE) = 0; virtual void setAudioChannelDelays(int trackIndex, int fL, int fR, int fC, int sL, int sR, int rL, int rR, int rC, int LFE) = 0; virtual void setAudioChannelRemap(int trackIndex, bool active, int fL, int fR, int fC, int sL, int sR, int rL, int rR, int rC, int LFE) = 0; diff --git a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/ADM_pyAvidemux.h b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/ADM_pyAvidemux.h index 27da7625b2..e54bd950a2 100644 --- a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/ADM_pyAvidemux.h +++ b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/ADM_pyAvidemux.h @@ -36,6 +36,8 @@ int pyGetDrc2(IEditor *editor,int track, int * active, int * normalize, float * int pySetDrc2(IEditor *editor,int track, int active, int normalize, float nFloor, float attTime, float decTime, float ratio, float thresDB); int pyGetEq(IEditor *editor,int track, int * active, float * lo, float * md, float * hi, float * lmcut, float * mhcut); int pySetEq(IEditor *editor,int track, int active, float lo, float md, float hi, float lmcut, float mhcut); +int pyGetFade(IEditor *editor,int track, float * fadeIn, float * fadeOut, int * videoFilterBridge); +int pySetFade(IEditor *editor,int track, float fadeIn, float fadeOut, int videoFilterBridge); int pyGetChGains(IEditor *editor,int track, float * fL, float * fR, float * fC, float * sL, float * sR, float * rL, float * rR, float * rC, float * LFE); int pySetChGains(IEditor *editor,int track, float fL, float fR, float fC, float sL, float sR, float rL, float rR, float rC, float LFE); int pyGetChDelays(IEditor *editor,int track, int * fL, int * fR, int * fC, int * sL, int * sR, int * rL, int * rR, int * rC, int * LFE); diff --git a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/ADM_pyAvidemuxAudio.cpp b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/ADM_pyAvidemuxAudio.cpp index 69c69f170e..b6acaa27f4 100644 --- a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/ADM_pyAvidemuxAudio.cpp +++ b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/ADM_pyAvidemuxAudio.cpp @@ -396,6 +396,28 @@ int pySetEq(IEditor *editor,int track, int active, float lo, float md, float hi, return true; } +/** + \fn + \brief +*/ +int pyGetFade(IEditor *editor,int track, float * fadeIn, float * fadeOut, int * videoFilterBridge) +{ + bool bVFBrdige; + editor->getAudioFade(track, fadeIn, fadeOut, &bVFBrdige); + *videoFilterBridge = (bVFBrdige?1:0); + return true; +} + +/** + \fn + \brief +*/ +int pySetFade(IEditor *editor,int track, float fadeIn, float fadeOut, int videoFilterBridge) +{ + editor->setAudioFade(track, fadeIn, fadeOut, videoFilterBridge); + return true; +} + /** \fn \brief diff --git a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/PythonScriptWriter.cpp b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/PythonScriptWriter.cpp index 2d2b7d5d1c..a4f2a380cc 100644 --- a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/PythonScriptWriter.cpp +++ b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/PythonScriptWriter.cpp @@ -115,6 +115,10 @@ void PythonScriptWriter::setAudioEq(int trackIndex, bool active, float lo, float { *(this->_stream) << "adm.audioSetEq(" << trackIndex << ", " << active << ", " << lo << ", " << md << ", " << hi << ", " << lmcut << ", " << mhcut << ")" << std::endl; } +void PythonScriptWriter::setAudioFade(int trackIndex, float fadeIn, float fadeOut, bool videoFilterBridge) +{ + *(this->_stream) << "adm.audioSetFade(" << trackIndex << ", " << fadeIn << ", " << fadeOut << ", " << videoFilterBridge << ")" << std::endl; +} void PythonScriptWriter::setAudioChannelGains(int trackIndex, float fL, float fR, float fC, float sL, float sR, float rL, float rR, float rC, float LFE) { *(this->_stream) << "adm.audioSetChannelGains(" << trackIndex << ", " << fL << ", " << fR << ", " << fC << ", " << sL << ", " << sR << ", " << rL << ", " << rR << ", " << rC << ", " << LFE << ")" << std::endl; diff --git a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/PythonScriptWriter.h b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/PythonScriptWriter.h index 305958a771..001a4e8893 100644 --- a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/PythonScriptWriter.h +++ b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/PythonScriptWriter.h @@ -35,6 +35,7 @@ class PythonScriptWriter : public IScriptWriter void stretchAudioCustom(int trackIndex, double tempo, double pitch); void setAudioDrc(int trackIndex, bool active, int normalize, float nFloor, float attTime, float decTime, float ratio, float thresDB); void setAudioEq(int trackIndex, bool active, float lo, float md, float hi, float lmcut, float mhcut); + void setAudioFade(int trackIndex, float fadeIn, float fadeOut, bool videoFilterBridge); void setAudioChannelGains(int trackIndex, float fL, float fR, float fC, float sL, float sR, float rL, float rR, float rC, float LFE); void setAudioChannelDelays(int trackIndex, int fL, int fR, int fC, int sL, int sR, int rL, int rR, int rC, int LFE); void setAudioChannelRemap(int trackIndex, bool active, int fL, int fR, int fC, int sL, int sR, int rL, int rR, int rC, int LFE); diff --git a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/adm_gen.cpp b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/adm_gen.cpp index 2277a0435f..086b67f293 100644 --- a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/adm_gen.cpp +++ b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/adm_gen.cpp @@ -168,6 +168,23 @@ static tp_obj zzpy_audioSetEq(TP) int r = pySetEq(p0, p1, p2, p3, p4, p5, p6, p7); return tp_number(r); } +// audioSetEq -> int pySetFade(IEditor int float float int) +static tp_obj zzpy_audioSetFade(TP) +{ + tp_obj self = tp_getraw(tp); + IScriptEngine *engine = (IScriptEngine*)tp_get(tp, tp->builtins, tp_string("userdata")).data.val; + IEditor *editor = engine->editor(); + TinyParams pm(tp); + void *me = (void *)pm.asThis(&self, ADM_PYID_AVIDEMUX); + + IEditor *p0 = editor; + int p1 = pm.asInt(); + double p2 = pm.asDouble(); + double p3 = pm.asDouble(); + int p4 = pm.asInt(); + int r = pySetFade(p0, p1, p2, p3, p4); + return tp_number(r); +} // audioSetChannelGains -> int pySetChGains(IEditor int float float float float float float float float float) static tp_obj zzpy_audioSetChannelGains(TP) { @@ -861,6 +878,10 @@ tp_obj zzpy__pyAdm_get(tp_vm *vm) { return tp_method(vm, self, zzpy_audioSetEq); } + if (!strcmp(key, "audioSetFade")) + { + return tp_method(vm, self, zzpy_audioSetFade); + } if (!strcmp(key, "audioSetChannelGains")) { return tp_method(vm, self, zzpy_audioSetChannelGains); @@ -1087,6 +1108,7 @@ static tp_obj zzpy__pyAdm_help(TP) engine->callEventHandlers(IScriptEngine::Information, NULL, -1, "audioSetDrc(IEditor,int,int)\n"); engine->callEventHandlers(IScriptEngine::Information, NULL, -1, "audioSetDrc2(IEditor,int,int,int,float,float,float,float,float)\n"); engine->callEventHandlers(IScriptEngine::Information, NULL, -1, "audioSetEq(IEditor,int,int,float,float,float,float,float)\n"); + engine->callEventHandlers(IScriptEngine::Information, NULL, -1, "audioSetFade(IEditor,int,float,float,int)\n"); engine->callEventHandlers(IScriptEngine::Information, NULL, -1, "audioSetChannelGains(IEditor,int,float,float,float,float,float,float,float,float,float)\n"); engine->callEventHandlers(IScriptEngine::Information, NULL, -1, "audioSetChannelDelays(IEditor,int,int,int,int,int,int,int,int,int,int)\n"); engine->callEventHandlers(IScriptEngine::Information, NULL, -1, "audioSetChannelRemap(IEditor,int,int,int,int,int,int,int,int,int,int,int)\n"); diff --git a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/binding/adm.admPyClass b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/binding/adm.admPyClass index e37c1eefbb..57d5a9f94c 100644 --- a/avidemux_plugins/ADM_scriptEngines/tinyPy/src/binding/adm.admPyClass +++ b/avidemux_plugins/ADM_scriptEngines/tinyPy/src/binding/adm.admPyClass @@ -35,6 +35,7 @@ /* METHOD */ int pySetDrc:audioSetDrc(int,int) /* METHOD */ int pySetDrc:audioSetDrc2(int,int,int,float,float,float,float,float) /* METHOD */ int pySetEq:audioSetEq(int,int,float,float,float,float,float) +/* METHOD */ int pySetEq:audioSetFade(int,float,float,int) /* METHOD */ int pySetChGains:audioSetChannelGains(int,float,float,float,float,float,float,float,float,float) /* METHOD */ int pySetChDelays:audioSetChannelDelays(int,int,int,int,int,int,int,int,int,int) /* METHOD */ int pySetChRemap:audioSetChannelRemap(int,int,int,int,int,int,int,int,int,int,int) From a70fd24d40d9fe21a3bd7d8d1c563df7f12eb31c Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 15 Jun 2022 18:07:06 +0200 Subject: [PATCH 2/3] [audiofilter_fade] fix direct copy --- avidemux/common/ADM_audioFilter/src/audiofilter.cpp | 7 +++++-- avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/avidemux/common/ADM_audioFilter/src/audiofilter.cpp b/avidemux/common/ADM_audioFilter/src/audiofilter.cpp index 369afffaa1..5fcc1f20db 100644 --- a/avidemux/common/ADM_audioFilter/src/audiofilter.cpp +++ b/avidemux/common/ADM_audioFilter/src/audiofilter.cpp @@ -136,8 +136,11 @@ bool ADM_buildFilterChain(ADM_edAudioTrack *source,VectorOfAudioFilter *vec,ADM_ if (!config->playBack) { - AUDMAudioFilterFade *fade=new AUDMAudioFilterFade(last,&config->fadeConf); - ADD_FILTER(fade); + if ((config->fadeConf.fadeIn > 0) || (config->fadeConf.fadeOut > 0)) + { + AUDMAudioFilterFade *fade=new AUDMAudioFilterFade(last,&config->fadeConf); + ADD_FILTER(fade); + } } // Equalizer diff --git a/avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp b/avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp index da2e40ed13..edfa1ed3ea 100644 --- a/avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp +++ b/avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp @@ -139,7 +139,7 @@ uint32_t AUDMAudioFilterFade::fill(uint32_t max,float *output,AUD_Status *status float *in = _incomingBuffer.at(_head); float * out = output; - if ((_currentSampleCount >= fadeInSamples) && ((_totalSampleCount > 0) && ((_totalSampleCount - fadeOutSamples) > (_currentSampleCount + available)))) + if ( (_currentSampleCount >= fadeInSamples) && ((fadeOutSamples <= 0) || (_totalSampleCount <= 0) || ((fadeOutSamples > 0) && (_totalSampleCount > 0) && ((_totalSampleCount - fadeOutSamples) > (_currentSampleCount + available))) ) ) { memcpy(out, in, sizeof(float) * available * channels); } From a2734db60615f9d943b243daebeb603aefcc1bbd Mon Sep 17 00:00:00 2001 From: adam Date: Sun, 19 Jun 2022 19:49:47 +0200 Subject: [PATCH 3/3] [audiofilter_fade] improve encapsulation --- avidemux/common/ADM_audioFilter/src/audiofilter.cpp | 7 ++----- avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp | 5 +++++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/avidemux/common/ADM_audioFilter/src/audiofilter.cpp b/avidemux/common/ADM_audioFilter/src/audiofilter.cpp index 5fcc1f20db..369afffaa1 100644 --- a/avidemux/common/ADM_audioFilter/src/audiofilter.cpp +++ b/avidemux/common/ADM_audioFilter/src/audiofilter.cpp @@ -136,11 +136,8 @@ bool ADM_buildFilterChain(ADM_edAudioTrack *source,VectorOfAudioFilter *vec,ADM_ if (!config->playBack) { - if ((config->fadeConf.fadeIn > 0) || (config->fadeConf.fadeOut > 0)) - { - AUDMAudioFilterFade *fade=new AUDMAudioFilterFade(last,&config->fadeConf); - ADD_FILTER(fade); - } + AUDMAudioFilterFade *fade=new AUDMAudioFilterFade(last,&config->fadeConf); + ADD_FILTER(fade); } // Equalizer diff --git a/avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp b/avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp index edfa1ed3ea..150cb8dc74 100644 --- a/avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp +++ b/avidemux/common/ADM_audioFilter/src/audiofilter_fade.cpp @@ -98,6 +98,11 @@ uint32_t AUDMAudioFilterFade::fill(uint32_t max,float *output,AUD_Status *status return 0; } + if ((fadeInSamples <= 0) && (fadeOutSamples <= 0)) // nothing to do + { + return _previous->fill(max, output, status); + } + if(!_scanned) preprocess(); uint32_t rd = 0;