Turn audio::duplicator into a track
This commit is contained in:
parent
f46b080a69
commit
ce5ccfde70
5 changed files with 42 additions and 18 deletions
|
|
@ -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()};
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(){}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
};
|
||||
|
||||
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 [recorder]{
|
||||
return std::make_shared<duplicate_impl>(recorder);
|
||||
};
|
||||
return std::make_shared<duplicate_track_impl>(std::move(recorder));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue