MediaStreamWindowCapturer.cpp (2594B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 4 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "MediaStreamWindowCapturer.h" 7 8 #include "AudioStreamTrack.h" 9 #include "DOMMediaStream.h" 10 #include "MediaTrackGraph.h" 11 12 namespace mozilla { 13 using dom::AudioStreamTrack; 14 using dom::MediaStreamTrack; 15 16 NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaStreamWindowCapturer, 17 DOMMediaStream::TrackListener) 18 NS_IMPL_ADDREF_INHERITED(MediaStreamWindowCapturer, 19 DOMMediaStream::TrackListener) 20 NS_IMPL_RELEASE_INHERITED(MediaStreamWindowCapturer, 21 DOMMediaStream::TrackListener) 22 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(MediaStreamWindowCapturer) 23 NS_INTERFACE_MAP_END_INHERITING(DOMMediaStream::TrackListener) 24 25 MediaStreamWindowCapturer::CapturedTrack::CapturedTrack( 26 MediaStreamTrack* aTrack, uint64_t aWindowID) 27 : mTrack(aTrack), 28 mPort(aTrack->Graph()->ConnectToCaptureTrack(aWindowID, 29 aTrack->GetTrack())) {} 30 31 MediaStreamWindowCapturer::CapturedTrack::~CapturedTrack() { 32 if (mPort) { 33 mPort->Destroy(); 34 } 35 } 36 37 MediaStreamWindowCapturer::MediaStreamWindowCapturer(DOMMediaStream* aStream, 38 uint64_t aWindowId) 39 : mStream(aStream), mWindowId(aWindowId) { 40 nsTArray<RefPtr<AudioStreamTrack>> tracks; 41 mStream->GetAudioTracks(tracks); 42 for (const auto& t : tracks) { 43 if (t->Ended()) { 44 continue; 45 } 46 AddTrack(t); 47 } 48 } 49 50 MediaStreamWindowCapturer::~MediaStreamWindowCapturer() = default; 51 52 void MediaStreamWindowCapturer::NotifyTrackAdded( 53 const RefPtr<MediaStreamTrack>& aTrack) { 54 if (AudioStreamTrack* at = aTrack->AsAudioStreamTrack()) { 55 AddTrack(at); 56 } 57 } 58 59 void MediaStreamWindowCapturer::NotifyTrackRemoved( 60 const RefPtr<MediaStreamTrack>& aTrack) { 61 if (AudioStreamTrack* at = aTrack->AsAudioStreamTrack()) { 62 RemoveTrack(at); 63 } 64 } 65 66 void MediaStreamWindowCapturer::AddTrack(AudioStreamTrack* aTrack) { 67 if (aTrack->Ended()) { 68 return; 69 } 70 mTracks.AppendElement(MakeUnique<CapturedTrack>(aTrack, mWindowId)); 71 } 72 73 void MediaStreamWindowCapturer::RemoveTrack(AudioStreamTrack* aTrack) { 74 for (size_t i = mTracks.Length(); i > 0; --i) { 75 if (mTracks[i - 1]->mTrack == aTrack) { 76 mTracks.RemoveElementAt(i - 1); 77 break; 78 } 79 } 80 } 81 } // namespace mozilla