From e4d9172d6e1e636fd61e1484f858cb4010380b50 Mon Sep 17 00:00:00 2001 From: John Poet Date: Tue, 12 May 2020 18:51:52 -0600 Subject: [PATCH] mythexternrecorder: Add ondatastart command option The config file can now specify a command to run as soon as data is detected from the 'external' application. --- .../mythexternrecorder/MythExternControl.cpp | 7 ++++ .../mythexternrecorder/MythExternControl.h | 2 ++ .../mythexternrecorder/MythExternRecApp.cpp | 32 +++++++++++++++++++ .../mythexternrecorder/MythExternRecApp.h | 2 ++ mythtv/programs/mythexternrecorder/main.cpp | 2 ++ 5 files changed, 45 insertions(+) diff --git a/mythtv/programs/mythexternrecorder/MythExternControl.cpp b/mythtv/programs/mythexternrecorder/MythExternControl.cpp index 258dc64dc57..a29efa17a99 100644 --- a/mythtv/programs/mythexternrecorder/MythExternControl.cpp +++ b/mythtv/programs/mythexternrecorder/MythExternControl.cpp @@ -513,6 +513,13 @@ bool Buffer::Fill(const QByteArray & buffer) static int s_droppedBytes = 0; m_parent->m_flow_mutex.lock(); + + if (!m_dataSeen) + { + m_dataSeen = true; + emit m_parent->DataStarted(); + } + if (m_data.size() < MAX_QUEUE) { block_t blk(reinterpret_cast(buffer.constData()), diff --git a/mythtv/programs/mythexternrecorder/MythExternControl.h b/mythtv/programs/mythexternrecorder/MythExternControl.h index 988fea9e8db..29c21204376 100644 --- a/mythtv/programs/mythexternrecorder/MythExternControl.h +++ b/mythtv/programs/mythexternrecorder/MythExternControl.h @@ -66,6 +66,7 @@ class Buffer : QObject std::thread m_thread; stack_t m_data; + bool m_dataSeen {false}; std::chrono::time_point m_heartbeat; }; @@ -152,6 +153,7 @@ class MythExternControl : public QObject void FirstChannel(const QString & serial); void NextChannel(const QString & serial); void Cleanup(void); + void DataStarted(void); public slots: void SetDescription(const QString & desc) { m_desc = desc; } diff --git a/mythtv/programs/mythexternrecorder/MythExternRecApp.cpp b/mythtv/programs/mythexternrecorder/MythExternRecApp.cpp index 80abd60ee02..5720eddb47e 100644 --- a/mythtv/programs/mythexternrecorder/MythExternRecApp.cpp +++ b/mythtv/programs/mythexternrecorder/MythExternRecApp.cpp @@ -87,6 +87,7 @@ bool MythExternRecApp::config(void) m_recDesc = settings.value("RECORDER/desc").toString(); m_cleanup = settings.value("RECORDER/cleanup").toString(); m_tuneCommand = settings.value("TUNER/command", "").toString(); + m_onDataStart = settings.value("TUNER/ondatastart", "").toString(); m_channelsIni = settings.value("TUNER/channels", "").toString(); m_lockTimeout = settings.value("TUNER/timeout", "").toInt(); m_scanCommand = settings.value("SCANNER/command", "").toString(); @@ -295,6 +296,37 @@ Q_SLOT void MythExternRecApp::Cleanup(void) LOG(VB_RECORD, LOG_INFO, LOC + ": Cleanup finished."); } +Q_SLOT void MythExternRecApp::DataStarted(void) +{ + if (m_onDataStart.isEmpty()) + return; + + QString cmd = m_onDataStart; + + LOG(VB_RECORD, LOG_INFO, LOC + + QString(" Data started, finishing tune: '%1'").arg(cmd)); + + QProcess finish; + finish.start(cmd); + if (!finish.waitForStarted()) + { + LOG(VB_RECORD, LOG_ERR, LOC + ": Failed to finish tune process: " + + ENO); + return; + } + finish.waitForFinished(5000); + if (finish.state() == QProcess::NotRunning) + { + if (finish.exitStatus() != QProcess::NormalExit) + { + LOG(VB_RECORD, LOG_ERR, LOC + ": Finish tune failed: " + ENO); + return; + } + } + + LOG(VB_RECORD, LOG_INFO, LOC + ": tunning finished."); +} + Q_SLOT void MythExternRecApp::LoadChannels(const QString & serial) { if (m_channelsIni.isEmpty()) diff --git a/mythtv/programs/mythexternrecorder/MythExternRecApp.h b/mythtv/programs/mythexternrecorder/MythExternRecApp.h index b0d7585d442..35e3e4e6785 100644 --- a/mythtv/programs/mythexternrecorder/MythExternRecApp.h +++ b/mythtv/programs/mythexternrecorder/MythExternRecApp.h @@ -70,6 +70,7 @@ class MythExternRecApp : public QObject void LockTimeout(const QString & serial); void HasTuner(const QString & serial); void Cleanup(void); + void DataStarted(void); void LoadChannels(const QString & serial); void FirstChannel(const QString & serial); void NextChannel(const QString & serial); @@ -108,6 +109,7 @@ class MythExternRecApp : public QObject QProcess m_tuneProc; QString m_tuneCommand; + QString m_onDataStart; QString m_channelsIni; uint m_lockTimeout { 0 }; diff --git a/mythtv/programs/mythexternrecorder/main.cpp b/mythtv/programs/mythexternrecorder/main.cpp index c492cefda49..65efa456476 100644 --- a/mythtv/programs/mythexternrecorder/main.cpp +++ b/mythtv/programs/mythexternrecorder/main.cpp @@ -116,6 +116,8 @@ int main(int argc, char *argv[]) process, &MythExternRecApp::HasTuner); QObject::connect(control, &MythExternControl::Cleanup, process, &MythExternRecApp::Cleanup); + QObject::connect(control, &MythExternControl::DataStarted, + process, &MythExternRecApp::DataStarted); QObject::connect(control, &MythExternControl::LoadChannels, process, &MythExternRecApp::LoadChannels); QObject::connect(control, &MythExternControl::FirstChannel,