Bug 1404977 - Part 2 - Augment AudioDeviceID with a cubeb device id. r?pehrsons draft
authorPaul Adenot <paul@paul.cx>
Mon, 30 Apr 2018 15:24:52 +0200
changeset 794142 2e24440abc54481948ba9420dbdd8219dc8fd986
parent 794141 b5a82a9a07b7a59114dad88630fba76a00df903f
child 794143 aa58a8be74ae33b11cf9ae462edb134d18a16cbd
push id109576
push userachronop@gmail.com
push dateFri, 11 May 2018 11:11:31 +0000
reviewerspehrsons
bugs1404977
milestone62.0a1
Bug 1404977 - Part 2 - Augment AudioDeviceID with a cubeb device id. r?pehrsons MozReview-Commit-ID: 5Fk1rnGQjGG
dom/media/AudioDeviceInfo.cpp
dom/media/AudioDeviceInfo.h
dom/media/CubebUtils.cpp
dom/media/CubebUtils.h
--- a/dom/media/AudioDeviceInfo.cpp
+++ b/dom/media/AudioDeviceInfo.cpp
@@ -2,31 +2,56 @@
 /* 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,
+using namespace mozilla;
+using namespace mozilla::CubebUtils;
+
+AudioDeviceInfo::AudioDeviceInfo(cubeb_device_info* aInfo)
+:AudioDeviceInfo(aInfo->devid,
+                 NS_ConvertUTF8toUTF16(aInfo->friendly_name),
+                 NS_ConvertUTF8toUTF16(aInfo->group_id),
+                 NS_ConvertUTF8toUTF16(aInfo->vendor_name),
+                 aInfo->type,
+                 aInfo->state,
+                 aInfo->preferred,
+                 aInfo->format,
+                 aInfo->default_format,
+                 aInfo->max_channels,
+                 aInfo->default_rate,
+                 aInfo->max_rate,
+                 aInfo->min_rate,
+                 aInfo->latency_lo,
+                 aInfo->latency_hi)
+{
+}
+
+
+AudioDeviceInfo::AudioDeviceInfo(AudioDeviceID aID,
+                                 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)
+                                 uint32_t aMinLatency)
+  : mDeviceId(aID)
+  , mName(aName)
   , mGroupId(aGroupId)
   , mVendor(aVendor)
   , mType(aType)
   , mState(aState)
   , mPreferred(aPreferred)
   , mSupportedFormat(aSupportedFormat)
   , mDefaultFormat(aDefaultFormat)
   , mMaxChannels(aMaxChannels)
@@ -49,16 +74,75 @@ AudioDeviceInfo::AudioDeviceInfo(const n
   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");
 }
 
+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)
+:AudioDeviceInfo(nullptr,
+                 aName,
+                 aGroupId,
+                 aVendor,
+                 aType,
+                 aState,
+                 aPreferred,
+                 aSupportedFormat,
+                 aDefaultFormat,
+                 aMaxChannels,
+                 aDefaultRate,
+                 aMaxRate,
+                 aMinRate,
+                 aMaxLatency,
+                 aMinLatency)
+{
+}
+
+Maybe<AudioDeviceID>
+AudioDeviceInfo::GetDeviceID()
+{
+  if (mDeviceId) {
+    return Some(mDeviceId);
+  } else {
+    return Nothing();
+  }
+}
+
+const nsString& AudioDeviceInfo::FriendlyName()
+{
+  return mName;
+}
+uint32_t AudioDeviceInfo::MaxChannels()
+{
+  return mMaxChannels;
+}
+uint32_t AudioDeviceInfo::Type()
+{
+  return mType;
+}
+uint32_t AudioDeviceInfo::State()
+{
+  return mState;
+}
+
 /* readonly attribute DOMString name; */
 NS_IMETHODIMP
 AudioDeviceInfo::GetName(nsAString& aName)
 {
   aName = mName;
   return NS_OK;
 }
 
