Index: chromecast/media/cma/backend/alsa/stream_mixer_alsa.h |
diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa.h b/chromecast/media/cma/backend/alsa/stream_mixer_alsa.h |
index b522f09024cb274daf1aea6adfe5a1775ded5788..879b7d0b3f4c6a5b0110c660a2fe0b49b339c3f9 100644 |
--- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa.h |
+++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa.h |
@@ -8,6 +8,7 @@ |
#include <alsa/asoundlib.h> |
#include <stdint.h> |
+#include <map> |
#include <memory> |
#include <string> |
#include <vector> |
@@ -20,6 +21,7 @@ |
#include "chromecast/media/cma/backend/alsa/media_pipeline_backend_alsa.h" |
#include "chromecast/media/cma/backend/alsa/stream_mixer_alsa_input.h" |
#include "chromecast/public/cast_media_shlib.h" |
+#include "chromecast/public/volume_control.h" |
namespace media { |
class AudioBus; |
@@ -73,6 +75,9 @@ class StreamMixerAlsa { |
// or media/audio/audio_device_description.h |
virtual std::string device_id() const = 0; |
+ // Returns the content type for volume control. |
+ virtual AudioContentType content_type() const = 0; |
+ |
// Returns true if PrepareToDelete() has been called. |
virtual bool IsDeleting() const = 0; |
@@ -129,6 +134,14 @@ class StreamMixerAlsa { |
// Once the input is ready to be removed, it should call the supplied |
// |delete_cb|; this should only happen once per input. |
virtual void PrepareToDelete(const OnReadyToDeleteCb& delete_cb) = 0; |
+ |
+ // Sets the multiplier based on this stream's content type. The resulting |
+ // output volume should be the content type volume * the per-stream volume |
+ // multiplier. |
+ virtual void SetContentTypeVolume(float volume) = 0; |
+ |
+ // Sets whether or not this stream should be muted. |
+ virtual void SetMuted(bool muted) = 0; |
}; |
enum State { |
@@ -169,11 +182,29 @@ class StreamMixerAlsa { |
void RemoveLoopbackAudioObserver( |
CastMediaShlib::LoopbackAudioObserver* observer); |
+ // Sets the volume multiplier for the given content |type|. |
+ void SetVolume(AudioContentType type, float level); |
+ |
+ // Sets the mute state for the given content |type|. |
+ void SetMuted(AudioContentType type, bool muted); |
+ |
+ // Sets the volume multiplier limit for the given content |type|. |
+ void SetOutputLimit(AudioContentType type, float limit); |
+ |
protected: |
StreamMixerAlsa(); |
virtual ~StreamMixerAlsa(); |
private: |
+ // Contains volume control information for an audio content type. |
+ struct VolumeInfo { |
+ float GetEffectiveVolume(); |
+ |
+ float volume = 0.0f; |
+ float limit = 1.0f; |
+ bool muted = false; |
+ }; |
+ |
void ResetTaskRunnerForTest(); |
void FinalizeOnMixerThread(); |
void FinishFinalize(); |
@@ -232,7 +263,6 @@ class StreamMixerAlsa { |
// only has to interact with the command line parameters once. |
std::string alsa_device_name_; |
snd_pcm_uframes_t alsa_buffer_size_; |
- bool alsa_period_explicitly_set; |
snd_pcm_uframes_t alsa_period_size_; |
snd_pcm_uframes_t alsa_start_threshold_; |
snd_pcm_uframes_t alsa_avail_min_; |
@@ -251,6 +281,8 @@ class StreamMixerAlsa { |
std::vector<std::unique_ptr<FilterGroup>> filter_groups_; |
std::vector<CastMediaShlib::LoopbackAudioObserver*> loopback_observers_; |
+ std::map<AudioContentType, VolumeInfo> volume_info_; |
+ |
DISALLOW_COPY_AND_ASSIGN(StreamMixerAlsa); |
}; |