X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=gtk2_ardour%2Feditor_timefx.cc;h=2528c823b7996ac9f75346ece542476c47378f87;hb=e36f74e071d4c14862d23da5ff0d49df0940d536;hp=d4d02ea1c4acf6ba44d601815e5a4e84e5591dc8;hpb=33c61757fc8352fdb1280bca28b54d1adee183ff;p=ardour.git diff --git a/gtk2_ardour/editor_timefx.cc b/gtk2_ardour/editor_timefx.cc index d4d02ea1c4..2528c823b7 100644 --- a/gtk2_ardour/editor_timefx.cc +++ b/gtk2_ardour/editor_timefx.cc @@ -37,17 +37,15 @@ #include "region_selection.h" #include "time_fx_dialog.h" -#include "ardour/session.h" -#include "ardour/region.h" -#include "ardour/audioplaylist.h" -#include "ardour/audio_track.h" #include "ardour/audioregion.h" -#include "ardour/stretch.h" #include "ardour/midi_stretch.h" #include "ardour/pitch.h" +#include "ardour/region.h" +#include "ardour/session.h" +#include "ardour/stretch.h" #ifdef USE_RUBBERBAND -#include "rubberband/RubberBandStretcher.h" +#include using namespace RubberBand; #endif @@ -146,9 +144,21 @@ int Editor::time_fx (RegionList& regions, float val, bool pitching) { delete current_timefx; - current_timefx = new TimeFXDialog (*this, pitching); + current_timefx->regions = regions; + /* See if we have any audio regions on our list */ + RegionList::iterator i = regions.begin (); + while (i != regions.end() && boost::dynamic_pointer_cast (*i) == 0) { + ++i; + } + + if (i == regions.end ()) { + /* No audio regions; we can just do the timefx without a dialogue */ + do_timefx (); + return 0; + } + switch (current_timefx->run ()) { case RESPONSE_ACCEPT: break; @@ -158,7 +168,6 @@ Editor::time_fx (RegionList& regions, float val, bool pitching) } current_timefx->status = 0; - current_timefx->regions = regions; if (pitching) { @@ -299,20 +308,22 @@ Editor::time_fx (RegionList& regions, float val, bool pitching) gtk_main_iteration (); } + pthread_join (current_timefx->request.thread, 0); + current_timefx->hide (); return current_timefx->status; } void -Editor::do_timefx (TimeFXDialog& dialog) +Editor::do_timefx () { boost::shared_ptr playlist; boost::shared_ptr new_region; set > playlists_affected; - uint32_t const N = dialog.regions.size (); + uint32_t const N = current_timefx->regions.size (); - for (RegionList::iterator i = dialog.regions.begin(); i != dialog.regions.end(); ++i) { + for (RegionList::iterator i = current_timefx->regions.begin(); i != current_timefx->regions.end(); ++i) { boost::shared_ptr playlist = (*i)->playlist(); if (playlist) { @@ -320,7 +331,7 @@ Editor::do_timefx (TimeFXDialog& dialog) } } - for (RegionList::iterator i = dialog.regions.begin(); i != dialog.regions.end(); ++i) { + for (RegionList::iterator i = current_timefx->regions.begin(); i != current_timefx->regions.end(); ++i) { boost::shared_ptr region = boost::dynamic_pointer_cast (*i); @@ -328,30 +339,30 @@ Editor::do_timefx (TimeFXDialog& dialog) continue; } - if (dialog.request.cancel) { + if (current_timefx->request.cancel) { /* we were cancelled */ /* XXX what to do about playlists already affected ? */ - dialog.status = 1; + current_timefx->status = 1; return; } Filter* fx; - if (dialog.pitching) { - fx = new Pitch (*_session, dialog.request); + if (current_timefx->pitching) { + fx = new Pitch (*_session, current_timefx->request); } else { #ifdef USE_RUBBERBAND - fx = new RBStretch (*_session, dialog.request); + fx = new RBStretch (*_session, current_timefx->request); #else - fx = new STStretch (*_session, dialog.request); + fx = new STStretch (*_session, current_timefx->request); #endif } current_timefx->descend (1.0 / N); if (fx->run (region, current_timefx)) { - dialog.status = -1; - dialog.request.done = true; + current_timefx->status = -1; + current_timefx->request.done = true; delete fx; return; } @@ -371,8 +382,8 @@ Editor::do_timefx (TimeFXDialog& dialog) _session->add_command (new StatefulDiffCommand (*p)); } - dialog.status = 0; - dialog.request.done = true; + current_timefx->status = 0; + current_timefx->request.done = true; } void* @@ -384,16 +395,19 @@ Editor::timefx_thread (void *arg) pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0); - tsd->editor.do_timefx (*tsd); + tsd->editor.do_timefx (); /* GACK! HACK! sleep for a bit so that our request buffer for the GUI event loop doesn't die before any changes we made are processed by the GUI ... */ +#ifdef PLATFORM_WINDOWS + Sleep(2000); +#else struct timespec t = { 2, 0 }; nanosleep (&t, 0); - +#endif return 0; }