Bug 1197045 - part1: Create an AudioDeviceInfo to expose the native device information; r=kinetik
authorChun-Min Chang <chun.m.chang@gmail.com>
Thu, 13 Jul 2017 14:01:36 +0800
changeset 419967 1711c8455215fbb2f71794d306c1487993767ce8
parent 419966 bc2f0aac349f6150b6ae0c9f3c93d3bbbec30ec9
child 419968 118833b05c410f5ca50ea83afa51e757cc3181df
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;
+};