PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
audio_internal.h
1#pragma once
2
3#include "pixelbullet/audio/audio_backend.h"
4#include "pixelbullet/audio/audio_playback_handle.h"
5#include "pixelbullet/audio/audio_playback_settings.h"
6#include "pixelbullet/audio/audio_spatial_settings.h"
7#include "pixelbullet/audio/command_queue.h"
8#include "pixelbullet/filesystem/virtual_path.h"
9
10#include <atomic>
11#include <chrono>
12#include <functional>
13#include <memory>
14#include <optional>
15#include <string>
16#include <thread>
17
18#include <glm/glm.hpp>
19
20namespace pixelbullet
21{
22class Filesystem;
23
24namespace audio_internal
25{
27{
29 std::string resolved_path;
30 AudioPlaybackSettings settings;
31};
32
34{
35 std::thread audio_thread;
36 CommandQueue command_queue;
37 std::unique_ptr<AudioBackend> backend;
38 std::atomic<AudioPlaybackHandle::ValueType> next_handle_value{ 1 };
39 bool initialized = false;
40};
41
42using BackendFactory = std::function<std::unique_ptr<AudioBackend>()>;
43
44enum class WorkerStepResult
45{
46 Command,
47 Timeout,
48 Closed,
49};
50
51inline constexpr auto k_worker_poll_timeout = std::chrono::milliseconds(50);
52
54{
55 glm::vec3 position = glm::vec3(0.0f);
56 glm::vec3 forward = glm::vec3(0.0f, 0.0f, -1.0f);
57 glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f);
58};
59
60[[nodiscard]] std::unique_ptr<AudioBackend> create_backend();
61[[nodiscard]] bool initialize_backend(AudioState& state);
62[[nodiscard]] bool initialize_backend(AudioState& state, BackendFactory backend_factory);
63void shutdown_backend(AudioState& state);
64void close_worker_thread(AudioState& state);
65void start_worker_thread(AudioState& state);
66
67[[nodiscard]] AudioPlaybackHandle allocate_playback_handle(AudioState& state) noexcept;
68[[nodiscard]] AudioLoadMode resolve_load_mode(AudioPlaybackSettings settings) noexcept;
69[[nodiscard]] float sanitize_volume(float volume) noexcept;
70[[nodiscard]] AudioSpatialSettings sanitize_spatial_settings(AudioSpatialSettings settings) noexcept;
71[[nodiscard]] bool is_valid_playback_position(glm::vec3 position) noexcept;
72[[nodiscard]] std::optional<AudioPlaybackSettings> sanitize_playback_settings(AudioPlaybackSettings settings) noexcept;
73[[nodiscard]] std::optional<AudioListenerTransform> sanitize_listener_transform(glm::vec3 position, glm::vec3 forward,
74 glm::vec3 up) noexcept;
75[[nodiscard]] bool submit_command_if_initialized(AudioState& state, std::function<void()> command);
76[[nodiscard]] std::optional<AudioPlaySoundRequest> build_play_sound_request(Filesystem& filesystem, AudioState& state,
77 const VirtualPath& file_path, AudioPlaybackSettings settings);
78
79[[nodiscard]] WorkerStepResult process_worker_step(AudioState& state, std::chrono::milliseconds timeout = k_worker_poll_timeout);
80void run_worker_loop(AudioState& state);
81} // namespace audio_internal
82} // namespace pixelbullet
Definition filesystem.h:19
Definition virtual_path.h:10
A simple thread-safe command queue.
Definition command_queue.h:14
Definition audio_playback_handle.h:8
Definition audio_playback_settings.h:11
Definition audio_spatial_settings.h:6
Definition audio_internal.h:34