--- a/dom/media/AudioDeviceInfo.h
+++ b/dom/media/AudioDeviceInfo.h
@@ -2,43 +2,73 @@
 /* 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 "CubebUtils.h"
 #include "nsString.h"
+#include "mozilla/Maybe.h"
 
 // This is mapped to the cubeb_device_info.
 class AudioDeviceInfo final : public nsIAudioDeviceInfo
 {
 public:
-  NS_DECL_ISUPPORTS
+  NS_DECL_THREADSAFE_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);
+  using AudioDeviceID = mozilla::CubebUtils::AudioDeviceID;
+
+
+  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);
 
+  AudioDeviceInfo(const AudioDeviceID aID,
+                  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);
+
+  explicit AudioDeviceInfo(cubeb_device_info* aInfo);
+  // It is possible to not know the device identifier here. It depends on which
+  // ctor this instance has been constructed with.
+  mozilla::Maybe<AudioDeviceID> GetDeviceID();
+  const nsString& FriendlyName();
+  uint32_t MaxChannels();
+  uint32_t Type();
+  uint32_t State();
 private:
   virtual ~AudioDeviceInfo() = default;
 
+  AudioDeviceID mDeviceId;
   nsString mName;
   nsString mGroupId;
   nsString mVendor;
   uint16_t mType;
   uint16_t mState;
   uint16_t mPreferred;
   uint16_t mSupportedFormat;
   uint16_t mDefaultFormat;
--- a/dom/media/CubebUtils.cpp
+++ b/dom/media/CubebUtils.cpp
@@ -4,16 +4,17 @@
  * 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 "CubebUtils.h"
 
 #include "MediaInfo.h"
 #include "mozilla/AbstractThread.h"
 #include "mozilla/dom/ContentChild.h"
+#include "mozilla/dom/AudioDeviceInfo.h"
 #include "mozilla/ipc/FileDescriptor.h"
 #include "mozilla/Logging.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/Services.h"
 #include "mozilla/Sprintf.h"
 #include "mozilla/StaticMutex.h"
 #include "mozilla/StaticPtr.h"
 #include "mozilla/Telemetry.h"
@@ -695,17 +696,18 @@ void GetDeviceCollection(nsTArray<RefPtr
     cubeb_device_collection collection = { nullptr, 0 };
     if (cubeb_enumerate_devices(context,
                                 aSide == Input ? CUBEB_DEVICE_TYPE_INPUT :
                                                  CUBEB_DEVICE_TYPE_OUTPUT,
                                 &collection) == CUBEB_OK) {
       for (unsigned int i = 0; i < collection.count; ++i) {
         auto device = collection.device[i];
         RefPtr<AudioDeviceInfo> info =
-          new AudioDeviceInfo(NS_ConvertUTF8toUTF16(device.friendly_name),
+          new AudioDeviceInfo(device.devid,
+                              NS_ConvertUTF8toUTF16(device.friendly_name),
                               NS_ConvertUTF8toUTF16(device.group_id),
                               NS_ConvertUTF8toUTF16(device.vendor_name),
                               ConvertCubebType(device.type),
                               ConvertCubebState(device.state),
                               ConvertCubebPreferred(device.preferred),
                               ConvertCubebFormat(device.format),
                               ConvertCubebFormat(device.default_format),
                               device.max_channels,
--- a/dom/media/CubebUtils.h
+++ b/dom/media/CubebUtils.h
@@ -3,19 +3,22 @@
 /* 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/. */
 
 #if !defined(CubebUtils_h_)
 #define CubebUtils_h_
 
 #include "cubeb/cubeb.h"
-#include "mozilla/dom/AudioDeviceInfo.h"
+#include "nsString.h"
+#include "mozilla/RefPtr.h"
 #include "mozilla/Maybe.h"
 
+class AudioDeviceInfo;
+
 namespace mozilla {
 namespace CubebUtils {
 
 typedef cubeb_devid AudioDeviceID;
 
 // Initialize Audio Library. Some Audio backends require initializing the
 // library before using it.
 void InitLibrary();