// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_AUDIO_AUDIO_LOGGING_H_ #define MEDIA_AUDIO_AUDIO_LOGGING_H_ #include <string> #include "base/memory/scoped_ptr.h" namespace media { class AudioParameters; // AudioLog logs state information about an active audio component. Each method // takes a |component_id| along with method specific information. Its methods // are safe to call from any thread. class AudioLog { public: virtual ~AudioLog() {} // Called when an audio component is created. |params| are the parameters of // the created stream. |device_id| is the id of the audio device opened by // the created stream. virtual void OnCreated(int component_id, const media::AudioParameters& params, const std::string& device_id) = 0; // Called when an audio component is started, generally this is synonymous // with "playing." virtual void OnStarted(int component_id) = 0; // Called when an audio component is stopped, generally this is synonymous // with "paused." virtual void OnStopped(int component_id) = 0; // Called when an audio component is closed, generally this is synonymous // with "deleted." virtual void OnClosed(int component_id) = 0; // Called when an audio component encounters an error. virtual void OnError(int component_id) = 0; // Called when an audio component changes volume. |volume| is the new volume. virtual void OnSetVolume(int component_id, double volume) = 0; }; // AudioLogFactory dispenses AudioLog instances to owning classes for tracking // AudioComponent behavior. All AudioComponents have the concept of an owning // class: // // - AudioInputRendererHost for AudioInputController // - AudioRendererHost for AudioOutputController // - AudioOutputDispatcherImpl for AudioOutputStream // // Each of these owning classes may own multiple instances of each component, as // such each AudioLog supports logging for multiple instances. class AudioLogFactory { public: enum AudioComponent { // Input controllers have a 1:1 mapping with streams, so there's no need to // track both controllers and streams. AUDIO_INPUT_CONTROLLER, // Output controllers may or may not be backed by an active stream, so we // need to track both controllers and streams. AUDIO_OUTPUT_CONTROLLER, AUDIO_OUTPUT_STREAM, AUDIO_COMPONENT_MAX }; // Create a new AudioLog object for tracking the behavior for one or more // instances of the given component. Each instance of an "owning" class must // create its own AudioLog. virtual scoped_ptr<AudioLog> CreateAudioLog(AudioComponent component) = 0; protected: virtual ~AudioLogFactory() {} }; } // namespace media #endif // MEDIA_AUDIO_AUDIO_LOGGING_H_