MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ register_backend_service()

void MayaFlux::Core::AudioSubsystem::register_backend_service ( )
private

Definition at line 224 of file AudioSubsystem.cpp.

225{
226 auto svc = std::make_shared<Registry::Service::AudioBackendService>();
227
228 svc->get_output_snapshot = [this]() -> std::span<const double> {
229 const double* ptr = m_snapshot_ptr.load(std::memory_order_acquire);
230 uint32_t sz = m_snapshot_size.load(std::memory_order_acquire);
231 if (!ptr || sz == 0)
232 return {};
233 return { ptr, sz };
234 };
235
236 svc->register_output_observer = [this](
237 std::function<void(const double*, uint32_t)> cb) -> uint32_t {
238 uint32_t id = m_next_observer_id.fetch_add(1, std::memory_order_relaxed);
239#ifdef MAYAFLUX_PLATFORM_MACOS
240 const ObserverMap* current = m_observers_ptr.load(std::memory_order_acquire);
241 const ObserverMap* next;
242 do {
243 auto* copy = new ObserverMap(*current);
244 (*copy)[id] = cb;
245 next = copy;
246 } while (!m_observers_ptr.compare_exchange_weak(
247 current, next,
248 std::memory_order_release, std::memory_order_acquire));
249 retire_observers(current);
250#else
251 auto current = m_observers.load(std::memory_order_acquire);
252 std::shared_ptr<ObserverMap> next;
253 do {
254 next = std::make_shared<ObserverMap>(*current);
255 (*next)[id] = cb;
256 } while (!m_observers.compare_exchange_weak(
257 current, next,
258 std::memory_order_release, std::memory_order_acquire));
259#endif
260 return id;
261 };
262
263 svc->unregister_output_observer = [this](uint32_t id) {
264#ifdef MAYAFLUX_PLATFORM_MACOS
265 const ObserverMap* current = m_observers_ptr.load(std::memory_order_acquire);
266 const ObserverMap* next;
267 do {
268 auto* copy = new ObserverMap(*current);
269 copy->erase(id);
270 next = copy;
271 } while (!m_observers_ptr.compare_exchange_weak(
272 current, next,
273 std::memory_order_release, std::memory_order_acquire));
274 retire_observers(current);
275#else
276 auto current = m_observers.load(std::memory_order_acquire);
277 std::shared_ptr<ObserverMap> next;
278 do {
279 next = std::make_shared<ObserverMap>(*current);
280 next->erase(id);
281 } while (!m_observers.compare_exchange_weak(
282 current, next,
283 std::memory_order_release, std::memory_order_acquire));
284#endif
285 };
286
289 .register_service<Registry::Service::AudioBackendService>(
290 [svc]() -> void* { return svc.get(); });
291}
glm::vec2 current
const uint8_t * ptr
std::atomic< std::shared_ptr< ObserverMap > > m_observers
std::atomic< uint32_t > m_snapshot_size
std::atomic< const double * > m_snapshot_ptr
std::unordered_map< uint32_t, std::function< void(const double *, uint32_t)> > ObserverMap
std::shared_ptr< Registry::Service::AudioBackendService > m_audio_backend_service
std::atomic< uint32_t > m_next_observer_id
void register_service(ServiceFactory factory)
Register a backend service capability.
static BackendRegistry & instance()
Get the global registry instance.

References current, MayaFlux::Registry::BackendRegistry::instance(), m_audio_backend_service, m_next_observer_id, m_observers, m_snapshot_ptr, m_snapshot_size, ptr, and MayaFlux::Registry::BackendRegistry::register_service().

Referenced by initialize().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: