Bug 1197045 - part1: Create an AudioDeviceInfo to expose the native device information; r=kinetik draft
authorChun-Min Chang <chun.m.chang@gmail.com>
Thu, 13 Jul 2017 14:01:36 +0800
changeset 610465 d1aa70e17ae7d3d25a253f7da98b6bf4e28f9e5e
parent 610234 5e73b9798464c3f7106f0161dc9a49b234f42f9c
child 610466 ede633f29146a7f83832278a6a77e5ccabb0e303
push id68896
push userbmo:cchang@mozilla.com
push dateTue, 18 Jul 2017 09:35:18 +0000
reviewerskinetik
bugs1197045
milestone56.0a1
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
@@ -75,16 +75,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 += [
     'AbstractMediaDecoder.h',
@@ -173,16 +174,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',
@@ -200,16 +202,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;
+};