Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / record.C
index 96ec0f8236284bd5a88f6fa504dd728d3e6ec89d..f42fe9e128497c419cba6a55b53229c59bd80aff 100644 (file)
@@ -46,7 +46,9 @@
 #include "keys.h"
 #include "language.h"
 #include "localsession.h"
+#ifdef HAVE_DV
 #include "libdv.h"
+#endif
 #include "libmjpeg.h"
 #include "libzmpeg3.h"
 #include "mainmenu.h"
@@ -75,6 +77,8 @@
 #include "tracks.h"
 #include "videoconfig.h"
 #include "videodevice.h"
+#include "wintv.h"
+#include "x10tv.h"
 
 #include <string.h>
 #include <sys/types.h>
@@ -160,6 +164,7 @@ Record::Record(MWindow *mwindow, RecordMenuItem *menu_item)
        cutads_status = new RecordCutAdsStatus(this);
        blink_status = new RecordBlinkStatus(this);
 #endif
+       deinterlace = RECORD_LACE_ODD;
 }
 
 Record::~Record()
@@ -212,10 +217,12 @@ int Record::load_defaults()
        case VIDEO4LINUX2JPEG:
                vcodec = CODEC_TAG_MJPEG;
                break;
+#ifdef HAVE_DV
        case CAPTURE_FIREWIRE:
        case CAPTURE_IEC61883:
                vcodec = CODEC_TAG_DVSD;
                break;
+#endif
        }
        if( vcodec )
                strcpy(default_asset->vcodec, vcodec);
@@ -234,6 +241,7 @@ int Record::load_defaults()
        video_zoom = defaults->get("RECORD_VIDEO_Z", (float)1);
        picture->load_defaults();
        reverse_interlace = defaults->get("REVERSE_INTERLACE", 0);
+       deinterlace = defaults->get("DEINTERLACE", RECORD_LACE_ODD);
        do_cursor = defaults->get("RECORD_CURSOR", 0);
        do_big_cursor = defaults->get("RECORD_BIG_CURSOR", 0);
        for( int i=0; i<MAXCHANNELS; ++i ) {
@@ -272,6 +280,7 @@ int Record::save_defaults()
        defaults->update("RECORD_VIDEO_Z", video_zoom);
        picture->save_defaults();
        defaults->update("REVERSE_INTERLACE", reverse_interlace);
+       defaults->update("DEINTERLACE", deinterlace);
        defaults->update("RECORD_CURSOR", do_cursor);
        defaults->update("RECORD_BIG_CURSOR", do_big_cursor);
        for( int i=0; i<MAXCHANNELS; ++i ) {
@@ -345,7 +354,8 @@ void Record::run()
        record_gui->show_window();
        record_gui->flush();
 
-       if( mwindow->gui->remote_control->deactivate() )
+       if( mwindow->gui->remote_control->deactivate() &&
+           mwindow->gui->record_remote_handler )
                mwindow->gui->record_remote_handler->activate();
 
        if( video_window_open ) {
@@ -384,7 +394,8 @@ void Record::run()
        stop(0);
        edl->Garbage::remove_user();
 
-       if( mwindow->gui->remote_control->deactivate() )
+       if( mwindow->gui->remote_control->deactivate() &&
+           mwindow->gui->cwindow_remote_handler )
                mwindow->gui->cwindow_remote_handler->activate();
 
 // Save everything again
@@ -401,7 +412,7 @@ void Record::run()
                        Asset *asset = batch->asset;
                        if( batch->recorded ) {
                                EDL *new_edl = new EDL;
-                               mwindow->remove_asset_from_caches(asset);
+                               mwindow->remove_from_caches(asset);
                                new_edl->create_objects();
                                new_edl->copy_session(mwindow->edl);
                                mwindow->asset_to_edl(new_edl, asset, batch->labels);
@@ -432,7 +443,7 @@ void Record::run()
                        mwindow->undo->update_undo_after(_("record"), LOAD_ALL);
                        mwindow->restart_brender();
                        mwindow->update_plugin_guis();
-                       mwindow->gui->update(1, 2, 1, 1, 1, 1, 0);
+                       mwindow->gui->update(1, FORCE_REDRAW, 1, 1, 1, 1, 0);
                        mwindow->sync_parameters(CHANGE_ALL);
                }
                mwindow->gui->unlock_window();
@@ -474,9 +485,7 @@ void Record::activate_batch(int number)
 
 void Record::delete_index_file(Asset *asset)
 {
-       IndexFile::delete_index(mwindow->preferences, asset, ".toc");
-       IndexFile::delete_index(mwindow->preferences, asset, ".idx");
-       IndexFile::delete_index(mwindow->preferences, asset, ".mkr");
+       IndexFile::delete_index_files(mwindow->preferences, asset);
 }
 
 void Record::delete_batch()
@@ -552,7 +561,7 @@ int Record::delete_output_file()
                record_gui->update_batches();
                Asset *asset = batch->asset;
                remove_file(asset->path);
-               mwindow->remove_asset_from_caches(asset);
+               mwindow->remove_from_caches(asset);
                delete_index_file(asset);
                batch->clear_notice();
                record_gui->update_batches();
@@ -1521,13 +1530,20 @@ void Record::stop_skimming() {}
 void Record::update_skimming(int v) {}
 #endif
 
-RecordRemoteHandler::RecordRemoteHandler(RemoteControl *remote_control)
+RecordKeyEvHandler::RecordKeyEvHandler(RemoteControl *remote_control)
  : RemoteHandler(remote_control->gui, GREEN)
+{
+       this->remote_control = remote_control;
+}
+
+RecordKeyEvHandler::~RecordKeyEvHandler()
 {
 }
 
-RecordRemoteHandler::~RecordRemoteHandler()
+int RecordKeyEvHandler::remote_key(int key)
 {
+       Record *record = remote_control->mwindow_gui->record;
+       return record->record_process_key(remote_control, key);
 }
 
 void Record::
@@ -1754,34 +1770,63 @@ void Record::add_key(int ch)
                                BIGFONT, WHITE, BLACK, 0, 3., 2.);
 }
 
-int RecordRemoteHandler::remote_process_key(RemoteControl *remote_control, int key)
-{
-       Record *record = remote_control->mwindow_gui->record;
-       return record->remote_process_key(remote_control, key);
-}
-
-int Record::remote_process_key(RemoteControl *remote_control, int key)
+int Record::record_process_key(RemoteControl *remote_control, int key)
 {
        int ch = key;
 
        switch( key ) {
        case KPENTER:
-               if( last_key == KPENTER ) {
-                       set_channel_name(keybfr);
-                       clear_keybfr();
-                       break;
-               }
-               ch = '.';  // fall through
-       case '0': if( last_key == '0' && ch == '0' ) {
+               if( last_key != KPENTER ) break;
+       case KPCC:
+               set_channel_name(keybfr);
                clear_keybfr();
                break;
-       }
-       case '1': case '2': case '3': case '4':
-       case '5': case '6': case '7': case '8': case '9':
+       case '0':
+               if( last_key == '0' && ch == '0' ) {
+                       clear_keybfr();
+                       break;
+               } // fall thru
+       case '1': case '2': case '3':
+       case '4': case '5': case '6':
+       case '7': case '8': case '9':
+       case '.':
                add_key(ch);
                break;
-       //case UP: case DOWN: case LEFT: case RIGHT:
-       //case KPPLAY: case KPBACK: case KPFORW:
+       //case UP: case DOWN:
+       //case LEFT: case RIGHT:
+       //case KPPLAY: case KPFWRD:
+       case KPMUTE:
+       case 'a': // toggle mute audio
+               if( !monitor_audio ) { set_mute_gain(1);  set_play_gain(1); }
+               set_audio_monitoring(monitor_audio ? 0 : 1);
+               break;
+       case KPBACK:  case 'm': // toggle metering audio
+               set_audio_metering(metering_audio ? 0 : 1);
+               break;
+       case 'd':  case KPSLASH:
+               display_channel_info();
+               break;
+       case 'e':  case KPSTAR:
+               display_channel_schedule();
+               break;
+       case KPCHUP:  case KPPLUS:
+               channel_up();
+               break;
+       case KPCHDN:  case KPMINUS:
+               channel_down();
+               break;
+       case KPVOLUP: {
+               set_play_gain(play_gain * 1.25);
+               break; }
+       case KPVOLDN: {
+               set_play_gain(play_gain * 0.75);
+               break; }
+       case KPFSCRN:
+       case 'f': {
+               RecordMonitorCanvas *canvas = record_monitor->window->canvas;
+               int on = canvas->get_fullscreen() ? 0 : 1;
+               canvas->Canvas::set_fullscreen(on, 0);
+               break; }
 #ifdef HAVE_COMMERCIAL
        case KPRECD:  case 'c': // start capture, mark endpoint
                if( !deletions ) {
@@ -1795,51 +1840,188 @@ int Record::remote_process_key(RemoteControl *remote_control, int key)
                }
                display_cut_icon(10,20);
                break;
-       case KPSTOP:  case 'd': // end capture, start cutting
+       case KPSTOP:  case 's': // end capture, start cutting
                remote_control->set_color(YELLOW);
                stop_commercial_capture(1);
                break;
        case KPAUSE:  case 'x': // ignore current commercial
                mark_commercial_capture(DEL_SKIP);
                break;
+       case KPPLAY:  case 'z': // ignore previous endpoint
+               mark_commercial_capture(DEL_OOPS);
+               break;
 #endif
-       case KPBACK:  case 'a': // toggle mute audio
-               if( !monitor_audio ) { set_mute_gain(1);  set_play_gain(1); }
-               set_audio_monitoring(monitor_audio ? 0 : 1);
+       default:
+               return -1;
+       }
+
+       last_key = key;
+       return 1;
+}
+
+int Record::wintv_process_code(int code)
+{
+#ifdef HAVE_WINTV
+       switch( code ) {
+       case WTV_OK:   break;
+       case WTV_LT:   break;
+       case WTV_UP:   break;
+       case WTV_RT:   break;
+       case WTV_DN:   break;
+       case WTV_HOME: {
+                RecordMonitorCanvas *canvas = record_monitor->window->canvas;
+                int on = canvas->get_fullscreen() ? 0 : 1;
+                canvas->Canvas::set_fullscreen(on, 0);
+                break; }
+       case WTV_BACK: // toggle metering audio
+                set_audio_metering(metering_audio ? 0 : 1);
+                break;
+       case WTV_VOLUP: {
+               set_play_gain(play_gain * 1.125);
+               break; }
+       case WTV_VOLDN: {
+               set_play_gain(play_gain * 0.875);
+               break; }
+       case WTV_CH_UP:
+                channel_up();
+                break;
+       case WTV_CH_DN:
+                channel_down();
+                break;
+       case WTV_0: {
+               WinTVRecordHandler *wintv_remote = (WinTVRecordHandler *)
+                       mwindow->gui->remote_control->handler;
+               WinTV *wintv = !wintv_remote ? 0 : wintv_remote->wintv;
+               if( !wintv || wintv->last_code == WTV_0 ) {
+                       clear_keybfr();
+                       break;
+               } } // fall thru
+       case WTV_1: case WTV_2: case WTV_3: case WTV_4:
+       case WTV_5: case WTV_6: case WTV_7: case WTV_8:
+       case WTV_9: {
+               int ch = code - WTV_0 + '0';
+               add_key(ch);
+               break; }
+       case WTV_TEXT: // add decimal point
+               add_key('.');
                break;
-       case 'm': // toggle metering audio
-               set_audio_metering(metering_audio ? 0 : 1);
+       case WTV_CC: // change channel
+               set_channel_name(keybfr);
+               clear_keybfr();
                break;
-#ifdef HAVE_COMMERCIAL
-       case KPPLAY:  case 's': // ignore previous endpoint
-               mark_commercial_capture(DEL_OOPS);
+       case WTV_BOX:
+                display_channel_schedule();
                break;
+       case WTV_START: break;
+       case WTV_REV:   break;
+       case WTV_STOP:  break;
+       case WTV_PLAY:  break;
+       case WTV_FWD:   break;
+       case WTV_END:   break;
+       case WTV_MUTE: // toggle mute audio
+               if( !monitor_audio ) {
+                       set_mute_gain(1);
+                       set_play_gain(play_gain);
+               }
+               set_audio_monitoring(monitor_audio ? 0 : 1);
+               break;
+       case WTV_PREV:
+                display_channel_info();
+                break;
+       default:
+               printf("wintv record: unknown code: %04x\n", code);
+               break;
+       }
 #endif
-       case KPFWRD:  case KPSLASH:
-               display_channel_info();
+       return 0;
+}
+
+int Record::x10tv_process_code(int code)
+{
+#ifdef HAVE_X10TV
+       switch( code ) {
+       case X10_A: // toggle metering audio
+                set_audio_metering(metering_audio ? 0 : 1);
+                break;
+       case X10_B:             break;
+       case X10_POWER:         break;
+       case X10_TV:            break;
+       case X10_DVD:           break;
+       case X10_WWW:           break;
+       case X10_BOOK:          break;
+       case X10_EDIT:          break;
+       case X10_VOLUP: {
+               set_play_gain(play_gain * 1.125);
+               break; }
+       case X10_VOLDN: {
+               set_play_gain(play_gain * 0.875);
+               break; }
+       case X10_MUTE: // toggle mute audio
+               if( !monitor_audio ) {
+                       set_mute_gain(1);
+                       set_play_gain(play_gain);
+               }
+               set_audio_monitoring(monitor_audio ? 0 : 1);
                break;
-       case KPMAXW:  case KPSTAR:
-               display_channel_schedule();
+       case X10_CH_UP:
+                channel_up();
+                break;
+       case X10_CH_DN:
+                channel_down();
+                break;
+       case X10_0: {
+               X10TVRecordHandler *x10tv_remote = (X10TVRecordHandler *)
+                       mwindow->gui->remote_control->handler;
+               X10TV *x10tv = !x10tv_remote ? 0 : x10tv_remote->x10tv;
+               if( x10tv->last_code == X10_0 ) {
+                       clear_keybfr();
+                       break;
+               } } // fall thru
+       case X10_1: case X10_2: case X10_3: case X10_4:
+       case X10_5: case X10_6: case X10_7: case X10_8:
+       case X10_9: {
+               int ch = code - X10_0 + '0';
+               add_key(ch);
+               break; }
+       case X10_MENU: // add decimal point
+               add_key('.');
                break;
-       case KPCHUP:  case KPPLUS:
-               channel_up();
+       case X10_SETUP: // change channel
+               set_channel_name(keybfr);
+               clear_keybfr();
                break;
-       case KPCHDN:  case KPMINUS:
-               channel_down();
+       case X10_C:
+                display_channel_schedule();
                break;
-       case 'f': {
-               Canvas *canvas = record_monitor->window->canvas;
-               if( !canvas->get_fullscreen() )
-                       canvas->start_fullscreen();
-               else
-                       canvas->stop_fullscreen();
-               break; }
+       case X10_UP:            break;
+       case X10_D:
+                display_channel_info();
+                break;
+       case X10_PROPS:         break;
+       case X10_LT:            break;
+       case X10_OK:            break;
+       case X10_RT:            break;
+       case X10_SCRN: {
+                RecordMonitorCanvas *canvas = record_monitor->window->canvas;
+                int on = canvas->get_fullscreen() ? 0 : 1;
+                canvas->Canvas::set_fullscreen(on, 0);
+                break; }
+       case X10_E:             break;
+       case X10_DN:            break;
+       case X10_F:             break;
+       case X10_REW:           break;
+       case X10_PLAY:          break;
+       case X10_FWD:           break;
+       case X10_REC:           break;
+       case X10_STOP:          break;
+       case X10_PAUSE:         break;
+
        default:
-               return -1;
+               printf("x10tv record: unknown code: %04x\n", code);
+               break;
        }
-
-       last_key = key;
-       return 1;
+#endif
+       return 0;
 }
 
 #ifdef HAVE_COMMERCIAL
@@ -2079,4 +2261,5 @@ run()
        remote_color(record->status_color);
 }
 
+// HAVE_COMMERCIAL
 #endif