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
|
#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()};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(){}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue