Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(279)

Side by Side Diff: chromecast/public/cast_media_shlib.h

Issue 2712883006: [Chromecast] Add new volume control API to CastMediaShlib (Closed)
Patch Set: Address Alok's comments Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROMECAST_PUBLIC_CAST_MEDIA_SHLIB_H_ 5 #ifndef CHROMECAST_PUBLIC_CAST_MEDIA_SHLIB_H_
6 #define CHROMECAST_PUBLIC_CAST_MEDIA_SHLIB_H_ 6 #define CHROMECAST_PUBLIC_CAST_MEDIA_SHLIB_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <string> 10 #include <string>
11 #include <vector> 11 #include <vector>
12 12
13 #include "chromecast_export.h" 13 #include "chromecast_export.h"
14 14
15 namespace chromecast { 15 namespace chromecast {
16 namespace media { 16 namespace media {
17 17
18 enum SampleFormat : int; 18 enum SampleFormat : int;
19 19
20 class MediaPipelineBackend; 20 class MediaPipelineBackend;
21 struct MediaPipelineDeviceParams; 21 struct MediaPipelineDeviceParams;
22 class VideoPlane; 22 class VideoPlane;
23 23
24 // Audio content types for volume control. Each content type has a separate
25 // volume and mute state.
26 enum class AudioContentType {
27 kMedia, // Normal audio playback; also used for system sound effects.
28 kAlarm, // Alarm sounds.
29 kCommunication, // Voice communication, eg assistant TTS.
30 };
31
32 // Observer for volume/mute state changes. This is useful to detect volume
33 // changes that occur outside of cast_shell. Add/RemoveVolumeObserver() must not
34 // be called synchronously from OnVolumeChange() or OnMuteChange().
35 class VolumeObserver {
36 public:
37 // Called whenever the volume changes for a given stream |type|. May be called
38 // on an arbitrary thread.
39 virtual void OnVolumeChange(AudioContentType type, float new_volume) = 0;
40
41 // Called whenever the mute state changes for a given stream |type|. May be
42 // called on an arbitrary thread.
43 virtual void OnMuteChange(AudioContentType type, bool new_muted) = 0;
44
45 protected:
46 virtual ~VolumeObserver() = default;
47 };
48
24 // Provides access to platform-specific media systems and hardware resources. 49 // Provides access to platform-specific media systems and hardware resources.
25 // In cast_shell, all usage is from the browser process. An implementation is 50 // In cast_shell, all usage is from the browser process. An implementation is
26 // assumed to be in an uninitialized state initially. When uninitialized, no 51 // assumed to be in an uninitialized state initially. When uninitialized, no
27 // API calls will be made except for Initialize, which brings the implementation 52 // API calls will be made except for Initialize, which brings the implementation
28 // into an initialized state. A call to Finalize returns the implementation to 53 // into an initialized state. A call to Finalize returns the implementation to
29 // its uninitialized state. The implementation must support multiple 54 // its uninitialized state. The implementation must support multiple
30 // transitions between these states, to support resource grant/revoke events and 55 // transitions between these states, to support resource grant/revoke events and
31 // also to allow multiple unit tests to bring up the media systems in isolation 56 // also to allow multiple unit tests to bring up the media systems in isolation
32 // from other tests. 57 // from other tests.
58 //
59 // Volume control must run separately since it needs to be functional even when
60 // resources are revoked; since Finalize() is called when resources are revoked,
61 // and we need volume control to keep working, we need separate initialization.
62 // Therefore, Initialize() and Finalize() have no impact on the volume control
63 // API; instead, InitializeVolume() is called to initialize the volume control
64 // (before any volume control API methods are called), and FinalizeVolume() is
65 // called to clean up the volume control. All volume control methods are called
66 // on the same thread that calls InitializeVolume().
halliwell 2017/02/24 21:37:21 This is kind of clumsy. Would it be clearer just
kmackay 2017/02/24 23:53:29 Maybe? But the new class would probably ideally li
halliwell 2017/02/25 00:43:46 Yep, agreed, keeping in same shared lib makes sens
kmackay 2017/02/25 02:01:08 Sure, sounds fine to me
kmackay 2017/02/25 05:57:02 I wouldn't implement it like VideoPlane though; I
kmackay 2017/02/26 21:16:42 Done.
33 class CHROMECAST_EXPORT CastMediaShlib { 67 class CHROMECAST_EXPORT CastMediaShlib {
34 public: 68 public:
35 // Observer for audio loopback data. 69 // Observer for audio loopback data.
36 class LoopbackAudioObserver { 70 class LoopbackAudioObserver {
37 public: 71 public:
38 // Called whenever audio data is about to be output. The |timestamp| is the 72 // Called whenever audio data is about to be output. The |timestamp| is the
39 // estimated time in microseconds (relative to CLOCK_MONOTONIC_RAW) that 73 // estimated time in microseconds (relative to CLOCK_MONOTONIC_RAW) that
40 // the audio will actually be output. |length| is the length of the audio 74 // the audio will actually be output. |length| is the length of the audio
41 // |data| in bytes. The format of the data is given by |sample_format| and 75 // |data| in bytes. The format of the data is given by |sample_format| and
42 // |num_channels|. 76 // |num_channels|.
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 // being added again first. 146 // being added again first.
113 // Once the observer is fully removed (ie. once it is certain that 147 // Once the observer is fully removed (ie. once it is certain that
114 // OnLoopbackAudio() will not be called again for the observer), the 148 // OnLoopbackAudio() will not be called again for the observer), the
115 // observer's OnRemoved() method must be called. The OnRemoved() method must 149 // observer's OnRemoved() method must be called. The OnRemoved() method must
116 // be called once for each time that RemoveLoopbackAudioObserver() is called 150 // be called once for each time that RemoveLoopbackAudioObserver() is called
117 // for a given observer, even if the observer was not added. The 151 // for a given observer, even if the observer was not added. The
118 // implementation may call OnRemoved() from any thread. 152 // implementation may call OnRemoved() from any thread.
119 // This function is optional to implement. 153 // This function is optional to implement.
120 static void RemoveLoopbackAudioObserver(LoopbackAudioObserver* observer) 154 static void RemoveLoopbackAudioObserver(LoopbackAudioObserver* observer)
121 __attribute__((__weak__)); 155 __attribute__((__weak__));
156
157 // Initializes platform-specific volume control. Only called when volume
158 // control is in an uninitialized state.
159 static void InitializeVolume(const std::vector<std::string>& argv)
160 __attribute__((__weak__));
161
162 // Tears down platform-specific volume control and returns to the
163 // uninitialized state.
164 static void FinalizeVolume() __attribute__((__weak__));
165
166 // Adds a volume observer.
167 static void AddVolumeObserver(VolumeObserver* observer)
168 __attribute__((__weak__));
169 // Removes a volume observer. After this is called, the implementation must
170 // not call any more methods on the observer.
171 static void RemoveVolumeObserver(VolumeObserver* observer)
172 __attribute__((__weak__));
173
174 // Gets/sets the output volume for a given audio stream |type|. The volume
175 // |level| is in the range [0.0, 1.0].
176 static float GetVolume(AudioContentType type) __attribute__((__weak__));
177 static void SetVolume(AudioContentType type, float level)
178 __attribute__((__weak__));
179
180 // Gets/sets the mute state for a given audio stream |type|.
181 static bool IsMuted(AudioContentType type) __attribute__((__weak__));
182 static void SetMuted(AudioContentType type, bool muted)
183 __attribute__((__weak__));
184
185 // Limits the output volume for a given stream |type| to no more than |limit|.
186 // This does not affect the logical volume for the stream type; the volume
187 // returned by GetVolume() should not change, and no OnVolumeChange() event
188 // should be sent to observers.
189 static void SetOutputLimit(AudioContentType type, float limit)
190 __attribute__((__weak__));
191
192 // Converts a volume level in the range [0.0, 1.0] to/from a volume in dB.
193 // The volume in dB should be decibels SPL at 1m from the device; if that
194 // is not known, then the volume in dB should be full-scale (so a volume level
195 // of 1.0 would be 0.0 dBFS, and any lower volume level would be negative).
196 // May be called from multiple processes.
197 static float VolumeToDb(float volume) __attribute__((__weak__));
198 static float DbToVolume(float db) __attribute__((__weak__));
122 }; 199 };
123 200
124 } // namespace media 201 } // namespace media
125 } // namespace chromecast 202 } // namespace chromecast
126 203
127 #endif // CHROMECAST_PUBLIC_CAST_MEDIA_SHLIB_H_ 204 #endif // CHROMECAST_PUBLIC_CAST_MEDIA_SHLIB_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698