Index: Source/modules/webmidi/MIDIAccess.cpp |
diff --git a/Source/modules/webmidi/MIDIAccess.cpp b/Source/modules/webmidi/MIDIAccess.cpp |
index d0a733c1b36de4dade5bba329e1ed5ec20b4167d..36380b849487f683b189b851fe4095f5dad74437 100644 |
--- a/Source/modules/webmidi/MIDIAccess.cpp |
+++ b/Source/modules/webmidi/MIDIAccess.cpp |
@@ -37,7 +37,11 @@ |
#include "modules/webmidi/MIDIAccessInitializer.h" |
#include "modules/webmidi/MIDIConnectionEvent.h" |
#include "modules/webmidi/MIDIController.h" |
+#include "modules/webmidi/MIDIInput.h" |
+#include "modules/webmidi/MIDIInputMap.h" |
#include "modules/webmidi/MIDIOptions.h" |
+#include "modules/webmidi/MIDIOutput.h" |
+#include "modules/webmidi/MIDIOutputMap.h" |
#include "modules/webmidi/MIDIPort.h" |
#include "platform/AsyncMethodRunner.h" |
#include <v8.h> |
@@ -51,14 +55,23 @@ MIDIAccess::MIDIAccess(PassOwnPtr<MIDIAccessor> accessor, bool sysexEnabled, con |
{ |
ScriptWrappable::init(this); |
m_accessor->setClient(this); |
+ HeapHashMap<String, Member<MIDIInput> > inputs; |
+ HeapHashMap<String, Member<MIDIOutput> > outputs; |
for (size_t i = 0; i < ports.size(); ++i) { |
const MIDIAccessInitializer::PortDescriptor& port = ports[i]; |
if (port.type == MIDIPort::MIDIPortTypeInput) { |
- m_inputs.append(MIDIInput::create(this, port.id, port.manufacturer, port.name, port.version)); |
+ inputs.add(port.id, MIDIInput::create(this, port.id, port.manufacturer, port.name, port.version)); |
+ m_inputKeys.append(port.id); |
} else { |
- m_outputs.append(MIDIOutput::create(this, m_outputs.size(), port.id, port.manufacturer, port.name, port.version)); |
+ outputs.add(port.id, MIDIOutput::create(this, outputs.size(), port.id, port.manufacturer, port.name, port.version)); |
} |
} |
+ if (inputs.size() + outputs.size() != ports.size()) { |
+ // There are id-duplicate ports that violate the spec. |
+ return; |
+ } |
+ m_inputs = new MIDIInputMap(inputs); |
+ m_outputs = new MIDIOutputMap(outputs); |
} |
MIDIAccess::~MIDIAccess() |
@@ -68,20 +81,23 @@ MIDIAccess::~MIDIAccess() |
void MIDIAccess::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version) |
{ |
ASSERT(isMainThread()); |
- m_inputs.append(MIDIInput::create(this, id, manufacturer, name, version)); |
+ // We currently assume no ports are added after an MIDIAccess object is |
Takashi Toyoshima
2014/09/01 13:48:39
Is there any real problem on adding a new port?
Le
yhirano
2014/09/02 05:17:13
Discussed offline: We decided to delete this asser
|
+ // created. |
+ ASSERT_NOT_REACHED(); |
} |
void MIDIAccess::didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version) |
{ |
ASSERT(isMainThread()); |
- unsigned portIndex = m_outputs.size(); |
- m_outputs.append(MIDIOutput::create(this, portIndex, id, manufacturer, name, version)); |
+ // We currently assume no ports are added after an MIDIAccess object is |
+ // created. |
+ ASSERT_NOT_REACHED(); |
} |
void MIDIAccess::didReceiveMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStamp) |
{ |
ASSERT(isMainThread()); |
- if (portIndex >= m_inputs.size()) |
+ if (portIndex >= m_inputs->size()) |
return; |
// Convert from time in seconds which is based on the time coordinate system of monotonicallyIncreasingTime() |
@@ -92,12 +108,13 @@ void MIDIAccess::didReceiveMIDIData(unsigned portIndex, const unsigned char* dat |
double timeStampInMilliseconds = 1000 * document->loader()->timing()->monotonicTimeToZeroBasedDocumentTime(timeStamp); |
- m_inputs[portIndex]->didReceiveMIDIData(portIndex, data, length, timeStampInMilliseconds); |
+ ASSERT(m_inputs->has(m_inputKeys[portIndex])); |
+ m_inputs->get(m_inputKeys[portIndex])->didReceiveMIDIData(portIndex, data, length, timeStampInMilliseconds); |
} |
void MIDIAccess::sendMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStampInMilliseconds) |
{ |
- if (!data || !length || portIndex >= m_outputs.size()) |
+ if (!data || !length || portIndex >= m_outputs->size()) |
return; |
// Convert from a time in milliseconds (a DOMHighResTimeStamp) according to the same time coordinate system as performance.now() |
// into a time in seconds which is based on the time coordinate system of monotonicallyIncreasingTime(). |