Commit a0023941 authored by toyoshim@chromium.org's avatar toyoshim@chromium.org

Web MIDI: add blink APIs to notify device connection events

Add different versions of APIs of didAddInputPort() and didAddOutputPort()
that have a active flag. Old versions will be deprecated once Chromium
side is changed to use the new APIs.

Also, add didSetInputPortState() and didSetOutputPortState() to notify
device status changes.

These updates are needed to manage device connections and disconnections
in consistent between Chromium and Blink.

BUG=279097
TEST=LayoutTets and manual tests

Review URL: https://codereview.chromium.org/649683006

git-svn-id: svn://svn.chromium.org/blink/trunk@183974 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 72a06fc0
......@@ -56,9 +56,9 @@ MIDIAccess::MIDIAccess(PassOwnPtr<MIDIAccessor> accessor, bool sysexEnabled, con
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));
m_inputs.append(MIDIInput::create(this, port.id, port.manufacturer, port.name, port.version, port.isActive));
} else {
m_outputs.append(MIDIOutput::create(this, m_outputs.size(), port.id, port.manufacturer, port.name, port.version));
m_outputs.append(MIDIOutput::create(this, m_outputs.size(), port.id, port.manufacturer, port.name, port.version, port.isActive));
}
}
}
......@@ -70,11 +70,15 @@ MIDIAccess::~MIDIAccess()
MIDIInputMap* MIDIAccess::inputs() const
{
HeapHashMap<String, Member<MIDIInput> > inputs;
size_t inactiveCount = 0;
for (size_t i = 0; i < m_inputs.size(); ++i) {
MIDIInput* input = m_inputs[i];
inputs.add(input->id(), input);
if (input->isActive())
inputs.add(input->id(), input);
else
inactiveCount++;
}
if (inputs.size() != m_inputs.size()) {
if ((inputs.size() + inactiveCount) != m_inputs.size()) {
// There is id duplication that violates the spec.
inputs.clear();
}
......@@ -84,28 +88,46 @@ MIDIInputMap* MIDIAccess::inputs() const
MIDIOutputMap* MIDIAccess::outputs() const
{
HeapHashMap<String, Member<MIDIOutput> > outputs;
size_t inactiveCount = 0;
for (size_t i = 0; i < m_outputs.size(); ++i) {
MIDIOutput* output = m_outputs[i];
outputs.add(output->id(), output);
if (output->isActive())
outputs.add(output->id(), output);
else
inactiveCount++;
}
if (outputs.size() != m_outputs.size()) {
if ((outputs.size() + inactiveCount) != m_outputs.size()) {
// There is id duplication that violates the spec.
outputs.clear();
}
return new MIDIOutputMap(outputs);
}
void MIDIAccess::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version)
void MIDIAccess::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version, bool isActive)
{
ASSERT(isMainThread());
m_inputs.append(MIDIInput::create(this, id, manufacturer, name, version));
m_inputs.append(MIDIInput::create(this, id, manufacturer, name, version, isActive));
}
void MIDIAccess::didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version)
void MIDIAccess::didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version, bool isActive)
{
ASSERT(isMainThread());
unsigned portIndex = m_outputs.size();
m_outputs.append(MIDIOutput::create(this, portIndex, id, manufacturer, name, version));
m_outputs.append(MIDIOutput::create(this, portIndex, id, manufacturer, name, version, isActive));
}
void MIDIAccess::didSetInputPortState(unsigned portIndex, bool isActive)
{
ASSERT(isMainThread());
if (portIndex < m_inputs.size())
m_inputs[portIndex]->setActiveState(isActive);
}
void MIDIAccess::didSetOutputPortState(unsigned portIndex, bool isActive)
{
ASSERT(isMainThread());
if (portIndex < m_outputs.size())
m_outputs[portIndex]->setActiveState(isActive);
}
void MIDIAccess::didReceiveMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStamp)
......
......@@ -77,8 +77,10 @@ public:
virtual void stop() override;
// MIDIAccessorClient
virtual void didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version) override;
virtual void didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version) override;
virtual void didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version, bool isActive) override;
virtual void didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version, bool isActive) override;
virtual void didSetInputPortState(unsigned portIndex, bool isActive) override;
virtual void didSetOutputPortState(unsigned portIndex, bool isActive) override;
virtual void didStartSession(bool success, const String& error, const String& message) override
{
// This method is for MIDIAccess initialization: MIDIAccessInitializer
......
......@@ -55,16 +55,30 @@ ScriptPromise MIDIAccessInitializer::start()
return promise;
}
void MIDIAccessInitializer::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version)
void MIDIAccessInitializer::didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version, bool isActive)
{
ASSERT(m_accessor);
m_portDescriptors.append(PortDescriptor(id, manufacturer, name, MIDIPort::MIDIPortTypeInput, version));
m_portDescriptors.append(PortDescriptor(id, manufacturer, name, MIDIPort::MIDIPortTypeInput, version, isActive));
}
void MIDIAccessInitializer::didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version)
void MIDIAccessInitializer::didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version, bool isActive)
{
ASSERT(m_accessor);
m_portDescriptors.append(PortDescriptor(id, manufacturer, name, MIDIPort::MIDIPortTypeOutput, version));
m_portDescriptors.append(PortDescriptor(id, manufacturer, name, MIDIPort::MIDIPortTypeOutput, version, isActive));
}
void MIDIAccessInitializer::didSetInputPortState(unsigned portIndex, bool isActive)
{
// didSetInputPortState() is not allowed to call before didStartSession()
// is called. Once didStartSession() is called, MIDIAccessorClient methods
// are delegated to MIDIAccess. See constructor of MIDIAccess.
ASSERT_NOT_REACHED();
}
void MIDIAccessInitializer::didSetOutputPortState(unsigned portIndex, bool isActive)
{
// See comments on didSetInputPortState().
ASSERT_NOT_REACHED();
}
void MIDIAccessInitializer::didStartSession(bool success, const String& error, const String& message)
......
......@@ -26,13 +26,15 @@ public:
String name;
MIDIPort::MIDIPortTypeCode type;
String version;
bool isActive;
PortDescriptor(const String& id, const String& manufacturer, const String& name, MIDIPort::MIDIPortTypeCode type, const String& version)
PortDescriptor(const String& id, const String& manufacturer, const String& name, MIDIPort::MIDIPortTypeCode type, const String& version, bool isActive)
: id(id)
, manufacturer(manufacturer)
, name(name)
, type(type)
, version(version) { }
, version(version)
, isActive(isActive) { }
};
static ScriptPromise start(ScriptState* scriptState, const MIDIOptions& options)
......@@ -46,8 +48,10 @@ public:
virtual ~MIDIAccessInitializer();
// MIDIAccessorClient
virtual void didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version) override;
virtual void didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version) override;
virtual void didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version, bool isActive) override;
virtual void didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version, bool isActive) override;
virtual void didSetInputPortState(unsigned portIndex, bool isActive) override;
virtual void didSetOutputPortState(unsigned portIndex, bool isActive) override;
virtual void didStartSession(bool success, const String& error, const String& message) override;
virtual void didReceiveMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStamp) override { }
......
......@@ -67,12 +67,32 @@ void MIDIAccessor::sendMIDIData(unsigned portIndex, const unsigned char* data, s
void MIDIAccessor::didAddInputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version)
{
m_client->didAddInputPort(id, manufacturer, name, version);
m_client->didAddInputPort(id, manufacturer, name, version, true);
}
void MIDIAccessor::didAddOutputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version)
{
m_client->didAddOutputPort(id, manufacturer, name, version);
m_client->didAddOutputPort(id, manufacturer, name, version, true);
}
void MIDIAccessor::didAddInputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version, bool isActive)
{
m_client->didAddInputPort(id, manufacturer, name, version, isActive);
}
void MIDIAccessor::didAddOutputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version, bool isActive)
{
m_client->didAddOutputPort(id, manufacturer, name, version, isActive);
}
void MIDIAccessor::didSetInputPortState(unsigned portIndex, bool isActive)
{
m_client->didSetInputPortState(portIndex, isActive);
}
void MIDIAccessor::didSetOutputPortState(unsigned portIndex, bool isActive)
{
m_client->didSetOutputPortState(portIndex, isActive);
}
void MIDIAccessor::didStartSession(bool success, const WebString& error, const WebString& message)
......
......@@ -54,8 +54,13 @@ public:
void setClient(MIDIAccessorClient* client) { m_client = client; }
// WebMIDIAccessorClient
// FIXME: Remove deprecated interfaces that do not have |isActive| argument.
virtual void didAddInputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version) override;
virtual void didAddOutputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version) override;
virtual void didAddInputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version, bool isActive) override;
virtual void didAddOutputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version, bool isActive) override;
virtual void didSetInputPortState(unsigned portIndex, bool isActive) override;
virtual void didSetOutputPortState(unsigned portIndex, bool isActive) override;
virtual void didStartSession(bool success, const WebString& error, const WebString& message) override;
virtual void didReceiveMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStamp) override;
......
......@@ -37,8 +37,10 @@ namespace blink {
class MIDIAccessorClient {
public:
virtual void didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version) = 0;
virtual void didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version) = 0;
virtual void didAddInputPort(const String& id, const String& manufacturer, const String& name, const String& version, bool isActive) = 0;
virtual void didAddOutputPort(const String& id, const String& manufacturer, const String& name, const String& version, bool isActive) = 0;
virtual void didSetInputPortState(unsigned portIndex, bool isActive) = 0;
virtual void didSetOutputPortState(unsigned portIndex, bool isActive) = 0;
virtual void didStartSession(bool success, const String& error, const String& message) = 0;
virtual void didReceiveMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStamp) = 0;
......
......@@ -37,14 +37,14 @@
namespace blink {
MIDIInput* MIDIInput::create(MIDIAccess* access, const String& id, const String& manufacturer, const String& name, const String& version)
MIDIInput* MIDIInput::create(MIDIAccess* access, const String& id, const String& manufacturer, const String& name, const String& version, bool isActive)
{
ASSERT(access);
return new MIDIInput(access, id, manufacturer, name, version);
return new MIDIInput(access, id, manufacturer, name, version, isActive);
}
MIDIInput::MIDIInput(MIDIAccess* access, const String& id, const String& manufacturer, const String& name, const String& version)
: MIDIPort(access, id, manufacturer, name, MIDIPortTypeInput, version)
MIDIInput::MIDIInput(MIDIAccess* access, const String& id, const String& manufacturer, const String& name, const String& version, bool isActive)
: MIDIPort(access, id, manufacturer, name, MIDIPortTypeInput, version, isActive)
{
}
......
......@@ -41,7 +41,7 @@ class MIDIAccess;
class MIDIInput final : public MIDIPort {
DEFINE_WRAPPERTYPEINFO();
public:
static MIDIInput* create(MIDIAccess*, const String& id, const String& manufacturer, const String& name, const String& version);
static MIDIInput* create(MIDIAccess*, const String& id, const String& manufacturer, const String& name, const String& version, bool isActive);
virtual ~MIDIInput() { }
DEFINE_ATTRIBUTE_EVENT_LISTENER(midimessage);
......@@ -55,7 +55,7 @@ public:
virtual void trace(Visitor*) override;
private:
MIDIInput(MIDIAccess*, const String& id, const String& manufacturer, const String& name, const String& version);
MIDIInput(MIDIAccess*, const String& id, const String& manufacturer, const String& name, const String& version, bool isActive);
};
} // namespace blink
......
......@@ -173,14 +173,14 @@ private:
} // namespace
MIDIOutput* MIDIOutput::create(MIDIAccess* access, unsigned portIndex, const String& id, const String& manufacturer, const String& name, const String& version)
MIDIOutput* MIDIOutput::create(MIDIAccess* access, unsigned portIndex, const String& id, const String& manufacturer, const String& name, const String& version, bool isActive)
{
ASSERT(access);
return new MIDIOutput(access, portIndex, id, manufacturer, name, version);
return new MIDIOutput(access, portIndex, id, manufacturer, name, version, isActive);
}
MIDIOutput::MIDIOutput(MIDIAccess* access, unsigned portIndex, const String& id, const String& manufacturer, const String& name, const String& version)
: MIDIPort(access, id, manufacturer, name, MIDIPortTypeOutput, version)
MIDIOutput::MIDIOutput(MIDIAccess* access, unsigned portIndex, const String& id, const String& manufacturer, const String& name, const String& version, bool isActive)
: MIDIPort(access, id, manufacturer, name, MIDIPortTypeOutput, version, isActive)
, m_portIndex(portIndex)
{
}
......
......@@ -42,7 +42,7 @@ class MIDIAccess;
class MIDIOutput final : public MIDIPort {
DEFINE_WRAPPERTYPEINFO();
public:
static MIDIOutput* create(MIDIAccess*, unsigned portIndex, const String& id, const String& manufacturer, const String& name, const String& version);
static MIDIOutput* create(MIDIAccess*, unsigned portIndex, const String& id, const String& manufacturer, const String& name, const String& version, bool isActive);
virtual ~MIDIOutput();
void send(DOMUint8Array*, double timestamp, ExceptionState&);
......@@ -56,7 +56,7 @@ public:
virtual void trace(Visitor*) override;
private:
MIDIOutput(MIDIAccess*, unsigned portIndex, const String& id, const String& manufacturer, const String& name, const String& version);
MIDIOutput(MIDIAccess*, unsigned portIndex, const String& id, const String& manufacturer, const String& name, const String& version, bool isActive);
unsigned m_portIndex;
};
......
......@@ -35,13 +35,14 @@
namespace blink {
MIDIPort::MIDIPort(MIDIAccess* access, const String& id, const String& manufacturer, const String& name, MIDIPortTypeCode type, const String& version)
MIDIPort::MIDIPort(MIDIAccess* access, const String& id, const String& manufacturer, const String& name, MIDIPortTypeCode type, const String& version, bool isActive)
: m_id(id)
, m_manufacturer(manufacturer)
, m_name(name)
, m_type(type)
, m_version(version)
, m_access(access)
, m_isActive(isActive)
{
ASSERT(access);
ASSERT(type == MIDIPortTypeInput || type == MIDIPortTypeOutput);
......
......@@ -57,6 +57,8 @@ public:
String version() const { return m_version; }
MIDIAccess* midiAccess() const { return m_access; }
bool isActive() const { return m_isActive; }
void setActiveState(bool isActive) { m_isActive = isActive; }
virtual void trace(Visitor*) override;
......@@ -67,7 +69,7 @@ public:
virtual ExecutionContext* executionContext() const override final;
protected:
MIDIPort(MIDIAccess*, const String& id, const String& manufacturer, const String& name, MIDIPortTypeCode, const String& version);
MIDIPort(MIDIAccess*, const String& id, const String& manufacturer, const String& name, MIDIPortTypeCode, const String& version, bool isActive);
private:
String m_id;
......@@ -76,6 +78,7 @@ private:
MIDIPortTypeCode m_type;
String m_version;
Member<MIDIAccess> m_access;
bool m_isActive;
};
} // namespace blink
......
......@@ -37,9 +37,19 @@ namespace blink {
class WebMIDIAccessorClient {
public:
// FIXME: Remove deprecated interfaces that do not have |isActive| argument.
virtual void didAddInputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version) = 0;
virtual void didAddOutputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version) = 0;
// didAddInputPort() and didAddOutputPort() can be called before and after
// didStartSession() is called. But |id| should be unique in each function.
virtual void didAddInputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version, bool isActive) = 0;
virtual void didAddOutputPort(const WebString& id, const WebString& manufacturer, const WebString& name, const WebString& version, bool isActive) = 0;
// didSetInputPortState() and didSetOutputPortState() should not be called
// until didStartSession() is called.
virtual void didSetInputPortState(unsigned portIndex, bool isActive) = 0;
virtual void didSetOutputPortState(unsigned portIndex, bool isActive) = 0;
virtual void didStartSession(bool success, const WebString& error, const WebString& message) = 0;
// |timeStamp| is in milliseconds according to the Web MIDI API.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment