13 std::shared_ptr<Nodes::NodeGraphManager> node_graph_manager,
14 std::shared_ptr<Buffers::BufferManager> buffer_manager,
15 std::shared_ptr<Vruta::TaskScheduler> task_scheduler,
16 std::shared_ptr<Core::WindowManager> window_manager)
17 : m_node_graph_manager(
std::move(node_graph_manager))
18 , m_buffer_manager(
std::move(buffer_manager))
19 , m_task_scheduler(
std::move(task_scheduler))
20 , m_window_manager(
std::move(window_manager))
24 std::source_location::current(),
25 "SubsystemManager requires valid NodeGraphManager");
29 std::source_location::current(),
30 "SubsystemManager requires valid BufferManager");
34 std::source_location::current(),
35 "SubsystemManager requires valid TaskScheduler");
39 "No WindowManager provided - Graphics subsystems will be unavailable");
51 error<std::runtime_error>(
54 std::source_location::current(),
55 "Cannot create GraphicsSubsystem without a valid WindowManager");
63 auto tokens = subsystem->get_tokens();
64 auto handle = std::make_unique<SubsystemProcessingHandle>(
71 subsystem->initialize(*handle);
72 subsystem->register_callbacks();
97 if (subsystem->is_ready()) {
106 if (subsystem->is_running()) {
115 if (subsystem->is_ready()) {
129 it->second->shutdown();
138 std::unordered_map<SubsystemType, std::pair<bool, bool>> statuses;
140 if (subsystem ==
nullptr) {
141 statuses[type] = {
false,
false };
144 statuses[type] = { subsystem->is_ready(), subsystem->is_running() };
152 if (subsystem && subsystem->is_running()) {
153 subsystem->shutdown();
175 std::shared_lock lock(
m_mutex);
185 auto target_token =
m_subsystems[target_type]->get_tokens();
199 "Invalid subsystem type: Subsystem not found.");
203 auto handle = subsystem_it->second->get_processing_context_handle();
206 "Invalid processing context handle: Handle is null.");
221 "Invalid process hook: Hook cannot be null or invalid.");
226 handle->pre_process_hooks[name] = std::move(hook);
228 handle->post_process_hooks[name] = std::move(hook);
238 if (handle->pre_process_hooks.erase(name) == 0) {
239 handle->post_process_hooks.erase(name);
249 return handle->pre_process_hooks.contains(name) || handle->post_process_hooks.contains(name);
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
static MayaFlux::Nodes::ProcessingToken token
std::shared_ptr< Buffers::BufferManager > m_buffer_manager
void unregister_process_hook(SubsystemType type, const std::string &name)
Remove a previously registered processing hook.
bool has_process_hook(SubsystemType type, const std::string &name)
Check if a processing hook exists.
std::shared_ptr< Nodes::NodeGraphManager > m_node_graph_manager
void pause_all_subsystems()
Pause all subsystems.
std::shared_ptr< Vruta::TaskScheduler > m_task_scheduler
void create_graphics_subsystem(const GlobalGraphicsConfig &graphics_config)
Create and register the graphics subsystem.
void resume_all_subsystems()
Resume all paused subsystems.
std::unordered_map< SubsystemType, std::unordered_set< SubsystemType > > m_cross_access_permissions
void register_process_hook(SubsystemType type, const std::string &name, ProcessHook hook, HookPosition position=HookPosition::POST_PROCESS)
Register a processing hook for a specific subsystem.
bool has_subsystem(SubsystemType type) const
Check if a subsystem type exists.
void allow_cross_access(SubsystemType from, SubsystemType to)
Configure cross-subsystem data access permissions.
std::shared_ptr< AudioSubsystem > get_audio_subsystem()
Get typed access to the audio subsystem.
void add_subsystem(SubsystemType type, const std::shared_ptr< ISubsystem > &subsystem)
Register a subsystem instance with the manager.
std::shared_ptr< ISubsystem > get_subsystem(SubsystemType type)
Get access to a specific subsystem by type.
SubsystemManager(std::shared_ptr< Nodes::NodeGraphManager > node_graph_manager, std::shared_ptr< Buffers::BufferManager > buffer_manager, std::shared_ptr< Vruta::TaskScheduler > task_scheduler, std::shared_ptr< Core::WindowManager > window_manager=nullptr)
Constructs SubsystemManager with required processing managers.
void start_all_subsystems()
Start all registered subsystems in coordination.
std::shared_ptr< Core::WindowManager > m_window_manager
bool is_cross_access_allowed(SubsystemType from, SubsystemType to) const
void shutdown()
Shutdown all subsystems in proper order.
std::unordered_map< SubsystemType, std::pair< bool, bool > > query_subsystem_status() const
Query operational status of all subsystems.
std::unordered_map< SubsystemType, std::unique_ptr< SubsystemProcessingHandle > > m_handles
void remove_subsystem(SubsystemType type)
Remove and shutdown a subsystem.
SubsystemProcessingHandle * get_validated_handle(SubsystemType type) const
Get processing handle with validation.
std::unordered_map< SubsystemType, std::shared_ptr< ISubsystem > > m_subsystems
std::optional< std::span< const double > > read_cross_subsystem_buffer(SubsystemType requesting_type, SubsystemType target_type, uint32_t channel)
Read data from another subsystem's buffers.
std::shared_ptr< GraphicsSubsystem > get_graphics_subsystem()
Get typed access to the graphics subsystem.
void create_audio_subsystem(GlobalStreamInfo &stream_info, Utils::AudioBackendType backend_type)
Create and register the audio subsystem.
std::shared_mutex m_mutex
Thread safety for subsystem operations.
Unified interface combining buffer and node processing for subsystems.
std::function< void(unsigned int num_frames)> ProcessHook
Function type for process hooks that can be registered with the engine.
HookPosition
Defines the position in the processing cycle where a hook should be executed.
@ PRE_PROCESS
Execute hook before any audio processing occurs.
@ Init
Engine/subsystem initialization.
@ Runtime
General runtime operations (default fallback)
@ Core
Core engine, backend, subsystems.
Comprehensive configuration for digital audio stream processing.