Bug 1434600 - Plumb the window ID down to Enumerate{Audio,Video}Devices. r?pehrsons draft
authorPaul Adenot <paul@paul.cx>
Wed, 31 Jan 2018 17:57:59 +0100
changeset 751487 8bbe185917bb4250dc6982ad5b2172201a360728
parent 751044 ef1fefe4c6d1f95e2bdf872094e02e85c962aa86
child 751488 fe9e8433a4dd499ccd3267c02823f6d9cc19b504
push id97980
push userpaul@paul.cx
push dateTue, 06 Feb 2018 12:49:29 +0000
reviewerspehrsons
bugs1434600
milestone60.0a1
Bug 1434600 - Plumb the window ID down to Enumerate{Audio,Video}Devices. r?pehrsons MozReview-Commit-ID: 57d8l89Iq4v
dom/media/MediaManager.cpp
dom/media/webrtc/MediaEngine.h
dom/media/webrtc/MediaEngineDefault.cpp
dom/media/webrtc/MediaEngineDefault.h
dom/media/webrtc/MediaEngineWebRTC.cpp
dom/media/webrtc/MediaEngineWebRTC.h
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -1479,24 +1479,26 @@ private:
   ipc::PrincipalInfo mPrincipalInfo;
   RefPtr<PeerIdentity> mPeerIdentity;
   RefPtr<MediaManager> mManager; // get ref to this when creating the runnable
 };
 
 // Source getter returning full list
 
 static void
-GetSources(MediaEngine *engine, MediaSourceEnum aSrcType,
+GetSources(MediaEngine *engine,
+           uint64_t aWindowId,
+           MediaSourceEnum aSrcType,
            nsTArray<RefPtr<MediaDevice>>& aResult,
            const char* media_device_name = nullptr)
 {
   MOZ_ASSERT(MediaManager::IsInMediaThread());
 
   nsTArray<RefPtr<MediaEngineSource>> sources;
-  engine->EnumerateDevices(aSrcType, &sources);
+  engine->EnumerateDevices(aWindowId, aSrcType, &sources);
 
   /*
    * We're allowing multiple tabs to access the same camera for parity
    * with Chrome.  See bug 811757 for some of the issues surrounding
    * this decision.  To disallow, we'd filter by IsAvailable() as we used
    * to.
    */
   if (media_device_name && *media_device_name)  {
@@ -1888,25 +1890,25 @@ MediaManager::EnumerateRawDevices(uint64
       MOZ_RELEASE_ASSERT(manager); // Must exist while media thread is alive
       realBackend = manager->GetBackend(aWindowId);
     }
 
     auto result = MakeUnique<SourceSet>();
 
     if (hasVideo) {
       nsTArray<RefPtr<MediaDevice>> videos;
-      GetSources(fakeCams? fakeBackend : realBackend, aVideoType,
+      GetSources(fakeCams? fakeBackend : realBackend, aWindowId, aVideoType,
                  videos, videoLoopDev.get());
       for (auto& source : videos) {
         result->AppendElement(source);
       }
     }
     if (hasAudio) {
       nsTArray<RefPtr<MediaDevice>> audios;
-      GetSources(fakeMics? fakeBackend : realBackend, aAudioType,
+      GetSources(fakeMics? fakeBackend : realBackend, aWindowId, aAudioType,
                  audios, audioLoopDev.get());
       for (auto& source : audios) {
         result->AppendElement(source);
       }
     }
     NS_DispatchToMainThread(NewRunnableFrom([id, result = Move(result)]() mutable {
       MediaManager* mgr = MediaManager::GetIfExists();
       if (!mgr) {
--- a/dom/media/webrtc/MediaEngine.h
+++ b/dom/media/webrtc/MediaEngine.h
@@ -39,17 +39,18 @@ public:
   {
     NS_ASSERT_OWNINGTHREAD(MediaEngine);
   }
 
   /**
    * Populate an array of sources of the requested type in the nsTArray.
    * Also include devices that are currently unavailable.
    */
-  virtual void EnumerateDevices(dom::MediaSourceEnum,
+  virtual void EnumerateDevices(uint64_t aWindowId,
+                                dom::MediaSourceEnum,
                                 nsTArray<RefPtr<MediaEngineSource>>*) = 0;
 
   virtual void Shutdown() = 0;
 
   virtual void SetFakeDeviceChangeEvents() {}
 
 protected:
   virtual ~MediaEngine() {}
--- a/dom/media/webrtc/MediaEngineDefault.cpp
+++ b/dom/media/webrtc/MediaEngineDefault.cpp
@@ -543,29 +543,29 @@ MediaEngineDefaultAudioSource::Pull(cons
   TrackTicks desired = aStream->TimeToTicksRoundUp(aStream->GraphRate(), aDesiredTime);
   TrackTicks delta = desired - mLastNotify;
   mLastNotify += delta;
   AppendToSegment(segment, delta, aPrincipalHandle);
   aStream->AppendToTrack(aTrackID, &segment);
 }
 
 void
-MediaEngineDefault::EnumerateDevices(dom::MediaSourceEnum aMediaSource,
+MediaEngineDefault::EnumerateDevices(uint64_t aWindowId,
+                                     dom::MediaSourceEnum aMediaSource,
                                      nsTArray<RefPtr<MediaEngineSource>>* aSources)
 {
   AssertIsOnOwningThread();
 
   switch (aMediaSource) {
     case dom::MediaSourceEnum::Camera: {
       // Only supports camera video sources. See Bug 1038241.
 
       // We once had code here to find a VideoSource with the same settings and
       // re-use that. This is no longer possible since the resolution gets set
       // in Allocate().
-
       auto newSource = MakeRefPtr<MediaEngineDefaultVideoSource>();
       mVSources.AppendElement(newSource);
       aSources->AppendElement(newSource);
       return;
     }
     case dom::MediaSourceEnum::Microphone: {
       for (const RefPtr<MediaEngineDefaultAudioSource>& source : mASources) {
         if (source->IsAvailable()) {
--- a/dom/media/webrtc/MediaEngineDefault.h
+++ b/dom/media/webrtc/MediaEngineDefault.h
@@ -182,17 +182,18 @@ protected:
 };
 
 
 class MediaEngineDefault : public MediaEngine
 {
 public:
   MediaEngineDefault() = default;
 
-  void EnumerateDevices(dom::MediaSourceEnum,
+  void EnumerateDevices(uint64_t aWindowId,
+                        dom::MediaSourceEnum,
                         nsTArray<RefPtr<MediaEngineSource>>*) override;
   void Shutdown() override;
 
 private:
   ~MediaEngineDefault() = default;
 
   nsTArray<RefPtr<MediaEngineDefaultVideoSource>> mVSources;
   nsTArray<RefPtr<MediaEngineDefaultAudioSource>> mASources;
--- a/dom/media/webrtc/MediaEngineWebRTC.cpp
+++ b/dom/media/webrtc/MediaEngineWebRTC.cpp
@@ -124,17 +124,18 @@ MediaEngineWebRTC::MediaEngineWebRTC(Med
 void
 MediaEngineWebRTC::SetFakeDeviceChangeEvents()
 {
   camera::GetChildAndCall(
     &camera::CamerasChild::SetFakeDeviceChangeEvents);
 }
 
 void
-MediaEngineWebRTC::EnumerateDevices(dom::MediaSourceEnum aMediaSource,
+MediaEngineWebRTC::EnumerateDevices(uint64_t aWindowId,
+                                    dom::MediaSourceEnum aMediaSource,
                                     nsTArray<RefPtr<MediaEngineSource> >* aSources)
 {
   if (MediaEngineSource::IsVideo(aMediaSource)) {
     // We spawn threads to handle gUM runnables, so we must protect the member vars
     MutexAutoLock lock(mMutex);
 
     mozilla::camera::CaptureEngine capEngine = mozilla::camera::InvalidEngine;
 
--- a/dom/media/webrtc/MediaEngineWebRTC.h
+++ b/dom/media/webrtc/MediaEngineWebRTC.h
@@ -617,17 +617,18 @@ public:
 
   // Clients should ensure to clean-up sources video/audio sources
   // before invoking Shutdown on this class.
   void Shutdown() override;
 
   // Returns whether the host supports duplex audio stream.
   bool SupportsDuplex();
 
-  void EnumerateDevices(dom::MediaSourceEnum,
+  void EnumerateDevices(uint64_t aWindowId,
+                        dom::MediaSourceEnum,
                         nsTArray<RefPtr<MediaEngineSource>>*) override;
 private:
   ~MediaEngineWebRTC() = default;
 
   nsCOMPtr<nsIThread> mThread;
 
   // gUM runnables can e.g. Enumerate from multiple threads
   Mutex mMutex;