Init
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
#include <sonus/detail/errors.hpp>
|
||||
#include <sonus/engine.hpp>
|
||||
@@ -0,0 +1,48 @@
|
||||
#pragma once
|
||||
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <expected>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include <modulus.hpp>
|
||||
|
||||
namespace sonus::detail {
|
||||
|
||||
constexpr std::int32_t error_invalid_argument{1};
|
||||
constexpr std::int32_t error_not_found{2};
|
||||
constexpr std::int32_t error_unavailable{3};
|
||||
constexpr std::int32_t error_internal{4};
|
||||
|
||||
auto make_error(std::int32_t code, std::string message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> modulus::error;
|
||||
auto fail_void(modulus::error error) -> std::expected<void, modulus::error>;
|
||||
auto fail_void(std::int32_t code, std::string message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> std::expected<void, modulus::error>;
|
||||
auto fail_void(std::expected<void, modulus::error> const& result) -> std::expected<void, modulus::error>;
|
||||
|
||||
template <typename VALUE>
|
||||
auto fail(modulus::error error) -> std::expected<VALUE, modulus::error>;
|
||||
|
||||
template <typename VALUE>
|
||||
auto fail(std::expected<void, modulus::error> const& result) -> std::expected<VALUE, modulus::error>;
|
||||
|
||||
template <typename VALUE>
|
||||
auto fail(std::int32_t code, std::string message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> std::expected<VALUE, modulus::error>;
|
||||
|
||||
}
|
||||
|
||||
template <typename VALUE>
|
||||
auto sonus::detail::fail(modulus::error error) -> std::expected<VALUE, modulus::error> {
|
||||
return modulus::fail<VALUE>(std::move(error));
|
||||
}
|
||||
|
||||
template <typename VALUE>
|
||||
auto sonus::detail::fail(std::expected<void, modulus::error> const& result) -> std::expected<VALUE, modulus::error> {
|
||||
assert(!result);
|
||||
return modulus::fail<VALUE>(result.error());
|
||||
}
|
||||
|
||||
template <typename VALUE>
|
||||
auto sonus::detail::fail(std::int32_t code, std::string message, modulus::source_location location) -> std::expected<VALUE, modulus::error> {
|
||||
return sonus::detail::fail<VALUE>(sonus::detail::make_error(code, std::move(message), location));
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
#pragma once
|
||||
|
||||
#include <chrono>
|
||||
#include <cstdint>
|
||||
#include <expected>
|
||||
#include <filesystem>
|
||||
#include <memory>
|
||||
|
||||
#include <modulus.hpp>
|
||||
#include <modulus/types.hpp>
|
||||
|
||||
namespace sonus {
|
||||
|
||||
struct audio_config {
|
||||
std::uint32_t sample_rate{48000};
|
||||
std::uint32_t channels{2};
|
||||
std::float32_t master_volume{0.70F};
|
||||
std::bool_t no_device{false};
|
||||
};
|
||||
|
||||
struct metronome_config {
|
||||
std::uint32_t bpm{120};
|
||||
std::uint32_t beats_per_bar{4};
|
||||
std::float32_t volume{0.45F};
|
||||
std::float32_t beat_frequency_hz{1320.0F};
|
||||
std::float32_t downbeat_frequency_hz{1760.0F};
|
||||
std::chrono::milliseconds click_duration{35};
|
||||
};
|
||||
|
||||
struct playback_options {
|
||||
std::bool_t loop{false};
|
||||
std::float32_t volume{1.0F};
|
||||
std::bool_t stream{true};
|
||||
};
|
||||
|
||||
using sound_handle = std::uint64_t;
|
||||
|
||||
auto validate(sonus::audio_config const& config) -> std::expected<void, modulus::error>;
|
||||
auto validate(sonus::metronome_config const& config) -> std::expected<void, modulus::error>;
|
||||
auto validate(sonus::playback_options const& options) -> std::expected<void, modulus::error>;
|
||||
|
||||
class engine {
|
||||
public:
|
||||
static auto create(sonus::audio_config config = {}) -> std::expected<sonus::engine, modulus::error>;
|
||||
|
||||
engine(sonus::engine const&) = delete;
|
||||
auto operator=(sonus::engine const&) -> sonus::engine& = delete;
|
||||
engine(sonus::engine&& other) noexcept;
|
||||
auto operator=(sonus::engine&& other) noexcept -> sonus::engine&;
|
||||
~engine();
|
||||
|
||||
auto start() -> std::expected<void, modulus::error>;
|
||||
auto stop() -> void;
|
||||
auto started() const -> std::bool_t;
|
||||
auto sample_rate() const -> std::uint32_t;
|
||||
auto channels() const -> std::uint32_t;
|
||||
auto set_master_volume(std::float32_t volume) -> std::expected<void, modulus::error>;
|
||||
|
||||
auto play_file(std::filesystem::path const& path, sonus::playback_options options = {}) -> std::expected<sonus::sound_handle, modulus::error>;
|
||||
auto stop(sonus::sound_handle handle) -> std::expected<void, modulus::error>;
|
||||
auto stop_all() -> void;
|
||||
|
||||
auto start_metronome(sonus::metronome_config config = {}) -> std::expected<void, modulus::error>;
|
||||
auto update_metronome(sonus::metronome_config config) -> std::expected<void, modulus::error>;
|
||||
auto stop_metronome() -> void;
|
||||
auto metronome_active() const -> std::bool_t;
|
||||
|
||||
auto render(std::float32_t* output, std::uint64_t frame_count) -> std::expected<void, modulus::error>;
|
||||
|
||||
private:
|
||||
struct impl;
|
||||
|
||||
explicit engine(std::unique_ptr<sonus::engine::impl> implementation) noexcept;
|
||||
|
||||
std::unique_ptr<sonus::engine::impl> implementation_;
|
||||
};
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user