// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef SERVICES_AUDIO_OUTPUT_CONTROLLER_H_ #define SERVICES_AUDIO_OUTPUT_CONTROLLER_H_ #include <stdint.h> #include <memory> #include <optional> #include <string> #include <string_view> #include <utility> #include <vector> #include "base/atomic_ref_count.h" #include "base/compiler_specific.h" #include "base/functional/callback.h" #include "base/memory/raw_ptr.h" #include "base/memory/raw_ptr_exclusion.h" #include "base/task/single_thread_task_runner.h" #include "base/time/time.h" #include "base/timer/timer.h" #include "base/unguessable_token.h" #include "build/build_config.h" #include "media/audio/audio_io.h" #include "media/audio/audio_manager.h" #include "media/base/audio_power_monitor.h" #include "services/audio/loopback_group_member.h" // An OutputController controls an AudioOutputStream and provides data to this // output stream. It executes audio operations like play, pause, stop, etc. on // the audio manager thread, while the audio data flow occurs on the platform's // realtime audio thread. // // Here is a state transition diagram for the OutputController: // // *[ Empty ] --> [ Created ] --> [ Playing ] -------. // | | | ^ | // | | | | | // | | | | v // | | | `----- [ Paused ] // | | | | // | v v | // `-----------> [ Closed ] <-----------' // // * Initial state // // At any time after reaching the Created state but before Closed, the // OutputController may be notified of a device change via OnDeviceChange(). As // the OnDeviceChange() is processed, state transitions will occur, ultimately // ending up in an equivalent pre-call state. E.g., if the state was Paused, // the new state will be Created, since these states are all functionally // equivalent and require a Play() call to continue to the next state. // // The AudioOutputStream can request data from the OutputController via the // AudioSourceCallback interface. OutputController uses the SyncReader passed to // it via construction to synchronously fulfill this read request. namespace audio { class OutputController : public media::AudioOutputStream::AudioSourceCallback, public LoopbackGroupMember { … }; } // namespace audio #endif // SERVICES_AUDIO_OUTPUT_CONTROLLER_H_