Index: chromecast/media/cma/backend/alsa/volume_control.cc |
diff --git a/chromecast/media/cma/backend/alsa/volume_control.cc b/chromecast/media/cma/backend/alsa/volume_control.cc |
index bb47b355787d20c635cffd27ce77c5c57f30f973..872b4f4306a89c7d74ff43bf5a166ec442804ae7 100644 |
--- a/chromecast/media/cma/backend/alsa/volume_control.cc |
+++ b/chromecast/media/cma/backend/alsa/volume_control.cc |
@@ -133,8 +133,9 @@ class VolumeControlInternal : public AlsaVolumeControl::Delegate { |
void SetVolume(AudioContentType type, float level) { |
level = std::max(0.0f, std::min(level, 1.0f)); |
thread_.task_runner()->PostTask( |
- FROM_HERE, base::Bind(&VolumeControlInternal::SetVolumeOnThread, |
- base::Unretained(this), type, level)); |
+ FROM_HERE, |
+ base::Bind(&VolumeControlInternal::SetVolumeOnThread, |
+ base::Unretained(this), type, level, false /* from_alsa */)); |
} |
bool IsMuted(AudioContentType type) { |
@@ -144,12 +145,13 @@ class VolumeControlInternal : public AlsaVolumeControl::Delegate { |
void SetMuted(AudioContentType type, bool muted) { |
thread_.task_runner()->PostTask( |
- FROM_HERE, base::Bind(&VolumeControlInternal::SetMutedOnThread, |
- base::Unretained(this), type, muted)); |
+ FROM_HERE, |
+ base::Bind(&VolumeControlInternal::SetMutedOnThread, |
+ base::Unretained(this), type, muted, false /* from_alsa */)); |
} |
void SetOutputLimit(AudioContentType type, float limit) { |
- if (BUILDFLAG(ALSA_CONTROLS_VOLUME)) { |
+ if (BUILDFLAG(ALSA_OWNS_VOLUME)) { |
return; |
} |
limit = std::max(0.0f, std::min(limit, 1.0f)); |
@@ -167,9 +169,9 @@ class VolumeControlInternal : public AlsaVolumeControl::Delegate { |
AudioContentType::kCommunication}) { |
CHECK(stored_values_.GetDouble(ContentTypeToDbFSKey(type), &dbfs)); |
volumes_[type] = VolumeControl::DbFSToVolume(dbfs); |
- if (BUILDFLAG(ALSA_CONTROLS_VOLUME)) { |
- // If ALSA controls volume, our internal mixer should not apply any |
- // scaling multiplier. |
+ if (BUILDFLAG(ALSA_OWNS_VOLUME)) { |
+ // If ALSA owns volume, our internal mixer should not apply any scaling |
+ // multiplier. |
StreamMixerAlsa::Get()->SetVolume(type, 1.0f); |
} else { |
StreamMixerAlsa::Get()->SetVolume(type, DbFsToScale(dbfs)); |
@@ -179,9 +181,9 @@ class VolumeControlInternal : public AlsaVolumeControl::Delegate { |
muted_[type] = false; |
} |
- if (BUILDFLAG(ALSA_CONTROLS_VOLUME)) { |
- // If ALSA controls the volume, then read the current volume and mute |
- // state from the ALSA mixer element(s). |
+ if (BUILDFLAG(ALSA_OWNS_VOLUME)) { |
+ // If ALSA owns the volume, then read the current volume and mute state |
+ // from the ALSA mixer element(s). |
volumes_[AudioContentType::kMedia] = alsa_volume_control_->GetVolume(); |
muted_[AudioContentType::kMedia] = alsa_volume_control_->IsMuted(); |
} else { |
@@ -194,10 +196,15 @@ class VolumeControlInternal : public AlsaVolumeControl::Delegate { |
initialize_complete_event_.Signal(); |
} |
- void SetVolumeOnThread(AudioContentType type, float level) { |
+ void SetVolumeOnThread(AudioContentType type, float level, bool from_alsa) { |
DCHECK(thread_.task_runner()->BelongsToCurrentThread()); |
+ DCHECK(!from_alsa || type == AudioContentType::kMedia); |
{ |
base::AutoLock lock(volume_lock_); |
+ if (from_alsa && alsa_volume_control_->VolumeThroughAlsa( |
+ volumes_[AudioContentType::kMedia]) == level) { |
+ return; |
+ } |
if (level == volumes_[type]) { |
return; |
} |
@@ -205,11 +212,11 @@ class VolumeControlInternal : public AlsaVolumeControl::Delegate { |
} |
float dbfs = VolumeControl::VolumeToDbFS(level); |
- if (!BUILDFLAG(ALSA_CONTROLS_VOLUME)) { |
+ if (!BUILDFLAG(ALSA_OWNS_VOLUME)) { |
StreamMixerAlsa::Get()->SetVolume(type, DbFsToScale(dbfs)); |
} |
- if (type == AudioContentType::kMedia) { |
+ if (!from_alsa && type == AudioContentType::kMedia) { |
alsa_volume_control_->SetVolume(level); |
} |
@@ -224,7 +231,7 @@ class VolumeControlInternal : public AlsaVolumeControl::Delegate { |
SerializeJsonToFile(storage_path_, stored_values_); |
} |
- void SetMutedOnThread(AudioContentType type, bool muted) { |
+ void SetMutedOnThread(AudioContentType type, bool muted, bool from_alsa) { |
DCHECK(thread_.task_runner()->BelongsToCurrentThread()); |
{ |
base::AutoLock lock(volume_lock_); |
@@ -234,11 +241,11 @@ class VolumeControlInternal : public AlsaVolumeControl::Delegate { |
muted_[type] = muted; |
} |
- if (!BUILDFLAG(ALSA_CONTROLS_VOLUME)) { |
+ if (!BUILDFLAG(ALSA_OWNS_VOLUME)) { |
StreamMixerAlsa::Get()->SetMuted(type, muted); |
} |
- if (type == AudioContentType::kMedia) { |
+ if (!from_alsa && type == AudioContentType::kMedia) { |
alsa_volume_control_->SetMuted(muted); |
} |
@@ -253,46 +260,9 @@ class VolumeControlInternal : public AlsaVolumeControl::Delegate { |
// AlsaVolumeControl::Delegate implementation: |
void OnAlsaVolumeOrMuteChange(float new_volume, bool new_mute) override { |
DCHECK(thread_.task_runner()->BelongsToCurrentThread()); |
- bool volume_changed = false; |
- bool mute_changed = false; |
- { |
- base::AutoLock lock(volume_lock_); |
- if (alsa_volume_control_->VolumeThroughAlsa( |
- volumes_[AudioContentType::kMedia]) != new_volume) { |
- volume_changed = true; |
- volumes_[AudioContentType::kMedia] = new_volume; |
- } |
- |
- if (muted_[AudioContentType::kMedia] != new_mute) { |
- mute_changed = true; |
- muted_[AudioContentType::kMedia] = new_mute; |
- } |
- } |
- |
- if (!volume_changed && !mute_changed) { |
- return; |
- } |
- |
- { |
- base::AutoLock lock(observer_lock_); |
- if (volume_changed) { |
- for (VolumeObserver* observer : volume_observers_) { |
- observer->OnVolumeChange(AudioContentType::kMedia, new_volume); |
- } |
- } |
- if (mute_changed) { |
- for (VolumeObserver* observer : volume_observers_) { |
- observer->OnMuteChange(AudioContentType::kMedia, new_mute); |
- } |
- } |
- } |
- |
- if (volume_changed) { |
- float dbfs = VolumeControl::VolumeToDbFS(new_volume); |
- stored_values_.SetDouble(ContentTypeToDbFSKey(AudioContentType::kMedia), |
- dbfs); |
- SerializeJsonToFile(storage_path_, stored_values_); |
- } |
+ SetVolumeOnThread(AudioContentType::kMedia, new_volume, |
+ true /* from_alsa */); |
+ SetMutedOnThread(AudioContentType::kMedia, new_mute, true /* from_alsa */); |
} |
base::FilePath storage_path_; |