| Index: Source/modules/webmidi/MIDIAccess.cpp
|
| diff --git a/Source/modules/webmidi/MIDIAccess.cpp b/Source/modules/webmidi/MIDIAccess.cpp
|
| index d0a733c1b36de4dade5bba329e1ed5ec20b4167d..c62fe17e4effe9eed2db7e087a7fc0a5ab953e2f 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 will be added once an MIDIAccess object is
|
| + // 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 will be added once 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().
|
|
|