diff options
author | halliwell <halliwell@chromium.org> | 2015-02-24 09:05:40 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-24 17:07:01 +0000 |
commit | e317b78f4d8408f52b9815bfc4c9f831f25d0178 (patch) | |
tree | bb2e4f51e378ea995903188bf929353ab02483e6 | |
parent | 79b35fe9bc28e4e1a2a10ce26edc5d8b46fb362f (diff) | |
download | chromium_src-e317b78f4d8408f52b9815bfc4c9f831f25d0178.zip chromium_src-e317b78f4d8408f52b9815bfc4c9f831f25d0178.tar.gz chromium_src-e317b78f4d8408f52b9815bfc4c9f831f25d0178.tar.bz2 |
Add way to set volume on all output audio streams on Android.
This is to support controlling volume level of Web Audio for
cast_shell on Android.
BUG=460303
Review URL: https://codereview.chromium.org/943723004
Cr-Commit-Position: refs/heads/master@{#317806}
-rw-r--r-- | media/audio/android/audio_manager_android.cc | 31 | ||||
-rw-r--r-- | media/audio/android/audio_manager_android.h | 10 | ||||
-rw-r--r-- | media/audio/android/opensles_output.cc | 6 |
3 files changed, 46 insertions, 1 deletions
diff --git a/media/audio/android/audio_manager_android.cc b/media/audio/android/audio_manager_android.cc index 7f229e0..0590ffc 100644 --- a/media/audio/android/audio_manager_android.cc +++ b/media/audio/android/audio_manager_android.cc @@ -48,7 +48,9 @@ AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory) { AudioManagerAndroid::AudioManagerAndroid(AudioLogFactory* audio_log_factory) : AudioManagerBase(audio_log_factory), - communication_mode_is_on_(false) { + communication_mode_is_on_(false), + output_volume_override_set_(false), + output_volume_override_(0) { SetMaxOutputStreamsAllowed(kMaxOutputStreams); // WARNING: This is executed on the UI loop, do not add any code here which @@ -265,6 +267,22 @@ void AudioManagerAndroid::SetMute(JNIEnv* env, jobject obj, jboolean muted) { muted)); } +void AudioManagerAndroid::SetOutputVolumeOverride(double volume) { + GetTaskRunner()->PostTask( + FROM_HERE, + base::Bind( + &AudioManagerAndroid::DoSetVolumeOnAudioThread, + base::Unretained(this), + volume)); +} + +bool AudioManagerAndroid::HasOutputVolumeOverride(double* out_volume) const { + if (output_volume_override_set_) { + *out_volume = output_volume_override_; + } + return output_volume_override_set_; +} + AudioParameters AudioManagerAndroid::GetPreferredOutputStreamParameters( const std::string& output_device_id, const AudioParameters& input_params) { @@ -382,4 +400,15 @@ void AudioManagerAndroid::DoSetMuteOnAudioThread(bool muted) { } } +void AudioManagerAndroid::DoSetVolumeOnAudioThread(double volume) { + output_volume_override_set_ = true; + output_volume_override_ = volume; + + DCHECK(GetTaskRunner()->BelongsToCurrentThread()); + for (OutputStreams::iterator it = streams_.begin(); + it != streams_.end(); ++it) { + (*it)->SetVolume(volume); + } +} + } // namespace media diff --git a/media/audio/android/audio_manager_android.h b/media/audio/android/audio_manager_android.h index 496b8cb..c64e6ee 100644 --- a/media/audio/android/audio_manager_android.h +++ b/media/audio/android/audio_manager_android.h @@ -55,6 +55,11 @@ class MEDIA_EXPORT AudioManagerAndroid : public AudioManagerBase { void SetMute(JNIEnv* env, jobject obj, jboolean muted); + // Sets a volume that applies to all this manager's output audio streams. + // This overrides other SetVolume calls (e.g. through AudioHostMsg_SetVolume). + void SetOutputVolumeOverride(double volume); + bool HasOutputVolumeOverride(double* out_volume) const; + protected: ~AudioManagerAndroid() override; @@ -75,6 +80,7 @@ class MEDIA_EXPORT AudioManagerAndroid : public AudioManagerBase { int GetOptimalOutputFrameSize(int sample_rate, int channels); void DoSetMuteOnAudioThread(bool muted); + void DoSetVolumeOnAudioThread(double volume); // Java AudioManager instance. base::android::ScopedJavaGlobalRef<jobject> j_audio_manager_; @@ -86,6 +92,10 @@ class MEDIA_EXPORT AudioManagerAndroid : public AudioManagerBase { // input stream is destroyed. Also affects the stream type of output streams. bool communication_mode_is_on_; + // If set, overrides volume level on output streams + bool output_volume_override_set_; + double output_volume_override_; + DISALLOW_COPY_AND_ASSIGN(AudioManagerAndroid); }; diff --git a/media/audio/android/opensles_output.cc b/media/audio/android/opensles_output.cc index c044204..2974e14 100644 --- a/media/audio/android/opensles_output.cc +++ b/media/audio/android/opensles_output.cc @@ -165,6 +165,12 @@ void OpenSLESOutputStream::Close() { void OpenSLESOutputStream::SetVolume(double volume) { DVLOG(2) << "OpenSLESOutputStream::SetVolume(" << volume << ")"; DCHECK(thread_checker_.CalledOnValidThread()); + + double volume_override = 0; + if (audio_manager_->HasOutputVolumeOverride(&volume_override)) { + volume = volume_override; + } + float volume_float = static_cast<float>(volume); if (volume_float < 0.0f || volume_float > 1.0f) { return; |