From: Ed Rogalsky Date: Thu, 22 Nov 2012 10:17:18 +0000 (+0100) Subject: Merge branch 'master' into bugfix/jogshuttle X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=27bd91107e757db52b4b9b00ef0b8f262839043d;hp=9fa09dca16c321d6ea249351d282d5bee0c5ddd8;p=kdenlive Merge branch 'master' into bugfix/jogshuttle --- diff --git a/src/jogshuttle.cpp b/src/jogshuttle.cpp index 16fd171f..fd321530 100644 --- a/src/jogshuttle.cpp +++ b/src/jogshuttle.cpp @@ -84,32 +84,77 @@ bool ShuttleThread::isWorking() void ShuttleThread::run() { - kDebug() << "------- STARTING SHUTTLE: " << m_device; + kDebug() << "------- STARTING SHUTTLE: " << m_device; + /* open file descriptor */ + const int fd = KDE_open((char *) m_device.toUtf8().data(), O_RDONLY); + if (fd < 0) { + fprintf(stderr, "Can't open Jog Shuttle FILE DESCRIPTOR\n"); + return; + } - const int fd = KDE_open((char *) m_device.toUtf8().data(), O_RDONLY); - if (fd < 0) { - fprintf(stderr, "Can't open Jog Shuttle FILE DESCRIPTOR\n"); - return;; - } - EV ev; + EV ev; - if (ioctl(fd, EVIOCGRAB, 1) < 0) { - fprintf(stderr, "Can't get exclusive access on Jog Shuttle FILE DESCRIPTOR\n"); - close(fd); - return;; - } + if (ioctl(fd, EVIOCGRAB, 1) < 0) { + fprintf(stderr, "Can't get exclusive access on Jog Shuttle FILE DESCRIPTOR\n"); + close(fd); + return; + } - int num_warnings = 0; - while (!stop_me) { - if (read(fd, &ev, sizeof(ev)) < 0) { - if (num_warnings % 10000 == 0) - fprintf(stderr, "Failed to read event from Jog Shuttle FILE DESCRIPTOR (repeated %d times)\n", num_warnings + 1); - num_warnings++; - } - handle_event(ev); - } - close(fd); + fd_set readset; + struct timeval timeout; + + int num_warnings = 0; + int result, iof = -1; + + /* enter thread loop */ + while (!stop_me) { + /* reset the read set */ + FD_ZERO(&readset); + FD_SET(fd, &readset); + + /* reinit the timeout structure */ + timeout.tv_sec = 0; + timeout.tv_usec = 300000; /* 300 ms */ + + /* do the select */ + result = select(fd+1, &readset, NULL, NULL, &timeout); + + /* see if there was an error or timeout */ + if (result < 0) { + // perror("select failed"); + } else if (result == 0) { + //puts("TIMEOUT"); + } else { + /* we have input */ + if (FD_ISSET(fd, &readset)) { + /* get fd settings */ + if ((iof = fcntl(fd, F_GETFL, 0)) != -1) { + /* set fd non blocking */ + fcntl(fd, F_SETFL, iof | O_NONBLOCK); + /* read input */ + if (read(fd, &ev, sizeof(ev)) < 0) { + if (num_warnings % 10000 == 0) + /* should not happen cause select called before */ + fprintf(stderr, "Failed to read event from Jog Shuttle FILE DESCRIPTOR (repeated %d times)\n", num_warnings + 1); + num_warnings++; + } + + /* restore settings */ + if (iof != -1) { + fcntl(fd, F_SETFL, iof); + } + /* process event */ + handle_event(ev); + } else { + fprintf(stderr, "Can't set Jog Shuttle FILE DESCRIPTOR to O_NONBLOCK\n"); + stop_me = true; + } + } + } + } + /* close the handle and return thread */ + close(fd); } void ShuttleThread::handle_event(EV ev) @@ -207,7 +252,7 @@ JogShuttle::JogShuttle(QString device, QObject *parent) : JogShuttle::~JogShuttle() { - if (m_shuttleProcess.isRunning()) m_shuttleProcess.exit(); + stopDevice(); } void JogShuttle::initDevice(QString device) @@ -222,8 +267,19 @@ void JogShuttle::initDevice(QString device) void JogShuttle::stopDevice() { - if (m_shuttleProcess.isRunning()) + if (m_shuttleProcess.isRunning()) { + /* tell thread to stop */ m_shuttleProcess.stop_me = true; + m_shuttleProcess.exit(); + /* give the thread some time (ms) to shutdown */ + m_shuttleProcess.wait(600); + + /* if still running - do it in the hardcore way */ + if (m_shuttleProcess.isRunning()) { + m_shuttleProcess.terminate(); + kDebug() << "/// terminate jogshuttle process\n"; + } + } } void JogShuttle::customEvent(QEvent* e) diff --git a/src/jogshuttle.h b/src/jogshuttle.h index 34673fa6..9a6ecc02 100644 --- a/src/jogshuttle.h +++ b/src/jogshuttle.h @@ -40,7 +40,7 @@ public: int shuttlecounter; unsigned short jogvalue; bool isWorking(); - bool stop_me; + volatile bool stop_me; QString m_device; private: diff --git a/src/kdenlivesettingsdialog.cpp b/src/kdenlivesettingsdialog.cpp index 58d71376..c42b1d79 100644 --- a/src/kdenlivesettingsdialog.cpp +++ b/src/kdenlivesettingsdialog.cpp @@ -137,11 +137,22 @@ KdenliveSettingsDialog::KdenliveSettingsDialog(const QMap& map m_configShuttle.shuttledisabled->hide(); // Store the button pointers into an array for easier handling them in the other functions. + // TODO: impl enumerator or live with cut and paste :-))) m_shuttle_buttons.push_back(m_configShuttle.shuttle1); m_shuttle_buttons.push_back(m_configShuttle.shuttle2); m_shuttle_buttons.push_back(m_configShuttle.shuttle3); m_shuttle_buttons.push_back(m_configShuttle.shuttle4); m_shuttle_buttons.push_back(m_configShuttle.shuttle5); + m_shuttle_buttons.push_back(m_configShuttle.shuttle6); + m_shuttle_buttons.push_back(m_configShuttle.shuttle7); + m_shuttle_buttons.push_back(m_configShuttle.shuttle8); + m_shuttle_buttons.push_back(m_configShuttle.shuttle9); + m_shuttle_buttons.push_back(m_configShuttle.shuttle10); + m_shuttle_buttons.push_back(m_configShuttle.shuttle11); + m_shuttle_buttons.push_back(m_configShuttle.shuttle12); + m_shuttle_buttons.push_back(m_configShuttle.shuttle13); + m_shuttle_buttons.push_back(m_configShuttle.shuttle14); + m_shuttle_buttons.push_back(m_configShuttle.shuttle15); // populate the buttons with the current configuration. The items are sorted // according to the user-selected language, so they do not appear in random order. diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 6e77fdba..0a249188 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -676,6 +676,12 @@ MainWindow::~MainWindow() if (m_stopmotion) { delete m_stopmotion; } + +#ifdef USE_JOGSHUTTLE + if (m_jogProcess) + delete m_jogProcess; +#endif + m_effectStack->slotClipItemSelected(NULL); m_transitionConfig->slotTransitionItemSelected(NULL, 0, QPoint(), false); diff --git a/src/widgets/configjogshuttle_ui.ui b/src/widgets/configjogshuttle_ui.ui index 455a3b17..2b69f8c8 100644 --- a/src/widgets/configjogshuttle_ui.ui +++ b/src/widgets/configjogshuttle_ui.ui @@ -6,8 +6,8 @@ 0 0 - 287 - 253 + 299 + 548 @@ -40,6 +40,62 @@ Device configuration + + + + Button 12 + + + + + + + Button 14 + + + + + + + Button 13 + + + + + + + Button 11 + + + + + + + Button 7 + + + + + + + Button 8 + + + + + + + Button 9 + + + + + + + Button 6 + + + @@ -60,7 +116,7 @@ - Button 1 + Button 1 @@ -70,7 +126,7 @@ - Button 2 + Button 2 @@ -80,33 +136,77 @@ - Button 3 + Button 3 + + + - Button 4 + Button 4 - - - - Button 5 + Button 5 + + + + Button 10 + + + + + + + + + + + + + + + + + + + + + + Button 15 + + + + + + + + + + + + + + + + + + @@ -126,16 +226,16 @@ - - KLineEdit - QLineEdit -
klineedit.h
-
KComboBox QComboBox
kcombobox.h
+ + KLineEdit + QLineEdit +
klineedit.h
+