changeset 13:c0c62ccf4bfd

Enable virtual MIDI output ports
author Andrew McPherson <andrewm@eecs.qmul.ac.uk>
date Sat, 23 Nov 2013 17:47:29 +0000
parents 73703cb77094
children a84edec23a0c
files Builds/MacOSX/TouchKeys.xcodeproj/project.xcworkspace/xcuserdata/apm.xcuserdatad/UserInterfaceState.xcuserstate Source/MainApplicationController.cpp Source/MainApplicationController.h Source/TouchKeys/MidiOutputController.cpp Source/TouchKeys/TouchkeyEntropyGenerator.cpp
diffstat 5 files changed, 30 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
Binary file Builds/MacOSX/TouchKeys.xcodeproj/project.xcworkspace/xcuserdata/apm.xcuserdatad/UserInterfaceState.xcuserstate has changed
--- a/Source/MainApplicationController.cpp	Sat Nov 23 15:13:27 2013 +0000
+++ b/Source/MainApplicationController.cpp	Sat Nov 23 17:47:29 2013 +0000
@@ -298,6 +298,19 @@
     return newSegment;
 }
 
+// Remove a MIDI keyboard segment.
+void MainApplicationController::midiSegmentRemove(MidiKeyboardSegment *segment) {
+    if(segment == 0)
+        return;
+    // Check if this segment uses a virtual output port. Right now, we have a unique
+    // output per segment. If it does, then disable the virtual output port.
+    int identifier = segment->outputPort();
+    if(midiOutputController_.enabledPort(identifier) == MidiOutputController::kMidiVirtualOutputPortNumber)
+        midiOutputController_.disablePort(identifier);
+    midiInputController_.removeSegment(segment);
+}
+
+
 // Enable TouchKeys standalone mode
 void MainApplicationController::midiTouchkeysStandaloneModeEnable() {
     touchkeyStandaloneModeEnabled_ = true;
--- a/Source/MainApplicationController.h	Sat Nov 23 15:13:27 2013 +0000
+++ b/Source/MainApplicationController.h	Sat Nov 23 17:47:29 2013 +0000
@@ -162,9 +162,7 @@
     // stored 
     MidiKeyboardSegment* midiSegmentAdd();
     // Remove a segment
-    void midiSegmentRemove(MidiKeyboardSegment *segment) {
-        midiInputController_.removeSegment(segment);
-    }
+    void midiSegmentRemove(MidiKeyboardSegment *segment);
 
     // Select MIDI input/output devices
     void enableMIDIInputPort(int portNumber) {
--- a/Source/TouchKeys/MidiOutputController.cpp	Sat Nov 23 15:13:27 2013 +0000
+++ b/Source/TouchKeys/MidiOutputController.cpp	Sat Nov 23 17:47:29 2013 +0000
@@ -77,24 +77,30 @@
     record.portNumber = deviceNumber;
     record.output = device;
     
-    activePorts_[identifier] = record;//{deviceNumber, device};
+    activePorts_[identifier] = record;
     
 	return true;
 }
 
 bool MidiOutputController::enableVirtualPort(int identifier, const char *name) {
-    /*
+    // Check if there is a port for this identifier, and disable it if so
+    if(activePorts_.count(identifier) > 0)
+        disablePort(identifier);
+    
     // Try to create a new port
-    MidiOutput* device = MidiOutput::createNewDevice(kMidiVirtualOutputName);
-    if(device == 0)
+    MidiOutput* device = MidiOutput::createNewDevice(name);
+    if(device == 0) {
+        cout << "Failed to enable MIDI virtual output port " << name << ")\n";
         return false;
+    }
     
-    midiOut_ = device;
-    portNumber_ = kMidiVirtualOutputPortNumber;
+    MidiOutputControllerRecord record;
+    record.portNumber = kMidiVirtualOutputPortNumber;
+    record.output = device;
+    
+    activePorts_[identifier] = record;
     
 	return true;
-    */
-    return 0; // TODO: implement me
 }
 
 void MidiOutputController::disablePort(int identifier) {
--- a/Source/TouchKeys/TouchkeyEntropyGenerator.cpp	Sat Nov 23 15:13:27 2013 +0000
+++ b/Source/TouchKeys/TouchkeyEntropyGenerator.cpp	Sat Nov 23 17:47:29 2013 +0000
@@ -21,6 +21,7 @@
 */
 
 #include "TouchkeyEntropyGenerator.h"
+#include <cstdlib>
 
 TouchkeyEntropyGenerator::TouchkeyEntropyGenerator(PianoKeyboard& keyboard)
 : Thread("TouchkeyEntropyGenerator"), keyboard_(keyboard),
@@ -28,7 +29,7 @@
   keyboardRangeLow_(36), keyboardRangeHigh_(60),
   dataInterval_(milliseconds_to_timestamp(5.0))
 {
-    sranddev();
+    srand(time(NULL));
 }
 
 // Start the thread handling the scheduling.