Index: services/media/audio/platform/generic/standard_output_base.h |
diff --git a/services/media/audio/platform/generic/standard_output_base.h b/services/media/audio/platform/generic/standard_output_base.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fe3205a9a77901777c208781a7da46769c153f3f |
--- /dev/null |
+++ b/services/media/audio/platform/generic/standard_output_base.h |
@@ -0,0 +1,117 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef SERVICES_MEDIA_AUDIO_PLATFORM_GENERIC_STANDARD_OUTPUT_BASE_H_ |
+#define SERVICES_MEDIA_AUDIO_PLATFORM_GENERIC_STANDARD_OUTPUT_BASE_H_ |
+ |
+#include "base/callback.h" |
+#include "mojo/services/media/common/cpp/linear_transform.h" |
+#include "mojo/services/media/common/cpp/local_time.h" |
+#include "mojo/services/media/common/interfaces/media_common.mojom.h" |
+#include "mojo/services/media/common/interfaces/media_types.mojom.h" |
+#include "services/media/audio/audio_output.h" |
+#include "services/media/audio/audio_track_to_output_link.h" |
+#include "services/media/audio/platform/generic/mixer.h" |
+ |
+namespace mojo { |
+namespace media { |
+namespace audio { |
+ |
+class StandardOutputBase : public AudioOutput { |
+ public: |
+ ~StandardOutputBase() override; |
+ |
+ protected: |
+ struct MixJob { |
+ static constexpr uint32_t INVALID_GENERATION = 0; |
+ |
+ // State for the job set up once by the output implementation and then used |
+ // by all tracks. |
+ void* buf; |
+ uint32_t buf_frames; |
+ int64_t start_pts_of; // start PTS, expressed in output frames. |
+ uint32_t local_to_output_gen; |
+ bool accumulate; |
+ const LinearTransform* local_to_output; |
+ |
+ // State for the job which is set up for each track during SetupMix |
+ uint32_t frames_produced; |
+ }; |
+ |
+ struct TrackBookkeeping : public AudioTrackToOutputLink::Bookkeeping { |
+ TrackBookkeeping(); |
+ ~TrackBookkeeping() override; |
+ |
+ LinearTransform lt_to_track_frames; |
+ LinearTransform out_frames_to_track_frames; |
+ uint32_t lt_to_track_frames_gen = 0; |
+ uint32_t out_frames_to_track_frames_gen = MixJob::INVALID_GENERATION; |
+ uint32_t step_size; |
+ MixerPtr mixer; |
+ |
+ void UpdateTrackTrans(const AudioTrackImplPtr& track); |
+ void UpdateOutputTrans(const MixJob& job); |
+ }; |
+ |
+ explicit StandardOutputBase(AudioOutputManager* manager); |
+ |
+ void Process() final; |
+ MediaResult InitializeLink(const AudioTrackToOutputLinkPtr& link) final; |
+ |
+ void SetNextSchedTime(const LocalTime& next_sched_time) { |
+ next_sched_time_ = next_sched_time; |
+ next_sched_time_known_ = true; |
+ } |
+ |
+ void SetNextSchedDelay(const LocalDuration& next_sched_delay) { |
+ SetNextSchedTime(LocalClock::now() + next_sched_delay); |
+ } |
+ |
+ virtual bool StartMixJob(MixJob* job, const LocalTime& process_start) = 0; |
+ virtual bool FinishMixJob(const MixJob& job) = 0; |
+ virtual TrackBookkeeping* AllocBookkeeping(); |
+ |
+ LpcmMediaTypeDetailsPtr output_format_; |
+ uint32_t output_bytes_per_frame_; |
+ |
+ private: |
+ using TrackSetupTask = std::function<bool(const AudioTrackImplPtr& track, |
+ TrackBookkeeping* info)>; |
+ using TrackProcessTask = |
+ std::function<bool(const AudioTrackImplPtr& track, |
+ TrackBookkeeping* info, |
+ const AudioPipe::AudioPacketRefPtr& pkt_ref)>; |
+ |
+ void ForeachTrack(const TrackSetupTask& setup, |
+ const TrackProcessTask& process); |
+ |
+ bool SetupMix(const AudioTrackImplPtr& track, TrackBookkeeping* info); |
+ bool ProcessMix(const AudioTrackImplPtr& track, |
+ TrackBookkeeping* info, |
+ const AudioPipe::AudioPacketRefPtr& pkt_ref); |
+ |
+ bool SetupTrim(const AudioTrackImplPtr& track, TrackBookkeeping* info); |
+ bool ProcessTrim(const AudioTrackImplPtr& track, |
+ TrackBookkeeping* info, |
+ const AudioPipe::AudioPacketRefPtr& pkt_ref); |
+ |
+ LocalTime next_sched_time_; |
+ bool next_sched_time_known_; |
+ |
+ // State used by the mix task. |
+ TrackSetupTask setup_mix_; |
+ TrackProcessTask process_mix_; |
+ MixJob cur_mix_job_; |
+ |
+ // State used by the trim task. |
+ TrackSetupTask setup_trim_; |
+ TrackProcessTask process_trim_; |
+ int64_t trim_threshold_; |
+}; |
+ |
+} // namespace audio |
+} // namespace media |
+} // namespace mojo |
+ |
+#endif // SERVICES_MEDIA_AUDIO_PLATFORM_GENERIC_STANDARD_OUTPUT_BASE_H_ |