8struct AudioBackendService;
32 void register_callbacks()
override;
35 void start()
override;
38 void pause()
override;
41 void resume()
override;
47 void shutdown()
override;
53 inline bool is_ready()
const override {
return m_is_ready; }
56 inline bool is_running()
const override {
return m_is_running.load(); }
59 void wait_until_running()
override;
82 int process_input(
double* input_buffer,
unsigned int num_frames);
94 int process_output(
double* output_buffer,
unsigned int num_frames);
106 int process_audio(
double* input_buffer,
double* output_buffer,
unsigned int num_frames);
122 using ObserverMap = std::unordered_map<uint32_t, std::function<void(
const double*, uint32_t)>>;
123 void register_backend_service();
140 std::atomic<bool> m_is_running {
false };
141 std::atomic<int> m_callback_active { 0 };
143 std::atomic<uint32_t> m_next_observer_id { 1 };
144 std::atomic<bool> m_notify_running {
false };
146 alignas(64) std::atomic<const double*> m_snapshot_ptr {
nullptr };
147 std::atomic<uint64_t> m_snapshot_generation { 0 };
148 std::atomic<uint32_t> m_snapshot_size { 0 };
153#ifdef MAYAFLUX_PLATFORM_MACOS
155 std::atomic<const ObserverMap*> m_observers_ptr {
nullptr };
157 static constexpr size_t MAX_OBSERVER_READERS = 8;
158 mutable std::array<std::atomic<const ObserverMap*>, MAX_OBSERVER_READERS> m_obs_hazard_ptrs {};
159 mutable std::atomic<size_t> m_obs_hazard_counter { 0 };
161 std::pair<const ObserverMap*, size_t> acquire_observers()
const;
162 void release_observers(
size_t slot)
const;
163 void retire_observers(
const ObserverMap* old);
164 std::vector<const ObserverMap*> m_obs_retired;
166 std::atomic<std::shared_ptr<ObserverMap>> m_observers {
167 std::make_shared<ObserverMap>()
Manages audio endpoint discovery and enumeration.
Manages digital audio data flow between the engine and hardware.
SubsystemProcessingHandle * get_processing_context_handle() override
Get the processing context handle for this subsystem.
SubsystemType get_type() const override
Get the type of this subsystem.
std::unique_ptr< IAudioBackend > m_audiobackend
Audio backend implementation.
bool is_ready() const override
Check if audio subsystem is ready for operation.
bool is_running() const override
Check if audio subsystem is currently running.
const AudioDevice * get_device_manager() const
Get read-only access to device manager.
GlobalStreamInfo m_stream_info
Audio stream configuration.
SubsystemProcessingHandle * m_handle
Reference to processing handle.
const AudioStream * get_stream_manager() const
Get read-only access to stream manager.
std::thread m_notify_thread
IAudioBackend * get_audio_backend()
Get access to the underlying audio backend.
std::unordered_map< uint32_t, std::function< void(const double *, uint32_t)> > ObserverMap
SubsystemTokens get_tokens() const override
Get audio subsystem token configuration.
std::vector< double > m_snapshot_copy
Owned copy of the last output cycle; decouples notification-thread reads from the callback write buff...
const GlobalStreamInfo & get_stream_info() const
Get global stream configuration.
SubsystemTokens m_subsystem_tokens
Processing token configuration.
std::shared_ptr< Registry::Service::AudioBackendService > m_audio_backend_service
std::unique_ptr< AudioDevice > m_audio_device
Audio device manager.
std::unique_ptr< AudioStream > m_audio_stream
Audio stream manager.
virtual ~AudioSubsystem()=default
Audio processing subsystem managing real-time audio I/O and processing.
Interface for audio system abstraction layer.
Base interface for all subsystems in the MayaFlux processing architecture.
Unified interface combining buffer and node processing for subsystems.
Comprehensive configuration for digital audio stream processing.
Processing token configuration for subsystem operation.