@@ -9,6 +9,7 @@
|
||||
#include <modulus.hpp>
|
||||
#include <sonus/config.hpp>
|
||||
#include <sonus/sequence.hpp>
|
||||
#include <sonus/transport.hpp>
|
||||
|
||||
namespace sonus {
|
||||
|
||||
@@ -37,6 +38,7 @@ public:
|
||||
auto play_sequence(sonus::sample_sequence sequence) -> std::expected<sonus::playback_session, modulus::error>;
|
||||
auto play_sequence(sonus::prepared_sequence sequence) -> std::expected<sonus::playback_session, modulus::error>;
|
||||
auto stop_sequence() -> void;
|
||||
auto play_transport(sonus::prepared_transport transport) -> std::expected<sonus::transport_session, modulus::error>;
|
||||
auto is_playing(std::uint64_t handle) -> std::expected<std::bool_t, modulus::error>;
|
||||
auto collect_finished() -> std::uint64_t;
|
||||
auto active_sound_count() -> std::uint64_t;
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
#pragma once
|
||||
|
||||
#include <atomic>
|
||||
#include <cstdint>
|
||||
#include <expected>
|
||||
#include <filesystem>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <sonus/sequence.hpp>
|
||||
|
||||
|
||||
namespace sonus {
|
||||
|
||||
namespace detail {
|
||||
|
||||
struct transport_state;
|
||||
|
||||
class transport_player;
|
||||
|
||||
}
|
||||
|
||||
struct click_event {
|
||||
std::uint64_t frame{};
|
||||
bool downbeat{};
|
||||
};
|
||||
|
||||
struct transport_config {
|
||||
std::filesystem::path backing{};
|
||||
std::filesystem::path beat1{};
|
||||
std::filesystem::path beat2{};
|
||||
std::vector<sonus::click_event> clicks{};
|
||||
std::uint64_t duration_frames{};
|
||||
std::float32_t click_volume{0.45F};
|
||||
};
|
||||
|
||||
struct transport_progress {
|
||||
std::atomic<sonus::playback_status> status{sonus::playback_status::PLAYING};
|
||||
std::atomic<std::uint64_t> frames{};
|
||||
};
|
||||
|
||||
class transport_session {
|
||||
public:
|
||||
transport_session() = default;
|
||||
explicit transport_session(std::shared_ptr<sonus::transport_progress> progress);
|
||||
auto status() const -> sonus::playback_status;
|
||||
auto frames() const -> std::uint64_t;
|
||||
auto stop() const -> void;
|
||||
private:
|
||||
std::shared_ptr<sonus::transport_progress> progress_{};
|
||||
};
|
||||
|
||||
class prepared_transport {
|
||||
public:
|
||||
static auto create(sonus::transport_config config, std::uint32_t sample_rate, std::uint32_t channels) -> std::expected<sonus::prepared_transport, modulus::error>;
|
||||
prepared_transport(prepared_transport const &) = delete;
|
||||
auto operator=(prepared_transport const &) -> prepared_transport & = delete;
|
||||
prepared_transport(prepared_transport &&) noexcept;
|
||||
auto operator=(prepared_transport &&) noexcept -> prepared_transport &;
|
||||
~prepared_transport();
|
||||
private:
|
||||
friend class sonus::detail::transport_player;
|
||||
explicit prepared_transport(std::unique_ptr<sonus::detail::transport_state> state);
|
||||
std::unique_ptr<sonus::detail::transport_state> state_{};
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user