Recorder support for session cut
This commit is contained in:
parent
d5c754b580
commit
376ce88f76
2 changed files with 68 additions and 25 deletions
|
@ -322,13 +322,12 @@ void CJamRecorder::Init( const CServer* server,
|
|||
this, SLOT( OnDisconnected ( int ) ),
|
||||
Qt::ConnectionType::QueuedConnection );
|
||||
|
||||
qRegisterMetaType<CVector<int16_t>>();
|
||||
qRegisterMetaType<CVector<int16_t>> ( "CVector<int16_t>" );
|
||||
QObject::connect( (const QObject *)server, SIGNAL ( AudioFrame( const int, const QString, const CHostAddress, const int, const CVector<int16_t> ) ),
|
||||
this, SLOT( OnFrame (const int, const QString, const CHostAddress, const int, const CVector<int16_t> ) ),
|
||||
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 );
|
||||
|
|
|
@ -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<int16_t> data );
|
||||
|
||||
private:
|
||||
QDir recordBaseDir;
|
||||
|
||||
bool isRecording;
|
||||
CJamSession* currentSession;
|
||||
int iServerFrameSizeSamples;
|
||||
|
||||
QThread* thisThread;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue