1010using namespace std ::chrono;
1111
1212#define CONTINUOUS_CHANNELS_ON_BY_DEFAULT true
13+ #define RECEIVED_SOFTWARE_TIME (event.getVelocity() == 136 )
1314
1415EventMonitor::EventMonitor ()
1516 : receivedEvents(0 ) {}
@@ -37,7 +38,8 @@ RecordNode::RecordNode()
3738 recordingNumber(0 ),
3839 isRecording(false ),
3940 hasRecorded(false ),
40- settingsNeeded(false )
41+ settingsNeeded(false ),
42+ receivedSoftwareTime(false )
4143{
4244 setProcessorType (PROCESSOR_TYPE_RECORD_NODE);
4345
@@ -66,6 +68,45 @@ RecordNode::~RecordNode()
6668{
6769}
6870
71+ void RecordNode::addInputChannel (const GenericProcessor* sourceNode, int chan)
72+ {
73+
74+ if (chan != AccessClass::getProcessorGraph ()->midiChannelIndex )
75+ {
76+ int channelIndex = getNextChannel (false );
77+
78+ const DataChannel* orig = sourceNode->getDataChannel (chan);
79+ DataChannel* newChannel = new DataChannel (*orig);
80+ newChannel->setRecordState (orig->getRecordState ());
81+ dataChannelArray.add (newChannel);
82+ recordEngine->addDataChannel (channelIndex, dataChannelArray[channelIndex]);
83+
84+ }
85+ else
86+ {
87+
88+ for (int n = 0 ; n < sourceNode->getTotalEventChannels (); n++)
89+ {
90+ const EventChannel* orig = sourceNode->getEventChannel (n);
91+ // only add to the record node the events originating from this processor, to avoid duplicates
92+ if (orig->getSourceNodeID () == sourceNode->getNodeId ())
93+ eventChannelArray.add (new EventChannel (*orig));
94+
95+ }
96+
97+ }
98+
99+ }
100+
101+ void RecordNode::addSpecialProcessorChannels (Array<EventChannel*>& channels)
102+ {
103+
104+ eventChannelArray.addArray (channels);
105+ settings.numInputs = dataChannelArray.size ();
106+ setPlayConfigDetails (getNumInputs (), getNumOutputs (), 44100.0 , 1024 );
107+
108+ }
109+
69110void RecordNode::setEngine (int index)
70111{
71112 availableEngines = getAvailableRecordEngines ();
@@ -213,6 +254,12 @@ void RecordNode::setParameter(int parameterIndex, float newValue)
213254
214255}
215256
257+ void RecordNode::updateRecordChannelIndexes ()
258+ {
259+ // Keep the nodeIDs of the original processor from each channel comes from
260+ updateChannelIndexes (false );
261+ }
262+
216263void RecordNode::updateChannelStates (int srcIndex, int subProcIdx, std::vector<bool > channelStates)
217264{
218265 this ->dataChannelStates [srcIndex][subProcIdx] = channelStates;
@@ -255,6 +302,8 @@ void RecordNode::updateSubprocessorMap()
255302 ch++;
256303 }
257304 ch--;
305+
306+ fifoUsage[sourceID][subProcID] = 0 .0f ;
258307 }
259308
260309 }
@@ -274,7 +323,7 @@ void RecordNode::updateSubprocessorMap()
274323 }
275324 }
276325
277- eventChannelMap .clear ();
326+ eventMap .clear ();
278327 syncChannelMap.clear ();
279328 syncOrderMap.clear ();
280329 for (int ch = 0 ; ch < eventChannelArray.size (); ch++)
@@ -284,12 +333,10 @@ void RecordNode::updateSubprocessorMap()
284333 int sourceID = chan->getSourceNodeID ();
285334 int subProcID = chan->getSubProcessorIdx ();
286335
287- int chCount = 0 ;
336+ eventMap[sourceID][subProcID] = chan-> getNumChannels () ;
288337
289- if (!syncChannelMap[sourceID][subProcID])
338+ if (dataChannelStates[sourceID][subProcID]. size () && !syncChannelMap[sourceID][subProcID])
290339 {
291- EventChannel* chan = eventChannelArray[ch];
292- eventChannelMap[sourceID][subProcID] = chan->getNumChannels ();
293340 syncOrderMap[sourceID][subProcID] = ch;
294341 syncChannelMap[sourceID][subProcID] = 0 ;
295342 synchronizer->setSyncChannel (chan->getSourceNodeID (), chan->getSubProcessorIdx (), ch);
@@ -311,7 +358,6 @@ void RecordNode::setMasterSubprocessor(int srcIndex, int subProcIdx)
311358
312359void RecordNode::setSyncChannel (int srcIndex, int subProcIdx, int channel)
313360{
314- // eventChannelMap[srcIndex][subProcIdx];
315361 syncChannelMap[srcIndex][subProcIdx] = channel;
316362 synchronizer->setSyncChannel (srcIndex, subProcIdx, syncOrderMap[srcIndex][subProcIdx]+channel);
317363}
@@ -330,11 +376,7 @@ bool RecordNode::isMasterSubprocessor(int srcIndex, int subProcIdx)
330376void RecordNode::updateSettings ()
331377{
332378
333- if (dataChannelArray.size () != lastDataChannelArraySize)
334- {
335- lastDataChannelArraySize = dataChannelArray.size ();
336- updateSubprocessorMap ();
337- }
379+ updateSubprocessorMap ();
338380
339381}
340382
@@ -373,7 +415,7 @@ void RecordNode::startRecording()
373415
374416 int recordedProcessorIdx = -1 ;
375417
376- LOGD (" Record Node " , getNodeId (), " : Total channels: " , totChans);
418+ // LOGD("Record Node ", getNodeId(), ": Total channels: ", totChans, " Total event channels: ", getTotalEventChannels() );
377419
378420 for (int ch = 0 ; ch < totChans; ++ch)
379421 {
@@ -506,15 +548,15 @@ void RecordNode::handleEvent(const EventChannel* eventInfo, const MidiMessage& e
506548 int64 timestamp = Event::getTimestamp (event);
507549 uint64 eventChan = event.getChannel ();
508550 int eventIndex;
509- if (eventInfo && samplePosition > 0 )
510- {
551+ if (eventInfo)
511552 eventIndex = getEventChannelIndex (Event::getSourceIndex (event), Event::getSourceID (event), Event::getSubProcessorIdx (event));
512- synchronizer->addEvent (Event::getSourceID (event), Event::getSubProcessorIdx (event), eventIndex, timestamp);
513- }
514553 else
515554 eventIndex = -1 ;
516555
517- if (isRecording && eventIndex >= 0 )
556+ if (samplePosition > 0 && dataChannelStates[Event::getSourceID (event)][Event::getSubProcessorIdx (event)].size ())
557+ synchronizer->addEvent (Event::getSourceID (event), Event::getSubProcessorIdx (event), eventIndex, timestamp);
558+
559+ if (isRecording)
518560 eventQueue->addEvent (event, timestamp, eventIndex);
519561
520562 }
@@ -541,7 +583,20 @@ void RecordNode::handleSpike(const SpikeChannel* spikeInfo, const MidiMessage& e
541583
542584void RecordNode::handleTimestampSyncTexts (const MidiMessage& event)
543585{
544- handleEvent (nullptr , event, 0 );
586+
587+ if (event.getVelocity () == 136 )
588+ {
589+ if (!receivedSoftwareTime)
590+ {
591+ handleEvent (nullptr , event, 0 );
592+ receivedSoftwareTime = true ;
593+ }
594+ }
595+ else
596+ {
597+ handleEvent (nullptr , event, 0 );
598+ }
599+
545600}
546601
547602void RecordNode::process (AudioSampleBuffer& buffer)
@@ -589,7 +644,7 @@ void RecordNode::process(AudioSampleBuffer& buffer)
589644 {
590645 double first = synchronizer->convertTimestamp (sourceID, subProcIdx, timestamp);
591646 double second = synchronizer->convertTimestamp (sourceID, subProcIdx, timestamp + 1 );
592- dataQueue->writeSynchronizedTimestampChannel (first, second - first, ftsChannelMap[ch], numSamples);
647+ fifoUsage[sourceID][subProcIdx] = dataQueue->writeSynchronizedTimestampChannel (first, second - first, ftsChannelMap[ch], numSamples);
593648 }
594649
595650 dataQueue->writeChannel (buffer, channelMap[ch], ch, numSamples, timestamp);
@@ -626,13 +681,10 @@ bool RecordNode::isFirstChannelInRecordedSubprocessor(int ch)
626681 return std::find (startRecChannels.begin (), startRecChannels.end (), ch) != startRecChannels.end ();
627682}
628683
629- // TODO: Need to validate these methods
630-
631684void RecordNode::registerProcessor (const GenericProcessor* sourceNode)
632685{
633686 settings.numInputs += sourceNode->getNumOutputs ();
634687 setPlayConfigDetails (getNumInputs (), getNumOutputs (), 44100.0 , 128 );
635-
636688 recordEngine->registerProcessor (sourceNode);
637689}
638690
0 commit comments