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
18namespace pixelbullet
19{
20class Filesystem;
21
23{
25 std::string resolved_path;
26 AudioPlaybackSettings settings;
27};
28
30{
31 std::thread audio_thread;
32 CommandQueue command_queue;
33 std::unique_ptr<AudioBackend> backend;
34 std::atomic<AudioPlaybackHandle::ValueType> next_handle_value{ 1 };
35 bool initialized = false;
36};
37
38namespace audio_internal
39{
40using BackendFactory = std::function<std::unique_ptr<AudioBackend>()>;
41
42enum class WorkerStepResult
43{
44 Command,
45 Timeout,
46 Closed,
47};
48
49inline constexpr auto k_worker_poll_timeout = std::chrono::milliseconds(50);
50
51class ScopedBackendFactoryOverride
52{
53public:
54 explicit ScopedBackendFactoryOverride(BackendFactory factory);
55 ~ScopedBackendFactoryOverride();
56
57 ScopedBackendFactoryOverride(const ScopedBackendFactoryOverride&) = delete;
58 ScopedBackendFactoryOverride& operator=(const ScopedBackendFactoryOverride&) = delete;
59
60private:
61 BackendFactory previous_factory_;
62};
63
64[[nodiscard]] std::unique_ptr<AudioBackend> CreateBackend();
65[[nodiscard]] bool InitializeBackend(AudioState& state);
66[[nodiscard]] bool InitializeBackend(AudioState& state, BackendFactory backend_factory);
67void ShutdownBackend(AudioState& state);
68void CloseWorkerThread(AudioState& state);
69void StartWorkerThread(AudioState& state);
70
71[[nodiscard]] AudioPlaybackHandle AllocatePlaybackHandle(AudioState& state) noexcept;
72[[nodiscard]] float ClampVolume(float volume) noexcept;
73[[nodiscard]] AudioSpatialSettings ClampSpatialSettings(AudioSpatialSettings settings) noexcept;
74[[nodiscard]] bool SubmitCommandIfInitialized(AudioState& state, const std::function<void()>& command);
75[[nodiscard]] std::optional<AudioPlaySoundRequest> BuildPlaySoundRequest(Filesystem& filesystem, AudioState& state,
76 const VirtualPath& file_path, AudioPlaybackSettings settings);
77
78[[nodiscard]] WorkerStepResult ProcessWorkerStep(AudioState& state, std::chrono::milliseconds timeout = k_worker_poll_timeout);
79void RunWorkerLoop(AudioState& state);
80} // namespace audio_internal
81} // namespace pixelbullet
A simple thread-safe command queue.
Definition command_queue.h:13
Definition filesystem.h:16
Definition virtual_path.h:10
Definition audio_internal.h:23
Definition audio_playback_handle.h:8
Definition audio_playback_settings.h:6
Definition audio_spatial_settings.h:6
Definition audio_internal.h:30