X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fproxy.C;h=aa9c834300225aebf9843178ec40cbf83008d5c1;hp=9f25a7e1131ca32b0db95594adefa037b539ebbb;hb=d54e2016ca0bea24cd4371058d0f75aeebdb044f;hpb=559af27994c49da1d98e085f4ac2ec1ad1d1d27c diff --git a/cinelerra-5.1/cinelerra/proxy.C b/cinelerra-5.1/cinelerra/proxy.C index 9f25a7e1..aa9c8343 100644 --- a/cinelerra-5.1/cinelerra/proxy.C +++ b/cinelerra-5.1/cinelerra/proxy.C @@ -20,6 +20,7 @@ */ #include "assets.h" +#include "audiodevice.h" #include "bcsignals.h" #include "cache.h" #include "clip.h" @@ -48,7 +49,7 @@ #include "vrender.h" #define WIDTH 400 -#define HEIGHT 285 +#define HEIGHT 300 #define MAX_SCALE 16 ProxyMenuItem::ProxyMenuItem(MWindow *mwindow) @@ -87,10 +88,12 @@ ProxyDialog::ProxyDialog(MWindow *mwindow) size_text[0] = cstrdup(_("Original size")); size_factors[0] = 1; total_sizes = 1; + proxy_beep = 0; } ProxyDialog::~ProxyDialog() { + delete proxy_beep; close_window(); for( int i=0; iremove_user(); @@ -162,11 +165,14 @@ void ProxyDialog::handle_close_event(int result) { asset->save_defaults(mwindow->defaults, "PROXY_", 1, 1, 0, 0, 0); - if( !result ) - to_proxy(); + if( !result && (result=to_proxy()) >= 0 && beep && new_scale != 1 ) + if( result > 0 ) + mwindow->beep(2000., 1.5, 0.5); + else + mwindow->beep(4000., 0.25, 0.5); } -void ProxyDialog::to_proxy() +int ProxyDialog::to_proxy() { ArrayList orig_idxbls; ArrayList proxy_assets; @@ -221,8 +227,9 @@ void ProxyDialog::to_proxy() } // convert from the proxy assets to the original assets - int proxy_auto_scale = edl->session->proxy_auto_scale; - mwindow->set_proxy(0, 1, proxy_auto_scale, &proxy_assets, &orig_idxbls); + int auto_scale = edl->session->proxy_auto_scale; + int beep = edl->session->proxy_beep; + mwindow->set_proxy(0, 1, auto_scale, beep, &proxy_assets, &orig_idxbls); // remove the references for( int i=0; iset_proxy(use_scaler, new_scale, auto_scale, + mwindow->set_proxy(use_scaler, new_scale, auto_scale, beep, &proxy_render.orig_idxbls, &proxy_render.orig_proxies); mwindow->undo->update_undo_after(_("proxy"), LOAD_ALL); @@ -294,6 +301,7 @@ void ProxyDialog::to_proxy() mwindow->gui->lock_window("ProxyDialog::to_proxy"); mwindow->update_project(LOADMODE_REPLACE); mwindow->gui->unlock_window(); + return !result ? proxy_render.needed_proxies.size() : -1; } @@ -452,7 +460,6 @@ printf("failed=%d canceled=%d\n", failed, progress->is_cancelled()); if( failed && !canceled ) { eprintf("Error making proxy."); } - return !failed && !canceled ? 0 : 1; } @@ -482,6 +489,7 @@ void ProxyWindow::create_objects() dialog->use_scaler = mwindow->edl->session->proxy_use_scaler; dialog->orig_scale = mwindow->edl->session->proxy_scale; dialog->auto_scale = mwindow->edl->session->proxy_auto_scale; + dialog->beep = mwindow->edl->session->proxy_beep; dialog->new_scale = dialog->orig_scale; int x = margin; @@ -516,6 +524,8 @@ void ProxyWindow::create_objects() x = margin; add_subwindow(auto_scale = new ProxyAutoScale(this, x, y)); y += auto_scale->get_h() + margin; + add_subwindow(beep_on_done = new ProxyBeepOnDone(this, x, y)); + y += beep_on_done->get_h() + margin; update(); @@ -585,7 +595,7 @@ int ProxyUseScaler::handle_event() } ProxyAutoScale::ProxyAutoScale(ProxyWindow *pwindow, int x, int y) - : BC_CheckBox(x, y, pwindow->dialog->use_scaler, _("Auto proxy/scale media loads")) + : BC_CheckBox(x, y, pwindow->dialog->auto_scale, _("Auto proxy/scale media loads")) { this->pwindow = pwindow; } @@ -607,6 +617,19 @@ int ProxyAutoScale::handle_event() return 1; } +ProxyBeepOnDone::ProxyBeepOnDone(ProxyWindow *pwindow, int x, int y) + : BC_CheckBox(x, y, pwindow->dialog->beep, _("Beep on done")) +{ + this->pwindow = pwindow; +} + +int ProxyBeepOnDone::handle_event() +{ + pwindow->dialog->beep = get_value(); + pwindow->update(); + return 1; +} + ProxyMenu::ProxyMenu(MWindow *mwindow, ProxyWindow *pwindow, int x, int y, int w, const char *text) @@ -833,3 +856,85 @@ LoadPackage* ProxyFarm::new_package() return new ProxyPackage; } + +ProxyBeep::ProxyBeep(MWindow *mwindow) + : Thread(1, 0, 0) +{ + this->mwindow = mwindow; + audio = new AudioDevice(mwindow); + playing_audio = 0; + interrupted = -1; +} + +ProxyBeep::~ProxyBeep() +{ + stop(0); + delete audio; +} + +void ProxyBeep::run() +{ + int channels = 2; + int64_t bfrsz = BEEP_SAMPLE_RATE; + EDL *edl = mwindow->edl; + EDLSession *session = edl->session; + AudioOutConfig *aconfig = session->playback_config->aconfig; + audio->open_output(aconfig, BEEP_SAMPLE_RATE, bfrsz, channels, 0); + audio->start_playback(); + + double out0[bfrsz], out1[bfrsz], *out[2] = { out0, out1 }; + const double two_pi = 2*M_PI; + int64_t audio_len = BEEP_SAMPLE_RATE * secs; + const double dt = two_pi * freq/BEEP_SAMPLE_RATE; + double th = 0; + + audio_pos = 0; + playing_audio = 1; + while( !interrupted ) { + int len = audio_len - audio_pos; + if( len <= 0 ) break; + if( len > bfrsz ) len = bfrsz; + int k = audio_pos; + for( int i=0; i= 0 ) th = t; + out0[i] = out1[i] = sin(th) * gain; + } + audio->write_buffer(out, channels, len); + audio_pos = k; + } + + if( !interrupted ) + audio->set_last_buffer(); + audio->stop_audio(interrupted ? 0 : 1); + playing_audio = 0; + + audio->close_all(); +} + +void ProxyBeep::start() +{ + if( running() ) return; + audio_pos = -1; + interrupted = 0; + Thread::start(); +} + +void ProxyBeep::stop(int wait) +{ + if( running() && !interrupted ) { + interrupted = 1; + audio->stop_audio(wait); + } + Thread::join(); +} + +void ProxyBeep::tone(double freq, double secs, double gain) +{ + stop(0); + this->freq = freq; + this->secs = secs; + this->gain = gain; + start(); +} +