X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmixersalign.h;fp=cinelerra-5.1%2Fcinelerra%2Fmixersalign.h;h=86abbe6e8e76f3138d04dc67b05b62c12803addb;hp=0000000000000000000000000000000000000000;hb=4a6b59824b2db18e6cc49b43a971923d5e5903ae;hpb=a0d43979126b586d50b2de48056ae48fa8d0bb1d diff --git a/cinelerra-5.1/cinelerra/mixersalign.h b/cinelerra-5.1/cinelerra/mixersalign.h new file mode 100644 index 00000000..86abbe6e --- /dev/null +++ b/cinelerra-5.1/cinelerra/mixersalign.h @@ -0,0 +1,348 @@ +/* + * CINELERRA + * Copyright (C) 2008-2015 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 __MIXERSALIGN_H__ +#define __MIXERSALIGN_H__ + +#include "edl.inc" +#include "fourier.h" +#include "guicast.h" +#include "language.h" +#include "loadbalance.h" +#include "mainprogress.inc" +#include "mixersalign.inc" +#include "mwindow.inc" +#include "renderengine.h" +#include "samples.inc" +#include "track.inc" +#include "zwindow.inc" + +class MixersAlignMixer +{ +public: + MixersAlignMixer(Mixer *mix); + Mixer *mixer; + double nudge; + double mx; + int64_t mi; + int aidx; +}; + +class MixersAlignMixers : public ArrayList +{ +public: + MixersAlignMixers() {} + ~MixersAlignMixers() { remove_all_objects(); } +}; + +class MixersAlignMixerList : public BC_ListBox +{ + enum { MIX_MIXER, MIX_NUDGE, MIX_SZ }; + static const char *mix_titles[MIX_SZ]; + static int mix_widths[MIX_SZ]; +public: + MixersAlignMixerList(MixersAlignWindow *gui, + MixersAlign *dialog, int x, int y, int w, int h); + ~MixersAlignMixerList(); + + void clear(); + + void add_mixer(MixersAlignMixer *mixer); + void load_list(); + void update(); + int selection_changed(); + + MixersAlignWindow *gui; + MixersAlign *dialog; + MixersAlignMixers mixers; + + const char *col_titles[MIX_SZ]; + int col_widths[MIX_SZ]; + ArrayList cols[MIX_SZ]; + + void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); } + void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); } + bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; } +}; + + +class MixersAlignMTrack +{ +public: + MixersAlignMTrack(Track *trk, int no); + + Track *track; + int no; +}; + +class MixersAlignMTracks : public ArrayList +{ +public: + MixersAlignMTracks() {} + ~MixersAlignMTracks() { remove_all_objects(); } +}; + + +class MixersAlignMTrackList : public BC_ListBox +{ + enum { MTK_NO, MTK_MIXER, MTK_TRACK, MTK_SZ }; + static const char *mtk_titles[MTK_SZ]; + static int mtk_widths[MTK_SZ]; +public: + MixersAlignMTrackList(MixersAlignWindow *gui, + MixersAlign *dialog, int x, int y, int w, int h); + ~MixersAlignMTrackList(); + + void clear(); + void add_mtrack(MixersAlignMTrack *mtrk); + void load_list(); + void update(); + + MixersAlignWindow *gui; + MixersAlign *dialog; + + ArrayList cols[MTK_SZ]; + const char *col_titles[MTK_SZ]; + int col_widths[MTK_SZ]; + + void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); } + void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); } + bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; } +}; + + +class MixersAlignATrack +{ +public: + MixersAlignATrack(Track *trk, int no); + Track *track; + int no; + double nudge; + double mx; + int64_t mi; +}; + +class MixersAlignATracks : public ArrayList +{ +public: + MixersAlignATracks() {} + ~MixersAlignATracks() { remove_all_objects(); } +}; + +class MixersAlignATrackList : public BC_ListBox +{ + enum { ATK_TRACK, ATK_AUDIO, ATK_NUDGE, ATK_MX, ATK_MI, ATK_SZ }; + static const char *atk_titles[ATK_SZ]; + static int atk_widths[ATK_SZ]; +public: + MixersAlignATrackList(MixersAlignWindow *gui, + MixersAlign *dialog, int x, int y, int w, int h); + ~MixersAlignATrackList(); + + void clear(); + void add_atrack(MixersAlignATrack *track); + void load_list(); + void update(); + int selection_changed(); + + MixersAlignWindow *gui; + MixersAlign *dialog; + + ArrayList cols[ATK_SZ]; + const char *col_titles[ATK_SZ]; + int col_widths[ATK_SZ]; + + void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); } + void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); } + bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; } +}; + +class MixersAlignReset : public BC_GenericButton +{ +public: + MixersAlignReset(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y); + int handle_event(); + static int calculate_width(BC_WindowBase *gui); + + MixersAlign *dialog; + MixersAlignWindow *gui; +}; + +class MixersAlignThread : public Thread +{ +public: + MixersAlignThread(MixersAlign *dialog); + ~MixersAlignThread(); + void run(); + + MixersAlign *dialog; +}; + +class MixersAlignMatch : public BC_GenericButton +{ +public: + MixersAlignMatch(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y); + int handle_event(); + + MixersAlign *dialog; + MixersAlignWindow *gui; +}; + +class MixersAlignApply : public BC_GenericButton +{ +public: + MixersAlignApply(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y); + int handle_event(); + static int calculate_width(BC_WindowBase *gui); + + MixersAlign *dialog; + MixersAlignWindow *gui; +}; + +class MixersAlignUndo : public BC_GenericButton +{ +public: + MixersAlignUndo(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y); + int handle_event(); + + MixersAlign *dialog; + MixersAlignWindow *gui; +}; + + +class MixersAlignWindow : public BC_Window +{ +public: + MixersAlignWindow(MixersAlign *dialog, int x, int y); + ~MixersAlignWindow(); + + void create_objects(); + int resize_event(int w, int h); + void load_lists(); + void default_selection(); + void update_gui(); + + MixersAlign *dialog; + BC_Title *mixer_title, *mtrack_title, *atrack_title; + + MixersAlignMixerList *mixer_list; + MixersAlignMTrackList *mtrack_list; + MixersAlignATrackList *atrack_list; + MixersAlignMatch *match; + MixersAlignReset *reset; + MixersAlignApply *apply; + MixersAlignUndo *undo; +}; + + +class MixersAlignARender : public RenderEngine +{ +public: + MixersAlignARender(MWindow *mwindow, EDL *edl); + ~MixersAlignARender(); + + int render(Samples **samples, int64_t len, int64_t pos); +}; + +class MixersAlignPackage : public LoadPackage +{ +public: + MixersAlignPackage(); + ~MixersAlignPackage(); + + MixersAlignMixer *mixer; +}; + +class MixersAlignClient : public LoadClient +{ +public: + MixersAlignClient(MixersAlignFarm *farm); + ~MixersAlignClient(); + + void process_package(LoadPackage *pkg); +}; + +class MixersAlignFarm : public LoadServer +{ +public: + MixersAlignFarm(MixersAlign *dialog, int n); + ~MixersAlignFarm(); + void init_packages(); + LoadClient *new_client(); + LoadPackage *new_package(); + + MixersAlign *dialog; +}; + +class MixersAlign : public BC_DialogThread, public FFT +{ +public: + MixersAlign(MWindow *mwindow); + ~MixersAlign(); + + void start_dialog(int wx, int wy); + BC_Window *new_gui(); + void load_mixers(); + void load_mtracks(); + void load_atracks(); + void handle_done_event(int result); + void handle_close_event(int result); + + int mixer_of(Track *track, int &midx); + int mixer_of(Track *track) { int midx = -1; return mixer_of(track, midx); } + int mmixer_of(int mi) { + return mi>=0 && mitrack) : -1; + } + int amixer_of(int ai) { + return ai>=0 && aitrack) : -1; + } + + EDL *mixer_audio_clip(Mixer *mixer); + EDL *mixer_master_clip(Track *track); + int64_t mixer_tracks_total(); + void load_master_audio(Track *track); + void scan_mixer_audio(); + void update_progress(int64_t len); + void update_match(); + void update(); + void process_package(MixersAlignFarm *farm, MixersAlignPackage *package); + void apply(); + + MixersAlignWindow *ma_gui; + int wx, wy; + MixersAlignMixers mixers; + MixersAlignMTracks mtracks; + MixersAlignATracks atracks; + MWindow *mwindow; + + EDL *undo_edl; + Mutex *farming; + MainProgressBar *progress; + MixersAlignThread *thread; + Mutex *total_lock; + int64_t total_rendered; + int failed; + int64_t master_len; + double *master_r, *master_i; + double master_start, master_end, master_ss; + double audio_start, audio_end; +}; + +#endif