@@ -8,6 +8,7 @@
|
||||
|
||||
#include <modulus.hpp>
|
||||
#include <sonus/config.hpp>
|
||||
#include <sonus/sequence.hpp>
|
||||
|
||||
namespace sonus {
|
||||
|
||||
@@ -33,6 +34,9 @@ public:
|
||||
auto play_file(std::filesystem::path const &path, sonus::playback_options options = {}) -> std::expected<std::uint64_t, modulus::error>;
|
||||
auto stop(std::uint64_t handle) -> std::expected<void, modulus::error>;
|
||||
auto stop_all() -> void;
|
||||
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 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,79 @@
|
||||
#pragma once
|
||||
|
||||
#include <atomic>
|
||||
#include <cstdint>
|
||||
#include <expected>
|
||||
#include <filesystem>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include <modulus.hpp>
|
||||
|
||||
|
||||
namespace sonus {
|
||||
|
||||
namespace detail {
|
||||
|
||||
struct sequence_state;
|
||||
|
||||
class sequence_player;
|
||||
|
||||
}
|
||||
|
||||
enum class playback_status : std::uint8_t {
|
||||
PLAYING,
|
||||
COMPLETED,
|
||||
STOPPED,
|
||||
FAILED,
|
||||
};
|
||||
|
||||
struct sample_buffer {
|
||||
std::uint32_t sample_rate{};
|
||||
std::vector<std::float32_t> frames{};
|
||||
std::uint64_t loop_start{};
|
||||
std::uint64_t loop_end{};
|
||||
};
|
||||
|
||||
struct sample_event {
|
||||
std::uint32_t sample{};
|
||||
std::uint64_t start_frame{};
|
||||
std::uint64_t duration_frames{};
|
||||
std::float32_t gain{1.0F};
|
||||
};
|
||||
|
||||
struct sample_sequence {
|
||||
std::vector<sonus::sample_buffer> samples{};
|
||||
std::vector<sonus::sample_event> events{};
|
||||
std::vector<std::float32_t> release_envelope{};
|
||||
std::uint64_t duration_frames{};
|
||||
std::uint32_t max_voices{64};
|
||||
std::float32_t gain{0.25F};
|
||||
};
|
||||
|
||||
class prepared_sequence {
|
||||
public:
|
||||
static auto create(sonus::sample_sequence sequence, std::uint32_t sample_rate) -> std::expected<sonus::prepared_sequence, modulus::error>;
|
||||
prepared_sequence(prepared_sequence const &) = delete;
|
||||
auto operator=(prepared_sequence const &) -> prepared_sequence & = delete;
|
||||
prepared_sequence(prepared_sequence &&) noexcept;
|
||||
auto operator=(prepared_sequence &&) noexcept -> prepared_sequence &;
|
||||
~prepared_sequence();
|
||||
private:
|
||||
friend class sonus::detail::sequence_player;
|
||||
explicit prepared_sequence(std::unique_ptr<sonus::detail::sequence_state> state);
|
||||
std::unique_ptr<sonus::detail::sequence_state> state_;
|
||||
};
|
||||
|
||||
class playback_session {
|
||||
public:
|
||||
playback_session() = default;
|
||||
explicit playback_session(std::shared_ptr<std::atomic<sonus::playback_status>> status);
|
||||
auto status() const -> sonus::playback_status;
|
||||
auto stop() const -> void;
|
||||
private:
|
||||
std::shared_ptr<std::atomic<sonus::playback_status>> status_{};
|
||||
};
|
||||
|
||||
auto load_sample(std::filesystem::path const &path, std::uint32_t sample_rate) -> std::expected<sonus::sample_buffer, modulus::error>;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user