diff --git a/Source/Processors/RecordNode/BinaryFormat/BinaryRecording.cpp b/Source/Processors/RecordNode/BinaryFormat/BinaryRecording.cpp index 7c6072093..51975d0c7 100644 --- a/Source/Processors/RecordNode/BinaryFormat/BinaryRecording.cpp +++ b/Source/Processors/RecordNode/BinaryFormat/BinaryRecording.cpp @@ -672,7 +672,7 @@ void BinaryRecording::writeSpike (int electrodeIndex, const Spike* spike) increaseEventCounts (rec); } -void BinaryRecording::writeTimestampSyncText (uint64 streamId, int64 sampleNumber, float sourceSampleRate, String text) +void BinaryRecording::writeTimestampSyncText(DataStream* stream, int64 sampleNumber, double timestamp, String text) { if (! m_syncTextFile) return; @@ -680,11 +680,10 @@ void BinaryRecording::writeTimestampSyncText (uint64 streamId, int64 sampleNumbe String syncString = text + ": " + String (sampleNumber); LOGD (syncString); - int64 fsn = firstSampleNumber[streamId]; - - if(streamId > 0) + if(stream != nullptr){ + int64 fsn = firstSampleNumber[stream->getStreamId()]; jassert (fsn == sampleNumber); - + } m_syncTextFile->writeText (syncString + "\r\n", false, false, nullptr); m_syncTextFile->flush(); diff --git a/Source/Processors/RecordNode/BinaryFormat/BinaryRecording.h b/Source/Processors/RecordNode/BinaryFormat/BinaryRecording.h index a604dcd73..27c8dd29f 100644 --- a/Source/Processors/RecordNode/BinaryFormat/BinaryRecording.h +++ b/Source/Processors/RecordNode/BinaryFormat/BinaryRecording.h @@ -69,7 +69,7 @@ class BinaryRecording : public RecordEngine void writeSpike (int electrodeIndex, const Spike* spike); /** Writes timestamp sync texts */ - void writeTimestampSyncText (uint64 streamId, int64 sampleNumber, float sampleRate, String text); + void writeTimestampSyncText (DataStream* stream, int64 sampleNumber, double timestamp, String text); /** Sets an engine parameter (in this case TTL word writing bool) */ void setParameter (EngineParameter& parameter); diff --git a/Source/Processors/RecordNode/RecordEngine.cpp b/Source/Processors/RecordNode/RecordEngine.cpp index 73b359546..6ec28e5c6 100644 --- a/Source/Processors/RecordNode/RecordEngine.cpp +++ b/Source/Processors/RecordNode/RecordEngine.cpp @@ -111,6 +111,11 @@ int RecordEngine::getLocalIndex (int channel) const return localChannelMap[channel]; } +Array RecordEngine::getDataStreams() const +{ + return recordNode->getDataStreams(); +} + int RecordEngine::getNumRecordedDataStreams() const { return recordNode->getTotalRecordedStreams(); diff --git a/Source/Processors/RecordNode/RecordEngine.h b/Source/Processors/RecordNode/RecordEngine.h index 217337441..853f1446e 100644 --- a/Source/Processors/RecordNode/RecordEngine.h +++ b/Source/Processors/RecordNode/RecordEngine.h @@ -104,8 +104,8 @@ class PLUGIN_API RecordEngine /** Write a spike to disk */ virtual void writeSpike (int electrodeIndex, const Spike* spike) = 0; - /** Handle the timestamp sync text messages*/ - virtual void writeTimestampSyncText (uint64 streamId, int64 timestamp, float sourceSampleRate, String text) = 0; + /** Handle the timestamp sync text messages. */ + virtual void writeTimestampSyncText (DataStream* stream, int64 sampleNumber, double timestamp, String text) = 0; // ------------------------------------------------------------ // VIRTUAL METHODS @@ -145,6 +145,9 @@ class PLUGIN_API RecordEngine /** Gets the number of recorded data streams */ int getNumRecordedDataStreams() const; + /** Gets all the data streams, regardless of whether they have any recordable channels */ + Array getDataStreams() const; + /** Gets the number of recorded continuous channels */ int getNumRecordedContinuousChannels() const; diff --git a/Source/Processors/RecordNode/RecordThread.cpp b/Source/Processors/RecordNode/RecordThread.cpp index ff0ac5b93..7ed762238 100644 --- a/Source/Processors/RecordNode/RecordThread.cpp +++ b/Source/Processors/RecordNode/RecordThread.cpp @@ -240,7 +240,19 @@ void RecordThread::writeData (const AudioBuffer& dataBuffer, if (SystemEvent::getBaseType (event) == EventBase::Type::SYSTEM_EVENT) { String syncText = SystemEvent::getSyncText (event); - m_engine->writeTimestampSyncText (SystemEvent::getStreamId (event), SystemEvent::getSampleNumber (event), 0.0f, SystemEvent::getSyncText (event)); + auto streamId = SystemEvent::getStreamId (event); + DataStream* stream = recordNode->getDataStream(streamId); + int64 sampleNumber = SystemEvent::getSampleNumber (event); + + double timestamp; + if (stream == nullptr){ + timestamp = 0; + } else if(recordNode->synchronizer.streamGeneratesTimestamps (stream->getKey())){ + timestamp = static_cast(sampleNumber) / stream->getSampleRate(); + } else { + timestamp = recordNode->synchronizer.convertSampleNumberToTimestamp (stream->getKey(), sampleNumber); + } + m_engine->writeTimestampSyncText (stream, sampleNumber, timestamp, SystemEvent::getSyncText (event)); } else {