diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /dom/media/AudioStreamTrack.cpp | |
parent | Initial commit. (diff) | |
download | firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/media/AudioStreamTrack.cpp')
-rw-r--r-- | dom/media/AudioStreamTrack.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/dom/media/AudioStreamTrack.cpp b/dom/media/AudioStreamTrack.cpp new file mode 100644 index 0000000000..71525a0176 --- /dev/null +++ b/dom/media/AudioStreamTrack.cpp @@ -0,0 +1,105 @@ +/* -*- 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 "AudioStreamTrack.h" + +#include "MediaTrackGraph.h" +#include "nsContentUtils.h" + +namespace mozilla::dom { + +void AudioStreamTrack::AddAudioOutput(void* aKey) { + if (Ended()) { + return; + } + if (UniquePtr<CrossGraphPort>* cgm = mCrossGraphs.Get(aKey)) { + (*cgm)->AddAudioOutput(aKey); + return; + } + mTrack->AddAudioOutput(aKey); +} + +void AudioStreamTrack::RemoveAudioOutput(void* aKey) { + if (Ended()) { + return; + } + if (UniquePtr<CrossGraphPort>* cgm = mCrossGraphs.Get(aKey)) { + (*cgm)->RemoveAudioOutput(aKey); + return; + } + mTrack->RemoveAudioOutput(aKey); +} + +void AudioStreamTrack::SetAudioOutputVolume(void* aKey, float aVolume) { + if (Ended()) { + return; + } + if (UniquePtr<CrossGraphPort>* cgm = mCrossGraphs.Get(aKey)) { + (*cgm)->SetAudioOutputVolume(aKey, aVolume); + return; + } + mTrack->SetAudioOutputVolume(aKey, aVolume); +} + +void AudioStreamTrack::GetLabel(nsAString& aLabel, CallerType aCallerType) { + if (nsContentUtils::ResistFingerprinting(aCallerType)) { + aLabel.AssignLiteral("Internal Microphone"); + return; + } + MediaStreamTrack::GetLabel(aLabel, aCallerType); +} + +already_AddRefed<MediaStreamTrack> AudioStreamTrack::CloneInternal() { + return do_AddRef(new AudioStreamTrack(mWindow, mInputTrack, mSource, + ReadyState(), Muted(), mConstraints)); +} + +void AudioStreamTrack::SetReadyState(MediaStreamTrackState aState) { + if (!mCrossGraphs.IsEmpty() && !Ended() && + mReadyState == MediaStreamTrackState::Live && + aState == MediaStreamTrackState::Ended) { + for (auto iter = mCrossGraphs.Iter(); !iter.Done(); iter.Next()) { + (*iter.Data())->Destroy(); + (*iter.Data()).reset(); + } + mCrossGraphs.Clear(); + } + MediaStreamTrack::SetReadyState(aState); +} + +RefPtr<GenericPromise> AudioStreamTrack::SetAudioOutputDevice( + void* key, AudioDeviceInfo* aSink) { + MOZ_ASSERT(aSink); + + if (Ended()) { + return GenericPromise::CreateAndResolve(true, __func__); + } + + UniquePtr<CrossGraphPort> manager = + CrossGraphPort::Connect(this, aSink, mWindow); + if (!manager) { + // We are setting the default output device. + auto entry = mCrossGraphs.Lookup(key); + if (entry) { + // There is an existing non-default output device for this track. Remove + // it. + (*entry.Data())->Destroy(); + entry.Remove(); + } + return GenericPromise::CreateAndResolve(true, __func__); + } + + // We are setting a non-default output device. + UniquePtr<CrossGraphPort>& crossGraphPtr = *mCrossGraphs.LookupOrAdd(key); + if (crossGraphPtr) { + // This key already has a non-default output device set. Destroy it. + crossGraphPtr->Destroy(); + } + + crossGraphPtr = std::move(manager); + return crossGraphPtr->EnsureConnected(); +} + +} // namespace mozilla::dom |