summaryrefslogtreecommitdiffstats
path: root/dom/media/CrossGraphPort.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/CrossGraphPort.h')
-rw-r--r--dom/media/CrossGraphPort.h105
1 files changed, 105 insertions, 0 deletions
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<CrossGraphReceiver> 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<CrossGraphReceiver> 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<AudioChunk> 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<CrossGraphPort> Connect(
+ const RefPtr<dom::AudioStreamTrack>& aStreamTrack,
+ MediaTrackGraph* aPartnerGraph);
+ static UniquePtr<CrossGraphPort> Connect(
+ const RefPtr<dom::AudioStreamTrack>& aStreamTrack, AudioDeviceInfo* aSink,
+ nsPIDOMWindowInner* aWindow);
+ ~CrossGraphPort();
+
+ void AddAudioOutput(void* aKey);
+ void RemoveAudioOutput(void* aKey);
+ void SetAudioOutputVolume(void* aKey, float aVolume);
+
+ RefPtr<GenericPromise> EnsureConnected();
+
+ const RefPtr<CrossGraphTransmitter> mTransmitter;
+ const RefPtr<CrossGraphReceiver> mReceiver;
+
+ private:
+ explicit CrossGraphPort(RefPtr<MediaInputPort> aTransmitterPort,
+ RefPtr<CrossGraphTransmitter> aTransmitter,
+ RefPtr<CrossGraphReceiver> 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<MediaInputPort> mTransmitterPort;
+};
+
+} // namespace mozilla
+
+#endif /* MOZILLA_CROSS_GRAPH_TRACK_H_ */