Turn audio::duplicator into a track

This commit is contained in:
Nikita Lisitsa 2022-10-08 14:16:50 +03:00
parent f46b080a69
commit ce5ccfde70
5 changed files with 42 additions and 18 deletions

View file

@ -1,21 +1,25 @@
#pragma once #pragma once
#include <psemek/audio/stream.hpp> #include <psemek/audio/stream.hpp>
#include <psemek/util/function.hpp> #include <psemek/audio/track.hpp>
#include <psemek/audio/recorder.hpp>
#include <utility> #include <utility>
namespace psemek::audio namespace psemek::audio
{ {
using duplicator = util::function<stream_ptr()>; track_ptr make_duplicator(std::shared_ptr<recorder> 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<stream_ptr, stream_ptr> duplicate(stream_ptr stream) inline std::pair<stream_ptr, stream_ptr> duplicate(stream_ptr stream)
{ {
auto dup = make_duplicator(std::move(stream)); auto track = make_duplicator(std::move(stream));
return {dup(), dup()}; return {track->stream(), track->stream()};
} }
} }

View file

@ -2,13 +2,15 @@
#include <psemek/audio/stream.hpp> #include <psemek/audio/stream.hpp>
#include <optional>
namespace psemek::audio namespace psemek::audio
{ {
struct track struct track
{ {
virtual stream_ptr stream() const = 0; virtual stream_ptr stream() const = 0;
virtual std::size_t length() const = 0; virtual std::optional<std::size_t> length() const = 0;
virtual ~track(){} virtual ~track(){}
}; };

View file

@ -9,10 +9,10 @@ namespace psemek::audio
namespace namespace
{ {
struct duplicate_impl struct duplicate_stream_impl
: stream : stream
{ {
duplicate_impl(std::shared_ptr<audio::recorder> recorder) duplicate_stream_impl(std::shared_ptr<recorder> recorder)
: recorder_(std::move(recorder)) : recorder_(std::move(recorder))
{} {}
@ -47,14 +47,32 @@ namespace psemek::audio
std::atomic<std::size_t> played_{0}; std::atomic<std::size_t> played_{0};
}; };
struct duplicate_track_impl
: track
{
duplicate_track_impl(std::shared_ptr<recorder> recorder)
: recorder_(std::move(recorder))
{}
stream_ptr stream() const override
{
return std::make_shared<duplicate_stream_impl>(recorder_);
}
std::optional<std::size_t> length() const override
{
return recorder_->length();
}
private:
std::shared_ptr<recorder> recorder_;
};
} }
duplicator make_duplicator(stream_ptr stream) track_ptr make_duplicator(std::shared_ptr<recorder> recorder)
{ {
auto recorder = make_recorder(std::move(stream)); return std::make_shared<duplicate_track_impl>(std::move(recorder));
return [recorder]{
return std::make_shared<duplicate_impl>(recorder);
};
} }
} }

View file

@ -10,9 +10,9 @@ namespace psemek::audio
struct loop_impl struct loop_impl
: stream : stream
{ {
loop_impl(duplicator dup, std::optional<std::size_t> count) loop_impl(track_ptr dup, std::optional<std::size_t> count)
: dup_(std::move(dup)) : dup_(std::move(dup))
, stream_(dup_()) , stream_(dup_->stream())
, count_(count) , count_(count)
{} {}
@ -34,7 +34,7 @@ namespace psemek::audio
if (count < need) if (count < need)
{ {
++repeated_; ++repeated_;
stream_ = dup_(); stream_ = dup_->stream();
} }
} }
return result; return result;
@ -46,7 +46,7 @@ namespace psemek::audio
} }
private: private:
duplicator dup_; track_ptr dup_;
stream_ptr stream_; stream_ptr stream_;
std::optional<std::size_t> count_; std::optional<std::size_t> count_;
std::size_t repeated_ = 0; std::size_t repeated_ = 0;

View file

@ -70,7 +70,7 @@ namespace psemek::audio
return std::make_shared<track_stream_impl>(data_); return std::make_shared<track_stream_impl>(data_);
} }
std::size_t length() const override std::optional<std::size_t> length() const override
{ {
return data_->samples.size(); return data_->samples.size();
} }