ActiveAudioCaptureRegistry.java

package org.hammer.audio;

import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;

/**
 * Process-local registry for the capture service currently running in the desktop application.
 *
 * <p>This is an application-infrastructure bridge for host controls such as experiment recording;
 * it is not part of the audio-domain model and does not replace dependency injection inside views.
 */
public final class ActiveAudioCaptureRegistry {

  private static final AtomicReference<AudioCaptureService> ACTIVE = new AtomicReference<>();

  private ActiveAudioCaptureRegistry() {
    // utility class
  }

  /** Mark a service active after its producer has started successfully. */
  public static void activate(AudioCaptureService service) {
    ACTIVE.set(java.util.Objects.requireNonNull(service, "service"));
  }

  /** Remove a service only if it is still the active instance. */
  public static void deactivate(AudioCaptureService service) {
    ACTIVE.compareAndSet(service, null);
  }

  /** Return the currently running desktop capture service, if any. */
  public static Optional<AudioCaptureService> current() {
    AudioCaptureService service = ACTIVE.get();
    if (service == null || !service.isRunning()) {
      return Optional.empty();
    }
    return Optional.of(service);
  }
}