@@ -110,8 +110,124 @@ void RecordControl::handleEvent(int eventType, MidiMessage& event, int)
110110 {
111111 CoreServices::setRecordingStatus (!CoreServices::getRecordingStatus ());
112112 }
113+ }
114+ else if (eventType == MESSAGE)
115+ {
116+ handleNetworkEvent (event);
117+ }
118+
119+ }
120+
121+ void RecordControl::handleNetworkEvent (MidiMessage& event)
122+ {
123+ /* * Extract network message from midi event */
124+ const uint8* dataptr = event.getRawData ();
125+ int bufferSize = event.getRawDataSize ();
126+ int len = bufferSize - 6 ; // 6 for initial event prefix
127+ String msg = String ((const char *)(dataptr + 6 ), len);
128+
129+ /* * Command is first substring */
130+ StringArray inputs = StringArray::fromTokens (msg, " " );
131+ String cmd = String (inputs[0 ]);
113132
133+ const MessageManagerLock mmLock;
114134
135+ if (String (" StartRecord" ).compareIgnoreCase (cmd) == 0 )
136+ {
137+ if (!CoreServices::getRecordingStatus ())
138+ {
139+ /* * First set optional parameters (name/value pairs)*/
140+ if (msg.contains (" =" ))
141+ {
142+ String s = msg.substring (cmd.length ());
143+ StringPairArray dict = parseNetworkMessage (s);
144+
145+ StringArray keys = dict.getAllKeys ();
146+ for (int i=0 ; i<keys.size (); i++)
147+ {
148+ String key = keys[i];
149+ String value = dict[key];
150+
151+ if (key.compareIgnoreCase (" CreateNewDir" ) == 0 )
152+ {
153+ if (value.compareIgnoreCase (" 1" ) == 0 )
154+ {
155+ CoreServices::createNewRecordingDir ();
156+ }
157+ }
158+ else if (key.compareIgnoreCase (" RecDir" ) == 0 )
159+ {
160+ CoreServices::setRecordingDirectory (value);
161+ }
162+ else if (key.compareIgnoreCase (" PrependText" ) == 0 )
163+ {
164+ CoreServices::setPrependTextToRecordingDir (value);
165+ }
166+ else if (key.compareIgnoreCase (" AppendText" ) == 0 )
167+ {
168+ CoreServices::setAppendTextToRecordingDir (value);
169+ }
170+ }
171+ }
172+
173+ /* * Start recording */
174+ CoreServices::setRecordingStatus (true );
175+ }
115176 }
177+ else if (String (" StopRecord" ).compareIgnoreCase (cmd) == 0 )
178+ {
179+ if (CoreServices::getRecordingStatus ())
180+ {
181+ CoreServices::setRecordingStatus (false );
182+ }
183+ }
184+ }
185+
186+ StringPairArray RecordControl::parseNetworkMessage (String msg)
187+ {
188+ StringArray splitted;
189+ splitted.addTokens (msg, " =" , " " );
190+
191+ StringPairArray dict = StringPairArray ();
192+ String key = " " ;
193+ String value = " " ;
194+ for (int i=0 ; i<splitted.size ()-1 ; i++)
195+ {
196+ String s1 = splitted[i];
197+ String s2 = splitted[i+1 ];
198+
199+ /* * Get key */
200+ if (!key.isEmpty ())
201+ {
202+ if (s1.contains (" " ))
203+ {
204+ int i1 = s1.lastIndexOf (" " );
205+ key = s1.substring (i1+1 );
206+ }
207+ else
208+ {
209+ key = s1;
210+ }
211+ }
212+ else
213+ {
214+ key = s1.trim ();
215+ }
216+
217+ /* * Get value */
218+ if (i < splitted.size () - 2 )
219+ {
220+ int i1 = s2.lastIndexOf (" " );
221+ value = s2.substring (0 , i1);
222+ }
223+ else
224+ {
225+ value = s2;
226+ }
227+
228+ dict.set (key, value);
229+ }
230+
231+ return dict;
232+ }
116233
117- }
0 commit comments