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
#include <psemek/audio/stream.hpp>
#include <psemek/util/function.hpp>
#include <psemek/audio/track.hpp>
#include <psemek/audio/recorder.hpp>
#include <utility>
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)
{
auto dup = make_duplicator(std::move(stream));
return {dup(), dup()};
auto track = make_duplicator(std::move(stream));
return {track->stream(), track->stream()};
}
}

View file

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

View file

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

View file

@ -10,9 +10,9 @@ namespace psemek::audio
struct loop_impl
: 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))
, 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<std::size_t> count_;
std::size_t repeated_ = 0;

View file

@ -70,7 +70,7 @@ namespace psemek::audio
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();
}