From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- dom/media/CrossGraphPort.h | 105 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 dom/media/CrossGraphPort.h (limited to 'dom/media/CrossGraphPort.h') diff --git a/dom/media/CrossGraphPort.h b/dom/media/CrossGraphPort.h new file mode 100644 index 0000000000..98d2a095d0 --- /dev/null +++ b/dom/media/CrossGraphPort.h @@ -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/. */ + +#ifndef MOZILLA_CROSS_GRAPH_TRACK_H_ +#define MOZILLA_CROSS_GRAPH_TRACK_H_ + +#include "AudioDriftCorrection.h" +#include "AudioSegment.h" +#include "ForwardedInputTrack.h" +#include "mozilla/SPSCQueue.h" +#include "mozilla/UniquePtr.h" + +namespace mozilla { +class CrossGraphReceiver; +} + +namespace mozilla::dom { +class AudioStreamTrack; +} + +namespace mozilla { + +/** + * See MediaTrackGraph::CreateCrossGraphTransmitter() + */ +class CrossGraphTransmitter : public ProcessedMediaTrack { + public: + CrossGraphTransmitter(TrackRate aSampleRate, + RefPtr aReceiver); + CrossGraphTransmitter* AsCrossGraphTransmitter() override { return this; } + + uint32_t NumberOfChannels() const override { + MOZ_CRASH("CrossGraphTransmitter has no segment. It cannot be played out."); + } + void ProcessInput(GraphTime aFrom, GraphTime aTo, uint32_t aFlags) override; + + private: + const RefPtr mReceiver; +}; + +/** + * See MediaTrackGraph::CreateCrossGraphReceiver() + */ +class CrossGraphReceiver : public ProcessedMediaTrack { + public: + CrossGraphReceiver(TrackRate aSampleRate, TrackRate aTransmitterRate); + CrossGraphReceiver* AsCrossGraphReceiver() override { return this; } + + uint32_t NumberOfChannels() const override; + void ProcessInput(GraphTime aFrom, GraphTime aTo, uint32_t aFlags) override; + + int EnqueueAudio(AudioChunk& aChunk); + + private: + SPSCQueue mCrossThreadFIFO{30}; + // Indicates that tre CrossGraphTransmitter has started sending frames. It + // is false untill the point, transmitter has sent the first valid frame. + // Accessed in GraphThread only. + bool mTransmitterHasStarted = false; + // Correct the drift between transmitter and receiver. Reciever (this class) + // is considered as the master clock. + // Accessed in GraphThread only. + AudioDriftCorrection mDriftCorrection; +}; + +class CrossGraphPort final { + public: + static UniquePtr Connect( + const RefPtr& aStreamTrack, + MediaTrackGraph* aPartnerGraph); + static UniquePtr Connect( + const RefPtr& aStreamTrack, AudioDeviceInfo* aSink, + nsPIDOMWindowInner* aWindow); + ~CrossGraphPort(); + + void AddAudioOutput(void* aKey); + void RemoveAudioOutput(void* aKey); + void SetAudioOutputVolume(void* aKey, float aVolume); + + RefPtr EnsureConnected(); + + const RefPtr mTransmitter; + const RefPtr mReceiver; + + private: + explicit CrossGraphPort(RefPtr aTransmitterPort, + RefPtr aTransmitter, + RefPtr aReceiver) + : mTransmitter(std::move(aTransmitter)), + mReceiver(std::move(aReceiver)), + mTransmitterPort(std::move(aTransmitterPort)) { + MOZ_ASSERT(mTransmitter); + MOZ_ASSERT(mReceiver); + MOZ_ASSERT(mTransmitterPort); + } + + // The port that connects the input track to the transmitter. + const RefPtr mTransmitterPort; +}; + +} // namespace mozilla + +#endif /* MOZILLA_CROSS_GRAPH_TRACK_H_ */ -- cgit v1.2.3