From ce5ccfde70813d6d96d72a4e8dc81702e77be2b8 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sat, 8 Oct 2022 14:16:50 +0300 Subject: [PATCH] Turn audio::duplicator into a track --- libs/audio/include/psemek/audio/duplicate.hpp | 14 +++++--- libs/audio/include/psemek/audio/track.hpp | 4 ++- libs/audio/source/duplicate.cpp | 32 +++++++++++++++---- libs/audio/source/effect/loop.cpp | 8 ++--- libs/audio/source/engine.cpp | 2 +- 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/libs/audio/include/psemek/audio/duplicate.hpp b/libs/audio/include/psemek/audio/duplicate.hpp index beef1b90..491a2eab 100644 --- a/libs/audio/include/psemek/audio/duplicate.hpp +++ b/libs/audio/include/psemek/audio/duplicate.hpp @@ -1,21 +1,25 @@ #pragma once #include -#include +#include +#include #include namespace psemek::audio { - using duplicator = util::function; + track_ptr make_duplicator(std::shared_ptr recorder); - duplicator make_duplicator(stream_ptr stream); + inline track_ptr make_duplicator(stream_ptr stream) + { + return make_duplicator(make_recorder(std::move(stream))); + } inline std::pair duplicate(stream_ptr stream) { - auto dup = make_duplicator(std::move(stream)); - return {dup(), dup()}; + auto track = make_duplicator(std::move(stream)); + return {track->stream(), track->stream()}; } } diff --git a/libs/audio/include/psemek/audio/track.hpp b/libs/audio/include/psemek/audio/track.hpp index e2aad14e..87b86e36 100644 --- a/libs/audio/include/psemek/audio/track.hpp +++ b/libs/audio/include/psemek/audio/track.hpp @@ -2,13 +2,15 @@ #include +#include + namespace psemek::audio { struct track { virtual stream_ptr stream() const = 0; - virtual std::size_t length() const = 0; + virtual std::optional length() const = 0; virtual ~track(){} }; diff --git a/libs/audio/source/duplicate.cpp b/libs/audio/source/duplicate.cpp index ade8d165..0f2d6362 100644 --- a/libs/audio/source/duplicate.cpp +++ b/libs/audio/source/duplicate.cpp @@ -9,10 +9,10 @@ namespace psemek::audio namespace { - struct duplicate_impl + struct duplicate_stream_impl : stream { - duplicate_impl(std::shared_ptr recorder) + duplicate_stream_impl(std::shared_ptr recorder) : recorder_(std::move(recorder)) {} @@ -47,14 +47,32 @@ namespace psemek::audio std::atomic played_{0}; }; + struct duplicate_track_impl + : track + { + duplicate_track_impl(std::shared_ptr recorder) + : recorder_(std::move(recorder)) + {} + + stream_ptr stream() const override + { + return std::make_shared(recorder_); + } + + std::optional length() const override + { + return recorder_->length(); + } + + private: + std::shared_ptr recorder_; + }; + } - duplicator make_duplicator(stream_ptr stream) + track_ptr make_duplicator(std::shared_ptr recorder) { - auto recorder = make_recorder(std::move(stream)); - return [recorder]{ - return std::make_shared(recorder); - }; + return std::make_shared(std::move(recorder)); } } diff --git a/libs/audio/source/effect/loop.cpp b/libs/audio/source/effect/loop.cpp index 3ae970fe..10f20ce5 100644 --- a/libs/audio/source/effect/loop.cpp +++ b/libs/audio/source/effect/loop.cpp @@ -10,9 +10,9 @@ namespace psemek::audio struct loop_impl : stream { - loop_impl(duplicator dup, std::optional count) + loop_impl(track_ptr dup, std::optional count) : dup_(std::move(dup)) - , stream_(dup_()) + , stream_(dup_->stream()) , count_(count) {} @@ -34,7 +34,7 @@ namespace psemek::audio if (count < need) { ++repeated_; - stream_ = dup_(); + stream_ = dup_->stream(); } } return result; @@ -46,7 +46,7 @@ namespace psemek::audio } private: - duplicator dup_; + track_ptr dup_; stream_ptr stream_; std::optional count_; std::size_t repeated_ = 0; diff --git a/libs/audio/source/engine.cpp b/libs/audio/source/engine.cpp index 92432275..64e06808 100644 --- a/libs/audio/source/engine.cpp +++ b/libs/audio/source/engine.cpp @@ -70,7 +70,7 @@ namespace psemek::audio return std::make_shared(data_); } - std::size_t length() const override + std::optional length() const override { return data_->samples.size(); }