Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / zwindow.C
index a6f6d73f8119c29120291817e891178de5ac86cc..37dd6feb530e721e2116444ac2e42b1e1e1ff281 100644 (file)
@@ -32,6 +32,7 @@
 #include "renderengine.h"
 #include "timelinepane.h"
 #include "track.h"
+#include "tracks.h"
 #include "transportque.h"
 #include "zwindow.h"
 #include "zwindowgui.h"
@@ -45,14 +46,14 @@ Mixers::~Mixers()
        remove_all_objects();
 }
 
-Mixer *Mixers::new_mixer()
+Mixer *Mixers::new_mixer(int show)
 {
        int idx = 0;
        for( int i=0; i<size(); ++i ) {
                Mixer *mixer = get(i);
                if( idx < mixer->idx ) idx = mixer->idx;
        }
-       return append(new Mixer(idx+1));
+       return append(new Mixer(idx+1, show));
 }
 
 Mixer *Mixers::get_mixer(int idx)
@@ -64,10 +65,9 @@ Mixer *Mixers::get_mixer(int idx)
        return 0;
 }
 
-void Mixers::del_mixer(int idx)
+void Mixers::del_mixer(Mixer *mixer)
 {
-       Mixer *mixer = get_mixer(idx);
-       if( mixer ) remove_object(mixer);
+       remove_object(mixer);
 }
 
 void Mixer::set_title(const char *tp)
@@ -99,6 +99,7 @@ int Mixers::load(FileXML *file)
                if( file->tag.title_is("MIXER") ) {
                        Mixer *mixer = new_mixer();
                        file->tag.get_property("TITLE", mixer->title);
+                       mixer->show = file->tag.get_property("SHOW", 1);
                        mixer->x = file->tag.get_property("X", mixer->x);
                        mixer->y = file->tag.get_property("Y", mixer->y);
                        mixer->w = file->tag.get_property("W", mixer->w);
@@ -121,6 +122,7 @@ void Mixers::copy_from(Mixers &that)
 void Mixer::save(FileXML *file)
 {
        file->tag.set_title("MIXER");
+       file->tag.set_property("SHOW",show);
        file->tag.set_property("TITLE",title);
        file->tag.set_property("X",x);
        file->tag.set_property("Y",y);
@@ -141,9 +143,10 @@ void Mixer::save(FileXML *file)
        file->append_newline();
 }
 
-Mixer::Mixer(int idx)
+Mixer::Mixer(int idx, int show)
 {
        this->idx = idx;
+       this->show = show;
        title[0] = 0;
        x = y = 100 + idx*64;
        w = 400;  h = 300;
@@ -171,6 +174,7 @@ void Mixer::copy_from(Mixer &that)
        mixer_ids.remove_all();
        strncpy(title, that.title, sizeof(title));
        title[sizeof(title)-1] = 0;
+       show = that.show;
        x = that.x;  y = that.y;
        w = that.w;  h = that.h;
        for( int i=0; i<that.mixer_ids.size(); ++i )
@@ -185,9 +189,10 @@ ZWindow::ZWindow(MWindow *mwindow)
        idx = -1;
        edl = 0;
        highlighted = 0;
-       destroy = 1;
+       playable = 1;
        title[0] = 0;
        zgui = 0;
+       zoom = 0;
 }
 
 ZWindow::~ZWindow()
@@ -200,6 +205,7 @@ ZWindow::~ZWindow()
 BC_Window* ZWindow::new_gui()
 {
        Mixer *mixer = mwindow->edl->mixers.get_mixer(idx);
+       mixer->show = 1;
        zgui = new ZWindowGUI(mwindow, this, mixer);
        zgui->create_objects();
        return zgui;
@@ -207,8 +213,16 @@ BC_Window* ZWindow::new_gui()
 
 void ZWindow::handle_done_event(int result)
 {
-       if( destroy )
-               mwindow->del_mixer(this);
+       stop_playback(1);
+       if( result ) {
+               mwindow->close_mixer(this);
+               Mixer *mixer = mwindow->edl->mixers.get_mixer(idx);
+               if( mixer ) mixer->show = 0;
+               Track *track = mixer ? mwindow->edl->tracks->first : 0;
+               while( track && track->index_in(mixer) < 0 ) track = track->next;
+// if no refs to tracks, delete it
+               if( !track ) mwindow->edl->mixers.del_mixer(mixer);
+       }
        idx = -1;
 }
 void ZWindow::handle_close_event(int result)
@@ -219,8 +233,7 @@ void ZWindow::handle_close_event(int result)
 void ZWindow::change_source(EDL *edl)
 {
        if( this->edl == edl ) return;
-       if( !edl || !this->edl || this->edl->equivalent_output(edl) >= 0 )
-               zgui->playback_engine->refresh_frame(CHANGE_ALL, edl);
+       zgui->playback_engine->refresh_frame(CHANGE_ALL, edl);
        if( this->edl )
                this->edl->remove_user();
        this->edl = edl;
@@ -234,6 +247,7 @@ void ZWindow::stop_playback(int wait)
 void ZWindow::handle_mixer(int command, int wait_tracking,
                int use_inout, int toggle_audio, int loop_play, float speed)
 {
+       if( !playable ) return;
        PlaybackEngine *engine = zgui->playback_engine;
        engine->next_command->toggle_audio = toggle_audio;
        engine->next_command->loop_play = loop_play;
@@ -259,10 +273,20 @@ void ZWindow::update_mixer_ids()
 
 void ZWindow::set_title(const char *tp)
 {
+       Track *track = 0;
        Mixer *mixer = mwindow->edl->mixers.get_mixer(idx);
-       if( mixer ) mixer->set_title(tp);
+       if( mixer ) {
+               mixer->set_title(tp);
+               for( track=mwindow->edl->tracks->first; track; track=track->next ) {
+                       if( track->data_type != TRACK_VIDEO ) continue;
+                       int mixer_id = track->get_mixer_id();
+                       int k = mixer->mixer_ids.size();
+                       while( --k >= 0 && mixer_id != mixer->mixer_ids[k] );
+                       if( k >= 0 ) break;
+               }
+       }
        char *cp = title, *ep = cp + sizeof(title)-1;
-       cp += snprintf(title, ep-cp, _("Mixer %d"), idx);
+       cp += snprintf(title, ep-cp, track ? track->title : _("Mixer %d"), idx);
        if( tp ) cp += snprintf(cp, ep-cp, ": %s", tp);
        *cp = 0;
 }