X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_timefx.cc;h=067cfef8991a5bb40f7cf2a564b7f7fc19c1d31b;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=33259a398b029c218bb97568d58aa0e6076fd0d3;hpb=d63e8ba0e8eeda4f53684bbd20f027c0cd6f7c89;p=ardour.git diff --git a/gtk2_ardour/editor_timefx.cc b/gtk2_ardour/editor_timefx.cc index 33259a398b..067cfef899 100644 --- a/gtk2_ardour/editor_timefx.cc +++ b/gtk2_ardour/editor_timefx.cc @@ -29,6 +29,13 @@ #include "pbd/memento_command.h" #include "pbd/stateful_diff_command.h" +#include "ardour/audioregion.h" +#include "ardour/midi_stretch.h" +#include "ardour/pitch.h" +#include "ardour/region.h" +#include "ardour/session.h" +#include "ardour/stretch.h" + #include #include "audio_region_view.h" @@ -37,19 +44,12 @@ #include "region_selection.h" #include "time_fx_dialog.h" -#include "ardour/audioregion.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 using namespace RubberBand; #endif -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -76,6 +76,7 @@ Editor::time_stretch (RegionSelection& regions, float fraction) } if ((aret = time_fx (audio, fraction, false)) != 0) { + commit_reversible_command (); return aret; } @@ -132,6 +133,8 @@ Editor::pitch_shift (RegionSelection& regions, float fraction) if (ret == 0) { commit_reversible_command (); + } else { + abort_reversible_command (); } return ret; @@ -143,22 +146,18 @@ Editor::pitch_shift (RegionSelection& regions, float fraction) int Editor::time_fx (RegionList& regions, float val, bool pitching) { + if (regions.empty()) { + return 0; + } + + const framecnt_t oldlen = (framecnt_t) (regions.front()->length()); + const framecnt_t newlen = (framecnt_t) (regions.front()->length() * val); + const framecnt_t pos = regions.front()->position (); + delete current_timefx; - current_timefx = new TimeFXDialog (*this, pitching); + current_timefx = new TimeFXDialog (*this, pitching, oldlen, newlen, pos); 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; @@ -168,34 +167,14 @@ Editor::time_fx (RegionList& regions, float val, bool pitching) } current_timefx->status = 0; + current_timefx->request.time_fraction = current_timefx->get_time_fraction (); + current_timefx->request.pitch_fraction = current_timefx->get_pitch_fraction (); - if (pitching) { - - float cents = current_timefx->pitch_octave_adjustment.get_value() * 1200.0; - float pitch_fraction; - cents += current_timefx->pitch_semitone_adjustment.get_value() * 100.0; - cents += current_timefx->pitch_cent_adjustment.get_value(); - - if (cents == 0.0) { - // user didn't change anything - current_timefx->hide (); - return 0; - } - - // one octave == 1200 cents - // adding one octave doubles the frequency - // ratio is 2^^octaves - - pitch_fraction = pow(2, cents/1200); - - current_timefx->request.time_fraction = 1.0; - current_timefx->request.pitch_fraction = pitch_fraction; - - } else { - - current_timefx->request.time_fraction = val; - current_timefx->request.pitch_fraction = 1.0; - + if (current_timefx->request.time_fraction == 1.0 && + current_timefx->request.pitch_fraction == 1.0) { + /* nothing to do */ + current_timefx->hide (); + return 0; } #ifdef USE_RUBBERBAND @@ -296,6 +275,8 @@ Editor::time_fx (RegionList& regions, float val, bool pitching) current_timefx->first_delete = current_timefx->signal_delete_event().connect (sigc::mem_fun (current_timefx, &TimeFXDialog::delete_in_progress)); + current_timefx->start_updates (); + if (pthread_create_and_store ("timefx", ¤t_timefx->request.thread, timefx_thread, current_timefx)) { current_timefx->hide (); error << _("timefx cannot be started - thread creation error") << endmsg; @@ -402,12 +383,11 @@ Editor::timefx_thread (void *arg) by the GUI ... */ -#ifdef WIN32 - Sleep(2000); +#ifdef PLATFORM_WINDOWS + Glib::usleep(2 * G_USEC_PER_SEC); #else struct timespec t = { 2, 0 }; nanosleep (&t, 0); #endif return 0; } -