Bug 1197045 - part1: Create an AudioDeviceInfo to expose the native device information; r=kinetik
☠☠ backed out by a5869e4529ac ☠ ☠
authorChun-Min Chang <chun.m.chang@gmail.com>
Thu, 13 Jul 2017 14:01:36 +0800
changeset 419257 a4ea1d5fcb4e3de29b4d4df582c698da338f4ded
parent 419256 a6b198e415f35e1b2d7bb8eea9ae5aacb77f0d21
child 419258 cf756c62b0a61b02b1b599fda6c680240e7b6756
push id7566
push usermtabara@mozilla.com
push dateWed, 02 Aug 2017 08:25:16 +0000
treeherdermozilla-beta@86913f512c3c [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskinetik
bugs1197045
milestone56.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1197045 - part1: Create an AudioDeviceInfo to expose the native device information; r=kinetik MozReview-Commit-ID: 2N2BkZUVOca
dom/media/AudioDeviceInfo.cpp
dom/media/AudioDeviceInfo.h
dom/media/moz.build
dom/media/nsIAudioDeviceInfo.idl
new file mode 100644
--- /dev/null
+++ b/dom/media/AudioDeviceInfo.cpp
@@ -0,0 +1,167 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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 "AudioDeviceInfo.h"
+
+NS_IMPL_ISUPPORTS(AudioDeviceInfo, nsIAudioDeviceInfo)
+
+AudioDeviceInfo::AudioDeviceInfo(const nsAString& aName,
+                                 const nsAString& aGroupId,
+                                 const nsAString& aVendor,
+                                 uint16_t aType,
+                                 uint16_t aState,
+                                 uint16_t aPreferred,
+                                 uint16_t aSupportedFormat,
+                                 uint16_t aDefaultFormat,
+                                 uint32_t aMaxChannels,
+                                 uint32_t aDefaultRate,
+                                 uint32_t aMaxRate,
+                                 uint32_t aMinRate,
+                                 uint32_t aMaxLatency,
+				 uint32_t aMinLatency)
+  : mName(aName)
+  , mGroupId(aGroupId)
+  , mVendor(aVendor)
+  , mType(aType)
+  , mState(aState)
+  , mPreferred(aPreferred)
+  , mSupportedFormat(aSupportedFormat)
+  , mDefaultFormat(aDefaultFormat)
+  , mMaxChannels(aMaxChannels)
+  , mDefaultRate(aDefaultRate)
+  , mMaxRate(aMaxRate)
+  , mMinRate(aMinRate)
+  , mMaxLatency(aMaxLatency)
+  , mMinLatency(aMinLatency)
+{
+  MOZ_ASSERT(mType == TYPE_UNKNOWN ||
+             mType == TYPE_INPUT ||
+             mType == TYPE_OUTPUT, "Wrong type");
+  MOZ_ASSERT(mState == STATE_DISABLED ||
+             mState == STATE_UNPLUGGED ||
+             mState == STATE_ENABLED, "Wrong state");
+  MOZ_ASSERT(mPreferred == PREF_NONE ||
+             mPreferred == PREF_ALL ||
+             mPreferred & (PREF_MULTIMEDIA | PREF_VOICE | PREF_NOTIFICATION),
+             "Wrong preferred value");
+  MOZ_ASSERT(mSupportedFormat & (FMT_S16LE | FMT_S16BE | FMT_F32LE | FMT_F32BE),
+             "Wrong supported format");
+  MOZ_ASSERT(mDefaultFormat == FMT_S16LE ||
+             mDefaultFormat == FMT_S16BE ||
+             mDefaultFormat == FMT_F32LE ||
+             mDefaultFormat == FMT_F32BE, "Wrong default format");
+}
+
+/* readonly attribute DOMString name; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetName(nsAString& aName)
+{
+  aName = mName;
+  return NS_OK;
+}
+
+/* readonly attribute DOMString groupId; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetGroupId(nsAString& aGroupId)
+{
+  aGroupId = mGroupId;
+  return NS_OK;
+}
+
+/* readonly attribute DOMString vendor; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetVendor(nsAString& aVendor)
+{
+  aVendor = mVendor;
+  return NS_OK;
+}
+
+/* readonly attribute unsigned short type; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetType(uint16_t* aType)
+{
+  *aType = mType;
+  return NS_OK;
+}
+
+/* readonly attribute unsigned short state; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetState(uint16_t* aState)
+{
+  *aState = mState;
+  return NS_OK;
+}
+
+/* readonly attribute unsigned short preferred; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetPreferred(uint16_t* aPreferred)
+{
+  *aPreferred = mPreferred;
+  return NS_OK;
+}
+
+/* readonly attribute unsigned short supportedFormat; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetSupportedFormat(uint16_t* aSupportedFormat)
+{
+  *aSupportedFormat = mSupportedFormat;
+  return NS_OK;
+}
+
+/* readonly attribute unsigned short defaultFormat; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetDefaultFormat(uint16_t* aDefaultFormat)
+{
+  *aDefaultFormat = mDefaultFormat;
+  return NS_OK;
+}
+
+/* readonly attribute unsigned long maxChannels; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetMaxChannels(uint32_t* aMaxChannels)
+{
+  *aMaxChannels = mMaxChannels;
+  return NS_OK;
+}
+
+/* readonly attribute unsigned long defaultRate; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetDefaultRate(uint32_t* aDefaultRate)
+{
+  *aDefaultRate = mDefaultRate;
+  return NS_OK;
+}
+
+/* readonly attribute unsigned long maxRate; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetMaxRate(uint32_t* aMaxRate)
+{
+  *aMaxRate = mMaxRate;
+  return NS_OK;
+}
+
+/* readonly attribute unsigned long minRate; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetMinRate(uint32_t* aMinRate)
+{
+  *aMinRate = mMinRate;
+  return NS_OK;
+}
+
+/* readonly attribute unsigned long maxLatency; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetMaxLatency(uint32_t* aMaxLatency)
+{
+  *aMaxLatency = mMaxLatency;
+  return NS_OK;
+}
+
+/* readonly attribute unsigned long minLatency; */
+NS_IMETHODIMP
+AudioDeviceInfo::GetMinLatency(uint32_t* aMinLatency)
+{
+  *aMinLatency = mMinLatency;
+  return NS_OK;
+}
new file mode 100644
--- /dev/null
+++ b/dom/media/AudioDeviceInfo.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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_AudioDeviceInfo_H
+#define MOZILLA_AudioDeviceInfo_H
+
+#include "nsIAudioDeviceInfo.h"
+#include "nsString.h"
+
+// This is mapped to the cubeb_device_info.
+class AudioDeviceInfo final : public nsIAudioDeviceInfo
+{
+public:
+  NS_DECL_ISUPPORTS
+  NS_DECL_NSIAUDIODEVICEINFO
+
+  explicit AudioDeviceInfo(const nsAString& aName,
+                           const nsAString& aGroupId,
+                           const nsAString& aVendor,
+                           uint16_t aType,
+                           uint16_t aState,
+                           uint16_t aPreferred,
+                           uint16_t aSupportedFormat,
+                           uint16_t aDefaultFormat,
+                           uint32_t aMaxChannels,
+                           uint32_t aDefaultRate,
+                           uint32_t aMaxRate,
+                           uint32_t aMinRate,
+                           uint32_t aMaxLatency,
+                           uint32_t aMinLatency);
+
+private:
+  virtual ~AudioDeviceInfo() = default;
+
+  nsString mName;
+  nsString mGroupId;
+  nsString mVendor;
+  uint16_t mType;
+  uint16_t mState;
+  uint16_t mPreferred;
+  uint16_t mSupportedFormat;
+  uint16_t mDefaultFormat;
+  uint32_t mMaxChannels;
+  uint32_t mDefaultRate;
+  uint32_t mMaxRate;
+  uint32_t mMinRate;
+  uint32_t mMaxLatency;
+  uint32_t mMinLatency;
+};
+
+#endif // MOZILLA_AudioDeviceInfo_H
--- a/dom/media/moz.build
+++ b/dom/media/moz.build
@@ -72,16 +72,17 @@ MOCHITEST_MANIFESTS += [
 ]
 
 if CONFIG['MOZ_WEBRTC']:
     MOCHITEST_MANIFESTS += ['tests/mochitest/mochitest.ini']
     WEBRTC_SIGNALLING_TEST_MANIFESTS += ['tests/mochitest/steeplechase.ini']
     WEBRTC_SIGNALLING_TEST_MANIFESTS += ['tests/mochitest/steeplechase_long/steeplechase_long.ini']
 
 XPIDL_SOURCES += [
+    'nsIAudioDeviceInfo.idl',
     'nsIDOMNavigatorUserMedia.idl',
     'nsIMediaManager.idl',
 ]
 
 XPIDL_MODULE = 'dom_media'
 
 EXPORTS += [
     'ADTSDecoder.h',
@@ -168,16 +169,17 @@ if not CONFIG['MOZ_WEBRTC']:
       '../../media/mtransport/runnable_utils.h',
   ]
 
 IPDL_SOURCES += [
     'webrtc/PWebrtcGlobal.ipdl'
 ]
 
 EXPORTS.mozilla.dom += [
+    'AudioDeviceInfo.h',
     'AudioStreamTrack.h',
     'AudioTrack.h',
     'AudioTrackList.h',
     'CanvasCaptureMediaStream.h',
     'GetUserMediaRequest.h',
     'MediaDeviceInfo.h',
     'MediaDevices.h',
     'MediaStreamError.h',
@@ -195,16 +197,17 @@ EXPORTS.mozilla.dom += [
 
 UNIFIED_SOURCES += [
     'ADTSDecoder.cpp',
     'ADTSDemuxer.cpp',
     'AudioCaptureStream.cpp',
     'AudioChannelFormat.cpp',
     'AudioCompactor.cpp',
     'AudioConverter.cpp',
+    'AudioDeviceInfo.cpp',
     'AudioSegment.cpp',
     'AudioStream.cpp',
     'AudioStreamTrack.cpp',
     'AudioTrack.cpp',
     'AudioTrackList.cpp',
     'Benchmark.cpp',
     'CanvasCaptureMediaStream.cpp',
     'ChannelMediaDecoder.cpp',
new file mode 100644
--- /dev/null
+++ b/dom/media/nsIAudioDeviceInfo.idl
@@ -0,0 +1,54 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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 "nsISupports.idl"
+
+[scriptable, uuid(feb979a8-f8cc-4522-9dff-6c055ca50762)]
+interface nsIAudioDeviceInfo : nsISupports
+{
+  readonly attribute DOMString name;
+
+  readonly attribute DOMString groupId;
+
+  readonly attribute DOMString vendor;
+
+  // type: Unknown/Input/Output
+  const unsigned short TYPE_UNKNOWN = 0;
+  const unsigned short TYPE_INPUT   = 1;
+  const unsigned short TYPE_OUTPUT  = 2;
+  readonly attribute unsigned short type;
+
+  // state: Disabled/Unplugged/Enabled
+  const unsigned short STATE_DISABLED   = 0;
+  const unsigned short STATE_UNPLUGGED  = 1;
+  const unsigned short STATE_ENABLED    = 2;
+  readonly attribute unsigned short state;
+
+  // preferred: None/Multimedia/Voice/Notification/All
+  const unsigned short PREF_NONE          = 0x00;
+  const unsigned short PREF_MULTIMEDIA    = 0x01;
+  const unsigned short PREF_VOICE         = 0x02;
+  const unsigned short PREF_NOTIFICATION  = 0x04;
+  const unsigned short PREF_ALL           = 0x0F;
+  readonly attribute unsigned short preferred;
+
+  // supported format, default format: S16LE/S16BE/F32LE/F32BE
+  const unsigned short FMT_S16LE = 0x0010;
+  const unsigned short FMT_S16BE = 0x0020;
+  const unsigned short FMT_F32LE = 0x1000;
+  const unsigned short FMT_F32BE = 0x2000;
+  readonly attribute unsigned short supportedFormat;
+  readonly attribute unsigned short defaultFormat;
+
+  // Max number of channels: [1, 255]
+  readonly attribute unsigned long maxChannels;
+
+  readonly attribute unsigned long defaultRate;
+  readonly attribute unsigned long maxRate;
+  readonly attribute unsigned long minRate;
+
+  readonly attribute unsigned long maxLatency;
+  readonly attribute unsigned long minLatency;
+};