From 376ce88f76a4c3253951a8132e2f9246b0375d3a Mon Sep 17 00:00:00 2001 From: Peter L Jones Date: Fri, 15 May 2020 19:50:41 +0100 Subject: [PATCH] Recorder support for session cut --- src/recorder/jamrecorder.cpp | 51 ++++++++++++++++++++++++++++-------- src/recorder/jamrecorder.h | 42 +++++++++++++++++++---------- 2 files changed, 68 insertions(+), 25 deletions(-) diff --git a/src/recorder/jamrecorder.cpp b/src/recorder/jamrecorder.cpp index 2c817919..7719bd6d 100755 --- a/src/recorder/jamrecorder.cpp +++ b/src/recorder/jamrecorder.cpp @@ -322,13 +322,12 @@ void CJamRecorder::Init( const CServer* server, this, SLOT( OnDisconnected ( int ) ), Qt::ConnectionType::QueuedConnection ); - qRegisterMetaType>(); + qRegisterMetaType> ( "CVector" ); QObject::connect( (const QObject *)server, SIGNAL ( AudioFrame( const int, const QString, const CHostAddress, const int, const CVector ) ), this, SLOT( OnFrame (const int, const QString, const CHostAddress, const int, const CVector ) ), Qt::ConnectionType::QueuedConnection ); - QObject::connect( QCoreApplication::instance(), - SIGNAL ( aboutToQuit() ), + QObject::connect( QCoreApplication::instance(), SIGNAL ( aboutToQuit() ), this, SLOT( OnAboutToQuit() ) ); iServerFrameSizeSamples = _iServerFrameSizeSamples; @@ -338,11 +337,10 @@ void CJamRecorder::Init( const CServer* server, thisThread->start(); } - /** - * @brief CJamRecorder::OnStart Start up tasks when the first client connects + * @brief CJamRecorder::Start Start up tasks for a new session */ -void CJamRecorder::OnStart() { +void CJamRecorder::Start() { // Ensure any previous cleaning up has been done. OnEnd(); @@ -350,11 +348,17 @@ void CJamRecorder::OnStart() { isRecording = true; } + /** * @brief CJamRecorder::OnEnd Finalise the recording and emit the Reaper RPP file + * + * Emits RecordingSessionEnded with the Reaper project file name, + * or null if was not recording or a problem occurs */ void CJamRecorder::OnEnd() { + QString reaperProjectFileName = QString::Null(); + if ( isRecording ) { isRecording = false; @@ -366,21 +370,46 @@ void CJamRecorder::OnEnd() if (fi.exists()) { qWarning() << "CJamRecorder::OnEnd():" << fi.absolutePath() << "exists and will not be overwritten."; + reaperProjectFileName = QString::Null(); } else { QFile outf (reaperProjectFileName); - outf.open(QFile::WriteOnly); - QTextStream out(&outf); - out << CReaperProject( currentSession->Tracks(), iServerFrameSizeSamples ).toString() << endl; - qDebug() << "Session RPP:" << reaperProjectFileName; + if ( outf.open(QFile::WriteOnly) ) + { + QTextStream out(&outf); + out << CReaperProject( currentSession->Tracks(), iServerFrameSizeSamples ).toString() << endl; + qDebug() << "Session RPP:" << reaperProjectFileName; + } + else + { + qWarning() << "CJamRecorder::OnEnd():" << fi.absolutePath() << "could not be created, no RPP written."; + reaperProjectFileName = QString::Null(); + } } delete currentSession; currentSession = nullptr; } + + emit RecordingSessionEnded ( reaperProjectFileName ); } +/** + * @brief CJamRecorder::OnTriggerSession End one session and start a new one + */ +void CJamRecorder::OnTriggerSession() +{ + // This should magically get everything right... + if ( isRecording ) + { + Start(); + } +} + +/** + * @brief CJamRecorder::OnAboutToQuit End any recording and exit thread + */ void CJamRecorder::OnAboutToQuit() { OnEnd(); @@ -452,7 +481,7 @@ void CJamRecorder::OnFrame(const int iChID, const QString name, const CHostAddre // Make sure we are ready if ( !isRecording ) { - OnStart(); + Start(); } currentSession->Frame( iChID, name, address, numAudioChannels, data, iServerFrameSizeSamples ); diff --git a/src/recorder/jamrecorder.h b/src/recorder/jamrecorder.h index eb5a0581..2bc128db 100755 --- a/src/recorder/jamrecorder.h +++ b/src/recorder/jamrecorder.h @@ -143,21 +143,44 @@ public: { } + /** + * @brief Create recording directory, if necessary, and connect signal handlers + * @param server Server object emiting signals + */ void Init( const CServer* server, const int _iServerFrameSizeSamples ); + /** + * @brief SessionDirToReaper Method that allows an RPP file to be recreated + * @param strSessionDirName Where the session wave files are + * @param serverFrameSizeSamples What the server frame size was for the session + */ static void SessionDirToReaper( QString& strSessionDirName, int serverFrameSizeSamples ); -public slots: - /** - * @brief Raised when first client joins the server, triggering a new recording. - */ - void OnStart(); +private: + void Start(); + QDir recordBaseDir; + + bool isRecording; + CJamSession* currentSession; + int iServerFrameSizeSamples; + + QThread* thisThread; + +signals: + void RecordingSessionEnded ( QString sessionDir ); + +private slots: /** * @brief Raised when last client leaves the server, ending the recording. */ void OnEnd(); + /** + * @brief Raised to end one session and start a new one. + */ + void OnTriggerSession(); + /** * @brief Raised when application is stopping */ @@ -173,15 +196,6 @@ public slots: * @brief Raised when a frame of data is available to process */ void OnFrame ( const int iChID, const QString name, const CHostAddress address, const int numAudioChannels, const CVector data ); - -private: - QDir recordBaseDir; - - bool isRecording; - CJamSession* currentSession; - int iServerFrameSizeSamples; - - QThread* thisThread; }; }