X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fcompressormulti%2Fcomprmulti.h;fp=cinelerra-5.1%2Fplugins%2Fcompressormulti%2Fcomprmulti.h;h=bc542670cc2904ad68696a037aa9ecd2f5136f43;hp=0000000000000000000000000000000000000000;hb=0e6cf5b52d1ebce9272270144bcf43df4683507e;hpb=f068b73c1d4afafbf6d86e7f5bc8f1c96b5366d3 diff --git a/cinelerra-5.1/plugins/compressormulti/comprmulti.h b/cinelerra-5.1/plugins/compressormulti/comprmulti.h new file mode 100644 index 00000000..bc542670 --- /dev/null +++ b/cinelerra-5.1/plugins/compressormulti/comprmulti.h @@ -0,0 +1,163 @@ + +/* + * CINELERRA + * Copyright (C) 2008-2019 Adam Williams + * + * 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. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef COMPRMULTI_H +#define COMPRMULTI_H + +#include "bchash.inc" +#include "compressortools.h" +#include "fourier.h" +#include "mutex.h" +#include "pluginaclient.h" +#include "samples.inc" +#include "vframe.inc" + +class ComprMultiEffect; +class ComprMultiFFT; + +//#define LOG_CROSSOVER +#define DRAW_AFTER_BANDPASS + +#define TOTAL_BANDS 3 + +class ComprMultiConfig : public CompressorConfigBase +{ +public: + ComprMultiConfig(); + + void copy_from(ComprMultiConfig &that); + int equivalent(ComprMultiConfig &that); + void interpolate(ComprMultiConfig &prev, ComprMultiConfig &next, + int64_t prev_frame, int64_t next_frame, int64_t current_frame); + double q; + int window_size; +}; + +class ComprMultiFFT :public CrossfadeFFT +{ +public: + ComprMultiFFT(ComprMultiEffect *plugin, int channel); + ~ComprMultiFFT(); + + int signal_process(int band); + int post_process(int band); + int read_samples(int64_t output_sample, int samples, Samples *buffer); + + ComprMultiEffect *plugin; + int channel; + CompressorFreqFrame *frame; +}; + +// processing state of a single band +class BandState +{ +public: + BandState(ComprMultiEffect *plugin, int band); + ~BandState(); + + void delete_dsp(); + void reset(); + void reconfigure(); +// calculate the envelope for only this band + void calculate_envelope(); + void process_readbehind(int size, + int reaction_samples, int decay_samples, int trigger); + void process_readahead(int size, int preview_samples, + int reaction_samples, int decay_samples, int trigger); + void allocate_filtered(int new_size); + +// bandpass filter for this band + double *envelope; + int envelope_allocated; +// The input for all channels with filtering by this band + Samples **filtered_buffer; +// ending input value of smoothed input + double next_target; +// starting input value of smoothed input + double previous_target; +// samples between previous and next target value for readahead + int target_samples; +// current sample from 0 to target_samples + int target_current_sample; +// current smoothed input value + double current_value; +// Temporaries for linear transfer + ArrayList levels; + ComprMultiEffect *plugin; + int band; + CompressorEngine *engine; +}; + +class ComprMultiEffect : public PluginAClient +{ +public: + ComprMultiEffect(PluginServer *server); + ~ComprMultiEffect(); + + int is_multichannel(); + int is_realtime(); + void read_data(KeyFrame *keyframe); + void save_data(KeyFrame *keyframe); + int process_buffer(int64_t size, Samples **buffer, + int64_t start_position, int sample_rate); + +// calculate envelopes of all the bands + void calculate_envelope(); + + void allocate_input(int new_size); + + void reset(); + void update_gui(); + void render_stop(); + void delete_dsp(); + void dump_frames(); + + PLUGIN_CLASS_MEMBERS(ComprMultiConfig) + +#ifndef DRAW_AFTER_BANDPASS +// The out of band data for each channel with readahead + Samples **input_buffer; +// Number of samples in the unfiltered input buffers + int64_t input_size; +// input buffer size being calculated by the FFT readers + int64_t new_input_size; +#endif // !DRAW_AFTER_BANDPASS +// Starting sample of the input buffer relative to project in the requested rate. + int64_t input_start; +// Number of samples in the filtered input buffers + int64_t filtered_size; + +// detect seeking + int64_t last_position; + +// count spectrogram frames for each band + int new_spectrogram_frames[TOTAL_BANDS]; + + BandState *band_states[TOTAL_BANDS]; +// The big FFT with multiple channels & multiple bands extracted per channel. + ComprMultiFFT **fft; + + int need_reconfigure; + double start_pos; + int dir; +}; + + +#endif