gecko-dev/dom/midi/MIDIPlatformRunnables.cpp
Gabriele Svelto ce22c0902d Bug 1748647 - Split DOM MIDI port state from the actual state of the ports r=padenot
The goal is to make sure that several pages have a coherent view of
potentially shared port. If both page A and page B open an input port they
should both receive messages. If page B closes it, then port A will keep
receiving messages and still see the port open, but B won't and will see it
closed.

This is achieved by sending status changes based on the parent objects of
every DOM midi port instead of broadcasting them to every port. Additionally
the midir implementation now counts the number of times a port has been opened
so that it won't open the same twice or close one too soon.

Differential Revision: https://phabricator.services.mozilla.com/D136224
2022-01-19 06:58:17 +00:00

50 lines
1.4 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/MIDIPlatformRunnables.h"
#include "mozilla/dom/MIDIPlatformService.h"
#include "mozilla/dom/MIDIPortParent.h"
#include "mozilla/ipc/BackgroundParent.h"
namespace mozilla::dom {
NS_IMETHODIMP
MIDIBackgroundRunnable::Run() {
::mozilla::ipc::AssertIsOnBackgroundThread();
if (!MIDIPlatformService::IsRunning()) {
return NS_OK;
}
RunInternal();
return NS_OK;
}
void ReceiveRunnable::RunInternal() {
MIDIPlatformService::Get()->CheckAndReceive(mPortId, mMsgs);
}
void AddPortRunnable::RunInternal() {
MIDIPlatformService::Get()->AddPortInfo(mPortInfo);
}
void RemovePortRunnable::RunInternal() {
MIDIPlatformService::Get()->RemovePortInfo(mPortInfo);
}
void SetStatusRunnable::RunInternal() {
MIDIPlatformService::Get()->UpdateStatus(mPort, mState, mConnection);
}
void SendPortListRunnable::RunInternal() {
// Unlike other runnables, SendPortListRunnable should just exit quietly if
// the service has died.
if (!MIDIPlatformService::IsRunning()) {
return;
}
MIDIPlatformService::Get()->SendPortList();
}
} // namespace mozilla::dom