summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhalliwell <halliwell@chromium.org>2015-02-24 09:05:40 -0800
committerCommit bot <commit-bot@chromium.org>2015-02-24 17:07:01 +0000
commite317b78f4d8408f52b9815bfc4c9f831f25d0178 (patch)
treebb2e4f51e378ea995903188bf929353ab02483e6
parent79b35fe9bc28e4e1a2a10ce26edc5d8b46fb362f (diff)
downloadchromium_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.cc31
-rw-r--r--media/audio/android/audio_manager_android.h10
-rw-r--r--media/audio/android/opensles_output.cc6
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;