diff --git a/config.h b/config.h index 8fb7dbc..9d6eecf 100644 --- a/config.h +++ b/config.h @@ -239,7 +239,7 @@ /* #undef TTFFONTFILE */ /* Version number of package */ -#define VERSION "0.4.12" +#define VERSION "0.4.13" /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ diff --git a/configure b/configure index 553007f..d3036ec 100755 --- a/configure +++ b/configure @@ -2548,7 +2548,7 @@ VERSION_MAJOR=0 VERSION_MINOR=4 -VERSION_SUB=12 +VERSION_SUB=13 am__api_version='1.11' @@ -6255,6 +6255,8 @@ FOUND_L_PORTMIDI=yes fi + fi + if test "x$FOUND_H_PORTMIDI$FOUND_L_PORTMIDI" = "xyesyes"; then MIDI_LIBS="-lportmidi" fi diff --git a/configure.ac b/configure.ac index 2f7d44b..3d01e5c 100644 --- a/configure.ac +++ b/configure.ac @@ -8,7 +8,7 @@ VERSION_MAJOR=0 VERSION_MINOR=4 -VERSION_SUB=12 +VERSION_SUB=13 dnl Every other copy of the package version number gets its value from here AM_INIT_AUTOMAKE(xjadeo, [${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_SUB}]) @@ -197,6 +197,8 @@ if test "x$PORTMIDI" != "xno" -a -z "$portmidisrc" ; then AC_CHECK_HEADERS(portmidi.h porttime.h , [FOUND_H_PORTMIDI=yes]) AC_CHECK_LIB([portmidi], [Pm_CountDevices], [FOUND_L_PORTMIDI=yes]) + fi + if test "x$FOUND_H_PORTMIDI$FOUND_L_PORTMIDI" = "xyesyes"; then MIDI_LIBS="-lportmidi" fi diff --git a/doc/xjadeorc b/doc/xjadeorc index 16d8fe9..f1c0e66 100644 --- a/doc/xjadeorc +++ b/doc/xjadeorc @@ -51,16 +51,17 @@ # # -m : specify MIDI port to read from. -# with alsa-midi this is a string alike "24,0" or "hw:2,0,0" -# for port-midi use an integer value of the midi port eg. 2 -# "-1" autoconnects to the first avail. input-port with the -# portmidi driver. -#midiid= -;midismpte=-1 +# jack-midi: specify midi-port name to connect to or "" to not auto-connect. +# alsa-seq: specify id to connect to. (-1: none) eg. -m ardour or -m 80 +# portmidi: numeric-id; -1: autodetect, > -1 specifies a (input) midi port. +# use '-v -m -1' to list midi-ports. +# alsa-raw: specify device-name eg. -m hw:1,0 or -m 1 +# 'xjadeo -h' shows more information, 'xjadeo -V' lists available drivers. +;mididriver=alsa-sequencer +;midiid=-1 -# -C : use MTC quarter frames for -# more accurate sync. this is generally -# a good idea, however it taxes performance. +# -c : don't use MTC quarter frames for +# more accurate sync. #midiclk=[yes|no] ;midiclk=no diff --git a/src/qt-gui/mainwindow.ui b/src/qt-gui/mainwindow.ui index 1e76e41..26c0e4c 100644 --- a/src/qt-gui/mainwindow.ui +++ b/src/qt-gui/mainwindow.ui @@ -8,7 +8,7 @@ 0 0 - 347 + 300 120 @@ -44,7 +44,7 @@ textLabel2 - FPS + screen updates per sec. @@ -83,7 +83,7 @@ textLabel1 - Frame offset + time offset in video-frames: @@ -110,13 +110,30 @@ 0 + + + spacer4 + + + Horizontal + + + Expanding + + + + 2 + 6 + + + progressBar - 3 + 7 0 5 0 @@ -153,7 +170,7 @@ - 1 + 3 6 @@ -236,7 +253,8 @@ - + + @@ -248,7 +266,8 @@ - + + @@ -336,16 +355,30 @@ - syncMTCAction + syncMTCJackAction true - MTC + MTC (JACK MIDI) - MTC + MTC (JACK MIDI) + + + + + syncMTCAlsaAction + + + true + + + MTC (ALSA SEQ) + + + MTC (ALSA SEQ) @@ -437,16 +470,30 @@ - osdSMTPEAction + osdSMPTEAction true - SMTPE - - - SMTPE + SMPTE + + + SMPTE + + + + + osdBoxAction + + + true + + + Box + + + Box @@ -589,10 +636,16 @@ syncOff() - syncMTCAction - activated() - MainWindow - syncMTC() + syncMTCAlsaAction + activated() + MainWindow + syncMTCalsa() + + + syncMTCJackAction + activated() + MainWindow + syncMTCjack() syncJackAction @@ -613,7 +666,13 @@ setFPS(const QString&) - osdSMTPEAction + osdBoxAction + toggled(bool) + MainWindow + osdBoxToggled(bool) + + + osdSMPTEAction toggled(bool) MainWindow osdSMPTEToggled(bool) @@ -685,12 +744,14 @@ zoom200() zoomFullScreen() syncJack() - syncMTC() + syncMTCjack() + syncMTCalsa() syncOff() setOffset( const QString & ) fileExit() osdFrameToggled( bool ) osdSMPTEToggled( bool ) + osdBoxToggled( bool ) osdFont() seekBarChanged( int ) filePreferences() diff --git a/src/qt-gui/prefdialog.ui b/src/qt-gui/prefdialog.ui index e3686be..3846fc4 100644 --- a/src/qt-gui/prefdialog.ui +++ b/src/qt-gui/prefdialog.ui @@ -46,7 +46,7 @@ textLabel1 - Midi port (MTC): + Autoconnect ALSA Midi port (MTC): @@ -68,7 +68,7 @@ - prefLineMidi + prefLineAlsaMidi @@ -92,7 +92,7 @@ - layout10 + layout11 @@ -100,15 +100,15 @@ - textLabel1_2 + textLabel3 - xjadeo/xjremote executable: + Autoconnect JACK Midi port (MTC): - spacer16_2 + spacer9 Horizontal @@ -118,14 +118,14 @@ - 10 + 0 20 - prefLineXjadeo + prefLineJackMidi @@ -141,12 +141,15 @@ 0 + + 64 + - layout13 + layout10 @@ -154,6 +157,60 @@ + textLabel1_2 + + + xjadeo/xjremote executable: + + + + + spacer16_2 + + + Horizontal + + + Expanding + + + + 10 + 20 + + + + + + prefLineXjadeo + + + + 7 + 0 + 1 + 0 + + + + + 160 + 0 + + + + + + + + layout13 + + + + unnamed + + + textLabel1_3 @@ -172,7 +229,7 @@ - 81 + 57 21 diff --git a/src/qt-gui/qjadeo.cpp b/src/qt-gui/qjadeo.cpp index cb3ddd1..207b22d 100644 --- a/src/qt-gui/qjadeo.cpp +++ b/src/qt-gui/qjadeo.cpp @@ -58,7 +58,8 @@ if(m_recentFiles.count()) updateRecentFilesMenu(); - m_midiport = m_settings.readEntry("MIDI port"); + m_alsamidiport = m_settings.readEntry("ALSA MIDI port"); + m_jackmidiport = m_settings.readEntry("JACK MIDI port"); m_importdir = m_settings.readEntry("Import Directory"); m_importdestination = m_settings.readBoolEntry("Import Destination"); m_importcodec = m_settings.readEntry("Import Codec"); @@ -68,7 +69,8 @@ m_xjinfopath = m_settings.readEntry("XJINFO Path"); // TODO: detect portmidi / alsamidi default. 'midi library' - if (m_midiport.isEmpty()) m_midiport = QString("24"); + if (m_alsamidiport.isEmpty()) m_alsamidiport = QString("24"); + if (m_jackmidiport.isEmpty()) m_jackmidiport = QString(""); if (m_importcodec.isEmpty()) m_importcodec = QString("mpeg4"); if (m_mencoderpath.isEmpty()) m_mencoderpath = QString("mencoder"); if (m_xjadeopath.isEmpty()) m_xjadeopath = QString(BINDIR "xjremote"); @@ -89,6 +91,7 @@ xjadeo.writeToStdin(QString("get framerate\n")); xjadeo.writeToStdin(QString("get offset\n")); xjadeo.writeToStdin(QString("get osdcfg\n")); + xjadeo.writeToStdin(QString("midi driver\n")); xjadeo.writeToStdin(QString("get syncsource\n")); xjadeo.writeToStdin(QString("get position\n")); xjadeo.writeToStdin(QString("get seekmode\n")); @@ -159,7 +162,8 @@ for(int i = 0; i < int (m_recentFiles.count()); ++i) m_settings.writeEntry("File" + QString::number(i + 1), m_recentFiles[i]); m_settings.writeEntry("OSD font", m_osdfont); - m_settings.writeEntry("MIDI port", m_midiport); + m_settings.writeEntry("JACK MIDI port", m_jackmidiport); + m_settings.writeEntry("ALSA MIDI port", m_alsamidiport); m_settings.writeEntry("Import Codec", m_importcodec); m_settings.writeEntry("Import Directory", m_importdir); m_settings.writeEntry("Import Destination", m_importdestination); @@ -207,7 +211,8 @@ PrefDialog *pdialog = new PrefDialog::PrefDialog(this); if (pdialog) { /* set values */ - pdialog->prefLineMidi->setText(m_midiport); + pdialog->prefLineJackMidi->setText(m_jackmidiport); + pdialog->prefLineAlsaMidi->setText(m_alsamidiport); pdialog->prefLineXjadeo->setText(m_xjadeopath); pdialog->prefLineXjinfo->setText(m_xjinfopath); pdialog->prefLineMencoder->setText(m_mencoderpath); @@ -229,8 +234,10 @@ m_xjadeopath = pdialog->prefLineXjadeo->text(); if (!pdialog->prefLineXjinfo->text().isEmpty()) m_xjinfopath = pdialog->prefLineXjinfo->text(); - if (!pdialog->prefLineMidi->text().isEmpty()) - m_midiport = pdialog->prefLineMidi->text(); + if (!pdialog->prefLineAlsaMidi->text().isEmpty()) + m_alsamidiport = pdialog->prefLineAlsaMidi->text(); + if (!pdialog->prefLineJackMidi->text().isEmpty()) + m_jackmidiport = pdialog->prefLineJackMidi->text(); if (pdialog->prefDirCheckBox->isOn() && !pdialog->destDirLineEdit->text().isEmpty()) m_importdir = pdialog->destDirLineEdit->text(); /* and save */ @@ -340,21 +347,35 @@ { xjadeo.writeToStdin(QString("midi disconnect\n")); xjadeo.writeToStdin(QString("jack connect\n")); + xjadeo.writeToStdin(QString("midi driver\n")); xjadeo.writeToStdin(QString("get syncsource\n")); } -void QJadeo::syncMTC() -{ - xjadeo.writeToStdin(QString("jack disconnect\n")); - //xjadeo.writeToStdin(QString("midi reconnect\n")); - xjadeo.writeToStdin(QString("midi connect "+ m_midiport +"\n")); - xjadeo.writeToStdin(QString("get syncsource\n")); -} - -void QJadeo::syncOff() +void QJadeo::syncMTCalsa() { xjadeo.writeToStdin(QString("jack disconnect\n")); xjadeo.writeToStdin(QString("midi disconnect\n")); + xjadeo.writeToStdin(QString("midi driver alsa-seq\n")); + xjadeo.writeToStdin(QString("midi connect "+ m_alsamidiport +"\n")); + xjadeo.writeToStdin(QString("midi driver\n")); + xjadeo.writeToStdin(QString("get syncsource\n")); +} + +void QJadeo::syncMTCjack() +{ + xjadeo.writeToStdin(QString("jack disconnect\n")); + xjadeo.writeToStdin(QString("midi disconnect\n")); + xjadeo.writeToStdin(QString("midi driver jack\n")); + xjadeo.writeToStdin(QString("midi connect "+ m_jackmidiport +"\n")); + xjadeo.writeToStdin(QString("midi driver\n")); + xjadeo.writeToStdin(QString("get syncsource\n")); +} + +void QJadeo::syncOff() +{ + xjadeo.writeToStdin(QString("jack disconnect\n")); + xjadeo.writeToStdin(QString("midi disconnect\n")); + xjadeo.writeToStdin(QString("midi driver\n")); xjadeo.writeToStdin(QString("get syncsource\n")); } @@ -382,6 +403,14 @@ xjadeo.writeToStdin(QString("osd smpte 100\n")); else xjadeo.writeToStdin(QString("osd smpte -1\n")); +} + +void QJadeo::osdBoxToggled(bool value) +{ + if(value) + xjadeo.writeToStdin(QString("osd box\n")); + else + xjadeo.writeToStdin(QString("osd nobox\n")); } void QJadeo::seekBarChanged( int value ) @@ -474,18 +503,27 @@ Seek->setItemChecked(Seek->idAt(0),TRUE); } } + else if(name == "mididrv") + { + m_mididrv = 0; + if (value == "JACK-MIDI") m_mididrv = 1; + } else if(name == "syncsource") { Sync->setItemChecked(Sync->idAt(0),FALSE); Sync->setItemChecked(Sync->idAt(1),FALSE); Sync->setItemChecked(Sync->idAt(2),FALSE); + Sync->setItemChecked(Sync->idAt(3),FALSE); if (value.toInt()==0) { // off seekBar->setEnabled(TRUE); - Sync->setItemChecked(Sync->idAt(2),TRUE); + Sync->setItemChecked(Sync->idAt(3),TRUE); } else if (value.toInt()==2) { // MIDI seekBar->setEnabled(FALSE); - Sync->setItemChecked(Sync->idAt(1),TRUE); + if (m_mididrv == 1) + Sync->setItemChecked(Sync->idAt(1),TRUE); // JACK midi + else + Sync->setItemChecked(Sync->idAt(2),TRUE); // ALSA midi } else { seekBar->setEnabled(FALSE); //JACK Sync->setItemChecked(Sync->idAt(0),TRUE); @@ -531,6 +569,7 @@ xjadeo.writeToStdin(QString("notify frame\n")); xjadeo.writeToStdin(QString("get offset\n")); xjadeo.writeToStdin(QString("get osdcfg\n")); + xjadeo.writeToStdin(QString("midi driver\n")); xjadeo.writeToStdin(QString("get syncsource\n")); xjadeo.writeToStdin(QString("get position\n")); } @@ -547,6 +586,7 @@ m_frames = 0; m_offset = 0; m_framerate = 0; + m_mididrv = 0; xjadeo.writeToStdin("load " + filename + "\n"); xjadeo.writeToStdin(QString("get filename\n")); xjadeo.writeToStdin(QString("get width\n")); @@ -598,10 +638,10 @@ if(!xjadeo.start()) { - QMessageBox::QMessageBox::critical( &w, "qjadeo","can not execute xjadeo/xjremote.","Exit", QString::null, QString::null, 0, -1); - - qFatal("Could not start xjadeo executable: " + xjadeoPath); - qFatal("Try to set the XJREMOTE environment variable to point to xjadeo."); + QMessageBox::QMessageBox::critical( &w, "qjadeo","can not execute xjadeo/xjremote.","Exit", QString::null, QString::null, 0, -1); + //qFatal("Could not start xjadeo executable: " + xjadeoPath); + //qFatal("Try to set the XJREMOTE environment variable to point to xjadeo."); + exit(1); } w.connect(&xjadeo, SIGNAL(readyReadStdout()), &w, SLOT(readFromStdout())); diff --git a/src/qt-gui/qjadeo.h b/src/qt-gui/qjadeo.h index 09596ae..3e503e3 100644 --- a/src/qt-gui/qjadeo.h +++ b/src/qt-gui/qjadeo.h @@ -30,13 +30,15 @@ int m_offset; int m_framerate; QString m_osdfont; - QString m_midiport; + QString m_alsamidiport; + QString m_jackmidiport; QString m_importdir; bool m_importdestination; QString m_importcodec; QString m_mencoderpath; QString m_mencoderopts; QString m_xjinfopath; + int m_mididrv; void updateRecentFilesMenu(); void updateRecentFiles(const QString & filename); @@ -57,7 +59,8 @@ void zoomFullScreen(); void syncJack(); - void syncMTC(); + void syncMTCalsa(); + void syncMTCjack(); void syncOff(); void seekContinuously(); @@ -73,6 +76,7 @@ void osdFrameToggled(bool); void osdSMPTEToggled(bool); + void osdBoxToggled(bool); void osdFont(); void seekBarChanged( int ); diff --git a/src/qt-gui/qjadeo_fr.ts b/src/qt-gui/qjadeo_fr.ts index 2b11d60..a163d1c 100644 --- a/src/qt-gui/qjadeo_fr.ts +++ b/src/qt-gui/qjadeo_fr.ts @@ -96,12 +96,12 @@ qjadeo - FPS - FPS - - - Frame offset - Décalage de trame + screen updates per sec. + Fréquence de rafraîchissement d'écran: + + + time offset in video-frames: + Décalage dans les trames vidéo: &File @@ -168,8 +168,12 @@ Transport JACK - MTC - MTC + MTC (ALSA SEQ) + MTC (ALSA SEQ) + + + MTC (JACK MIDI) + MTC (JACK MIDI) off @@ -204,7 +208,11 @@ Numéro de Trame - SMTPE + Box + Cadre + + + SMPTE SMPTE @@ -263,8 +271,12 @@ Paramètres généraux - Midi port (MTC): - Port Midi (MTC): + Autoconnect ALSA Midi port (MTC): + Se connecter automatiquement ce port ALSA Midi (MTC): + + + Autoconnect JACK Midi port (MTC): + Se connecter automatiquement ce port JACK Midi (MTC): xjadeo/xjremote executable: diff --git a/src/xjadeo/configfile.c b/src/xjadeo/configfile.c index 46fc842..ff0c440 100644 --- a/src/xjadeo/configfile.c +++ b/src/xjadeo/configfile.c @@ -42,6 +42,7 @@ extern int want_nosplash; extern int mq_en; extern int avoid_lash; +extern char *midi_driver; #ifdef HAVE_MIDI extern char midiid[32]; @@ -94,6 +95,12 @@ #ifdef HAVE_MIDI midi_clkconvert=atoi(value); #endif + } else if (!strncasecmp(item,"MIDIDRIVER",10)) { + #ifdef HAVE_MIDI + if (midi_driver) free(midi_driver); + midi_driver = strdup(value); + #endif + rv=1; } else if (!strncasecmp(item,"QUIET",7)) { YES_OK (want_quiet); } else if (!strncasecmp(item,"VERBOSE",7)) { diff --git a/src/xjadeo/remote.c b/src/xjadeo/remote.c index d63bbf6..63e0bf3 100644 --- a/src/xjadeo/remote.c +++ b/src/xjadeo/remote.c @@ -686,7 +686,7 @@ if (midi_choose_driver(mp)>0) { remote_printf(100,"ok."); } else { - remote_printf(440,"choosen MIDI driver is not supported."); + remote_printf(440,"chosen MIDI driver is not supported."); } #else remote_printf(499,"midi not available."); diff --git a/src/xjadeo/xjadeo.c b/src/xjadeo/xjadeo.c index 3190c8e..ecd7b54 100644 --- a/src/xjadeo/xjadeo.c +++ b/src/xjadeo/xjadeo.c @@ -187,10 +187,10 @@ #endif offFrame = newFrame + ts_offset; - + long curFrame = dispFrame; display_frame((int64_t)(offFrame), force_redraw); - if ((remote_en||mq_en||ipc_queue) && ((remote_mode&1) || ((remote_mode&2)&& offFrame!=dispFrame)) ) { + if ((remote_en||mq_en||ipc_queue) && ((remote_mode&1) || ((remote_mode&2)&& curFrame!=dispFrame)) ) { /*call xapi_pposition ?? -> rv:200 * dispFrame is the currently displayed frame * = SMPTE + offset @@ -580,13 +580,13 @@ printf("\nDEBUG: want frame=%li ", (long int) timestamp); # endif -# if 1 // TODO -> -F - timestamp*=tpf; -# else // THIS is eqivalent - or even better at rounding but - // does not work with -F - timestamp=av_rescale_q(timestamp,c1_Q,v_stream->time_base); - timestamp=av_rescale_q(timestamp,c1_Q,v_stream->r_frame_rate); //< timestamp/=framerate; -# endif + if (filefps > 0) { + timestamp*=tpf; + } else { + // does not work with -F , but it's more accurate when rounding ratios + timestamp=av_rescale_q(timestamp,c1_Q,v_stream->time_base); + timestamp=av_rescale_q(timestamp,c1_Q,v_stream->r_frame_rate); //< timestamp/=framerate; + } # ifdef FFDEBUG printf("ts=%li ##\n", (long int) timestamp); diff --git a/xjadeo.spec b/xjadeo.spec index 7395cb6..2388806 100644 --- a/xjadeo.spec +++ b/xjadeo.spec @@ -9,7 +9,7 @@ # # %define name xjadeo -%define version 0.4.12 +%define version 0.4.13 %define release 1 Name: %{name}