зеркало из https://github.com/mozilla/gecko-dev.git
98 строки
4.1 KiB
C++
98 строки
4.1 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/. */
|
|
|
|
#ifndef MOZILLA_AUDIONOTIFICATIONRECEIVER_H_
|
|
#define MOZILLA_AUDIONOTIFICATIONRECEIVER_H_
|
|
|
|
// clang-format off
|
|
/*
|
|
* Architecture to send/receive default device-changed notification:
|
|
*
|
|
* Chrome Process ContentProcess 1
|
|
* ------------------ ------------------
|
|
*
|
|
* AudioNotification DeviceChangeListener 1 DeviceChangeListener N
|
|
* | ^ | ^ ^
|
|
* (4)| |(2) |(3) |(8) .
|
|
* v | v | v
|
|
* AudioNotificationSender AudioNotificationReceiver
|
|
* ^ | ^ ^
|
|
* . (5)| |(1) |(7)
|
|
* . v | |
|
|
* . (P)ContentParent 1 (P)ContentChild 1
|
|
* . | ^
|
|
* . (6)| |
|
|
* . | |
|
|
* . | |
|
|
* . +------------------------------------+
|
|
* . PContent IPC
|
|
* .
|
|
* . Content Process M
|
|
* . ------------------
|
|
* . .
|
|
* v .
|
|
* (P)ContentParent M < . . . . . . . . . > (P)ContentChild M
|
|
* PContent IPC
|
|
*
|
|
* Steps
|
|
* --------
|
|
* 1) Initailize the AudioNotificationSender when ContentParent is created.
|
|
* 2) Create an AudioNotification to get the device-changed signal
|
|
* from the system.
|
|
* 3) Register the DeviceChangeListener to AudioNotificationReceiver when it's
|
|
* created. 4) When the default device is changed, AudioNotification get the
|
|
* signal and 5) Pass this message by AudioNotificationSender. 6) The
|
|
* AudioNotificationSender sends the device-changed notification via the
|
|
* PContent. 7) The ContentChild will call AudioNotificationReceiver to 8)
|
|
* Notify all the registered audio streams to reconfigure the output devices.
|
|
*
|
|
* Notes
|
|
* --------
|
|
* a) There is only one AudioNotificationSender and AudioNotification
|
|
* in a chrome process.
|
|
* b) There is only one AudioNotificationReceiver and might be many
|
|
* DeviceChangeListeners in a content process.
|
|
* c) There might be many ContentParent in a chrome process.
|
|
* d) There is only one ContentChild in a content process.
|
|
* e) All the DeviceChangeListeners are registered in the
|
|
* AudioNotificationReceiver. f) All the ContentParents are registered in the
|
|
* AudioNotificationSender.
|
|
*/
|
|
// clang-format on
|
|
|
|
namespace mozilla {
|
|
namespace audio {
|
|
|
|
// The base class that provides a ResetDefaultDevice interface that
|
|
// will be called in AudioNotificationReceiver::NotifyDefaultDeviceChanged
|
|
// when it receives device-changed notification from the chrome process.
|
|
class DeviceChangeListener {
|
|
protected:
|
|
virtual ~DeviceChangeListener(){};
|
|
|
|
public:
|
|
// The subclass shoule provide its own implementation switching the
|
|
// audio stream to the new default output device.
|
|
virtual void ResetDefaultDevice() = 0;
|
|
};
|
|
|
|
class AudioNotificationReceiver final {
|
|
public:
|
|
// Add the DeviceChangeListener into the subscribers list.
|
|
static void Register(DeviceChangeListener* aDeviceChangeListener);
|
|
|
|
// Remove the DeviceChangeListener from the subscribers list.
|
|
static void Unregister(DeviceChangeListener* aDeviceChangeListener);
|
|
|
|
// Notify all the streams that the default device has been changed.
|
|
static void NotifyDefaultDeviceChanged();
|
|
}; // AudioNotificationReceiver
|
|
|
|
} // namespace audio
|
|
} // namespace mozilla
|
|
|
|
#endif // MOZILLA_AUDIONOTIFICATIONRECEIVER_H_
|