Commit 4857a4f0 authored by derat@chromium.org's avatar derat@chromium.org

chromeos: Look for "Master" or "Digital" mixer elements.

This removes the code to control "Headphone" and "Speaker"
elements simultaneously for ARM, and makes us instead just
look for "Master" (x86) or "Digital" (ARM).

BUG=chromium-os:18578
TEST=manual: still works on x86

Review URL: http://codereview.chromium.org/7582024

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96402 0039d316-1c4b-4281-b951-d872f2087c98
parent 6dbdaa89
...@@ -26,7 +26,6 @@ typedef long alsa_long_t; // 'long' is required for ALSA API calls. ...@@ -26,7 +26,6 @@ typedef long alsa_long_t; // 'long' is required for ALSA API calls.
using std::max; using std::max;
using std::min; using std::min;
using std::string; using std::string;
using std::vector;
namespace chromeos { namespace chromeos {
...@@ -35,12 +34,11 @@ namespace { ...@@ -35,12 +34,11 @@ namespace {
// Name of the ALSA card to which we connect. // Name of the ALSA card to which we connect.
const char kCardName[] = "default"; const char kCardName[] = "default";
// Mixer element names. We try to connect to the preferred master element // Mixer element names. We'll use the first master element from the list that
// first; if it doesn't exist, we'll control any of the alternates that exist. // exists.
const char kPreferredMasterElementName[] = "Master"; const char* const kMasterElementNames[] = {
const char* const kAlternateMasterElementNames[] = { "Master", // x86
"Headphone", "Digital", // ARM
"Speaker",
}; };
const char kPCMElementName[] = "PCM"; const char kPCMElementName[] = "PCM";
...@@ -240,22 +238,16 @@ bool AudioMixerAlsa::ConnectInternal() { ...@@ -240,22 +238,16 @@ bool AudioMixerAlsa::ConnectInternal() {
double min_volume_db = kDefaultMinVolumeDb; double min_volume_db = kDefaultMinVolumeDb;
double max_volume_db = kDefaultMaxVolumeDb; double max_volume_db = kDefaultMaxVolumeDb;
vector<snd_mixer_elem_t*> master_elements; snd_mixer_elem_t* master_element = NULL;
snd_mixer_elem_t* element = for (size_t i = 0; i < arraysize(kMasterElementNames); ++i) {
FindElementWithName(handle, kPreferredMasterElementName); master_element = FindElementWithName(handle, kMasterElementNames[i]);
if (element) { if (master_element)
master_elements.push_back(element); break;
} else {
for (size_t i = 0; i < arraysize(kAlternateMasterElementNames); ++i) {
element = FindElementWithName(handle, kAlternateMasterElementNames[i]);
if (element)
master_elements.push_back(element);
}
} }
if (master_elements.empty()) { if (!master_element) {
if (num_connection_attempts_ == kConnectionAttemptToLogFailure) if (num_connection_attempts_ == kConnectionAttemptToLogFailure)
LOG(WARNING) << "Unable to find any mixer elements on " << kCardName; LOG(WARNING) << "Unable to find a master element on " << kCardName;
snd_mixer_close(handle); snd_mixer_close(handle);
return false; return false;
} }
...@@ -263,7 +255,7 @@ bool AudioMixerAlsa::ConnectInternal() { ...@@ -263,7 +255,7 @@ bool AudioMixerAlsa::ConnectInternal() {
alsa_long_t long_low = static_cast<alsa_long_t>(kDefaultMinVolumeDb * 100); alsa_long_t long_low = static_cast<alsa_long_t>(kDefaultMinVolumeDb * 100);
alsa_long_t long_high = static_cast<alsa_long_t>(kDefaultMaxVolumeDb * 100); alsa_long_t long_high = static_cast<alsa_long_t>(kDefaultMaxVolumeDb * 100);
err = snd_mixer_selem_get_playback_dB_range( err = snd_mixer_selem_get_playback_dB_range(
master_elements.at(0), &long_low, &long_high); master_element, &long_low, &long_high);
if (err != 0) { if (err != 0) {
if (num_connection_attempts_ == kConnectionAttemptToLogFailure) if (num_connection_attempts_ == kConnectionAttemptToLogFailure)
LOG(WARNING) << "snd_mixer_selem_get_playback_dB_range() failed:" LOG(WARNING) << "snd_mixer_selem_get_playback_dB_range() failed:"
...@@ -296,7 +288,7 @@ bool AudioMixerAlsa::ConnectInternal() { ...@@ -296,7 +288,7 @@ bool AudioMixerAlsa::ConnectInternal() {
{ {
base::AutoLock lock(lock_); base::AutoLock lock(lock_);
alsa_mixer_ = handle; alsa_mixer_ = handle;
master_elements_.swap(master_elements); master_element_ = master_element;
pcm_element_ = pcm_element; pcm_element_ = pcm_element;
min_volume_db_ = min_volume_db; min_volume_db_ = min_volume_db;
max_volume_db_ = max_volume_db; max_volume_db_ = max_volume_db;
...@@ -334,24 +326,18 @@ void AudioMixerAlsa::ApplyState() { ...@@ -334,24 +326,18 @@ void AudioMixerAlsa::ApplyState() {
// If a PCM volume slider exists, then first set the Master volume to the // If a PCM volume slider exists, then first set the Master volume to the
// nearest volume >= requested volume, then adjust PCM volume down to get // nearest volume >= requested volume, then adjust PCM volume down to get
// closer to the requested volume. // closer to the requested volume.
for (vector<snd_mixer_elem_t*>::iterator it = master_elements_.begin(); SetElementVolume(master_element_, new_volume_db, 0.9999f);
it != master_elements_.end(); ++it)
SetElementVolume(*it, new_volume_db, 0.9999f);
double pcm_volume_db = 0.0; double pcm_volume_db = 0.0;
double master_volume_db = 0.0; double master_volume_db = 0.0;
if (GetElementVolume(master_elements_.at(0), &master_volume_db)) if (GetElementVolume(master_element_, &master_volume_db))
pcm_volume_db = new_volume_db - master_volume_db; pcm_volume_db = new_volume_db - master_volume_db;
SetElementVolume(pcm_element_, pcm_volume_db, 0.5f); SetElementVolume(pcm_element_, pcm_volume_db, 0.5f);
} else { } else {
for (vector<snd_mixer_elem_t*>::iterator it = master_elements_.begin(); SetElementVolume(master_element_, new_volume_db, 0.5f);
it != master_elements_.end(); ++it)
SetElementVolume(*it, new_volume_db, 0.5f);
} }
for (vector<snd_mixer_elem_t*>::iterator it = master_elements_.begin(); SetElementMuted(master_element_, should_mute);
it != master_elements_.end(); ++it)
SetElementMuted(*it, should_mute);
} }
snd_mixer_elem_t* AudioMixerAlsa::FindElementWithName( snd_mixer_elem_t* AudioMixerAlsa::FindElementWithName(
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#pragma once #pragma once
#include <string> #include <string>
#include <vector>
#include "base/basictypes.h" #include "base/basictypes.h"
#include "base/callback_old.h" #include "base/callback_old.h"
...@@ -102,9 +101,8 @@ class AudioMixerAlsa : public AudioMixer { ...@@ -102,9 +101,8 @@ class AudioMixerAlsa : public AudioMixer {
// Connection to ALSA. NULL if not connected. // Connection to ALSA. NULL if not connected.
_snd_mixer* alsa_mixer_; _snd_mixer* alsa_mixer_;
// Master mixers (some hardware has e.g. separate headphone and speaker // Master mixer.
// elements). _snd_mixer_elem* master_element_;
std::vector<_snd_mixer_elem*> master_elements_;
// PCM mixer. May be NULL if the driver doesn't expose one. // PCM mixer. May be NULL if the driver doesn't expose one.
_snd_mixer_elem* pcm_element_; _snd_mixer_elem* pcm_element_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment