summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcychiang <cychiang@chromium.org>2015-07-08 02:59:00 -0700
committerCommit bot <commit-bot@chromium.org>2015-07-08 09:59:39 +0000
commit3c3d910e31448a88e014b31334a57242ba5e8960 (patch)
tree76631613eb6d3f78168026b204d1dc86c266ffe7
parenta152535799a629264d64d740bafadccaff740805 (diff)
downloadchromium_src-3c3d910e31448a88e014b31334a57242ba5e8960.zip
chromium_src-3c3d910e31448a88e014b31334a57242ba5e8960.tar.gz
chromium_src-3c3d910e31448a88e014b31334a57242ba5e8960.tar.bz2
Implement HasInputDevices in CrasAudioManager
Currently in CrasAudioManager, HasInputDevices always returns True. We need to let HasInputDevices reflect the truth for device without internal microphone like ChromeBox. Let CrasAudioHandler updates the flag in CrasAudioManager whenever CrasAudioHandler gets the audio node info from Cras. Add a property is_for_simple_usage to AudioDeviceType to indicate that a device is for simple usage, not for special usage like loopback, always on keyword mic, or keyboard mic. This property can also replace the logic in audio_detailed_view.cc to filter out the devices that we do not want to display in UI. BUG=490851 TEST=Check audio devices in UI does not contain loopback devices. TEST=Check virtual keyboard does not show microphone for chromebox (Not tested yet). R=dalecurtis@chromium.org, derat@chromium.org, dgreid@chromium.org, jennyz@chromium.org Review URL: https://codereview.chromium.org/1186293003 Cr-Commit-Position: refs/heads/master@{#337791}
-rw-r--r--ash/system/chromeos/audio/audio_detailed_view.cc5
-rw-r--r--chromeos/audio/audio_device.h14
-rw-r--r--chromeos/audio/cras_audio_handler.h2
-rw-r--r--media/DEPS1
-rw-r--r--media/audio/audio_manager_base.h44
-rw-r--r--media/audio/cras/audio_manager_cras.cc9
6 files changed, 44 insertions, 31 deletions
diff --git a/ash/system/chromeos/audio/audio_detailed_view.cc b/ash/system/chromeos/audio/audio_detailed_view.cc
index d970542..2e76943 100644
--- a/ash/system/chromeos/audio/audio_detailed_view.cc
+++ b/ash/system/chromeos/audio/audio_detailed_view.cc
@@ -120,10 +120,7 @@ void AudioDetailedView::UpdateAudioDevices() {
CrasAudioHandler::Get()->GetAudioDevices(&devices);
for (size_t i = 0; i < devices.size(); ++i) {
// Don't display keyboard mic or aokr type.
- if (devices[i].type == chromeos::AUDIO_TYPE_KEYBOARD_MIC ||
- devices[i].type == chromeos::AUDIO_TYPE_AOKR ||
- devices[i].type == chromeos::AUDIO_TYPE_POST_MIX_LOOPBACK ||
- devices[i].type == chromeos::AUDIO_TYPE_POST_DSP_LOOPBACK)
+ if (!devices[i].is_for_simple_usage())
continue;
if (devices[i].is_input)
input_devices_.push_back(devices[i]);
diff --git a/chromeos/audio/audio_device.h b/chromeos/audio/audio_device.h
index 67dca1c..2ed26b1 100644
--- a/chromeos/audio/audio_device.h
+++ b/chromeos/audio/audio_device.h
@@ -41,6 +41,20 @@ struct CHROMEOS_EXPORT AudioDevice {
static std::string GetTypeString(chromeos::AudioDeviceType type);
static chromeos::AudioDeviceType GetAudioType(const std::string& node_type);
+ // Indicates that an input or output audio device is for simple usage like
+ // playback or recording for user. In contrast, audio device such as
+ // loopback, always on keyword recognition (AOKR), and keyboard mic are
+ // not for simple usage.
+ bool is_for_simple_usage() {
+ return (type == AUDIO_TYPE_HEADPHONE ||
+ type == AUDIO_TYPE_INTERNAL_MIC ||
+ type == AUDIO_TYPE_MIC ||
+ type == AUDIO_TYPE_USB ||
+ type == AUDIO_TYPE_BLUETOOTH ||
+ type == AUDIO_TYPE_HDMI ||
+ type == AUDIO_TYPE_INTERNAL_SPEAKER);
+ }
+
bool is_input;
uint64 id;
std::string display_name;
diff --git a/chromeos/audio/cras_audio_handler.h b/chromeos/audio/cras_audio_handler.h
index 10c77a4..5d24973 100644
--- a/chromeos/audio/cras_audio_handler.h
+++ b/chromeos/audio/cras_audio_handler.h
@@ -128,6 +128,8 @@ class CHROMEOS_EXPORT CrasAudioHandler : public CrasAudioClient::Observer,
virtual uint64_t GetPrimaryActiveInputNode() const;
// Gets the audio devices back in |device_list|.
+ // This call can be invoked from I/O thread or UI thread because
+ // it does not need to access CrasAudioClient on DBus.
virtual void GetAudioDevices(AudioDeviceList* device_list) const;
virtual bool GetPrimaryActiveOutputDevice(AudioDevice* device) const;
diff --git a/media/DEPS b/media/DEPS
index 6d3642e..213ce6e 100644
--- a/media/DEPS
+++ b/media/DEPS
@@ -1,5 +1,6 @@
# Do NOT add net/ or ui/base without a great reason, they're huge!
include_rules = [
+ "+chromeos/audio",
"+crypto",
"+device/udev_linux",
"+device/usb",
diff --git a/media/audio/audio_manager_base.h b/media/audio/audio_manager_base.h
index 0ac7020..866ecef 100644
--- a/media/audio/audio_manager_base.h
+++ b/media/audio/audio_manager_base.h
@@ -48,28 +48,39 @@ class MEDIA_EXPORT AudioManagerBase : public AudioManager {
~AudioManagerBase() override;
+ // AudioManager:
scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() override;
scoped_refptr<base::SingleThreadTaskRunner> GetWorkerTaskRunner() override;
-
base::string16 GetAudioInputDeviceModel() override;
-
void ShowAudioInputSettings() override;
-
void GetAudioInputDeviceNames(AudioDeviceNames* device_names) override;
-
void GetAudioOutputDeviceNames(AudioDeviceNames* device_names) override;
-
AudioOutputStream* MakeAudioOutputStream(
const AudioParameters& params,
const std::string& device_id) override;
-
AudioInputStream* MakeAudioInputStream(const AudioParameters& params,
const std::string& device_id) override;
-
AudioOutputStream* MakeAudioOutputStreamProxy(
const AudioParameters& params,
const std::string& device_id) override;
+ // Listeners will be notified on the GetTaskRunner() task runner.
+ void AddOutputDeviceChangeListener(AudioDeviceListener* listener) override;
+ void RemoveOutputDeviceChangeListener(AudioDeviceListener* listener) override;
+
+ AudioParameters GetDefaultOutputStreamParameters() override;
+ AudioParameters GetOutputStreamParameters(
+ const std::string& device_id) override;
+ AudioParameters GetInputStreamParameters(
+ const std::string& device_id) override;
+ std::string GetAssociatedOutputDeviceID(
+ const std::string& input_device_id) override;
+ scoped_ptr<AudioLog> CreateAudioLog(
+ AudioLogFactory::AudioComponent component) override;
+ void SetHasKeyboardMic() override;
+
+ // AudioManagerBase:
+
// Called internally by the audio stream when it has been closed.
virtual void ReleaseOutputStream(AudioOutputStream* stream);
virtual void ReleaseInputStream(AudioInputStream* stream);
@@ -93,25 +104,6 @@ class MEDIA_EXPORT AudioManagerBase : public AudioManager {
virtual AudioInputStream* MakeLowLatencyInputStream(
const AudioParameters& params, const std::string& device_id) = 0;
- // Listeners will be notified on the GetTaskRunner() task runner.
- void AddOutputDeviceChangeListener(AudioDeviceListener* listener) override;
- void RemoveOutputDeviceChangeListener(AudioDeviceListener* listener) override;
-
- AudioParameters GetDefaultOutputStreamParameters() override;
- AudioParameters GetOutputStreamParameters(
- const std::string& device_id) override;
-
- AudioParameters GetInputStreamParameters(
- const std::string& device_id) override;
-
- std::string GetAssociatedOutputDeviceID(
- const std::string& input_device_id) override;
-
- scoped_ptr<AudioLog> CreateAudioLog(
- AudioLogFactory::AudioComponent component) override;
-
- void SetHasKeyboardMic() override;
-
// Get number of input or output streams.
int input_stream_count() const { return num_input_streams_; }
int output_stream_count() const { return num_output_streams_; }
diff --git a/media/audio/cras/audio_manager_cras.cc b/media/audio/cras/audio_manager_cras.cc
index befd3df..7308a6d 100644
--- a/media/audio/cras/audio_manager_cras.cc
+++ b/media/audio/cras/audio_manager_cras.cc
@@ -11,6 +11,8 @@
#include "base/logging.h"
#include "base/nix/xdg_util.h"
#include "base/stl_util.h"
+#include "chromeos/audio/audio_device.h"
+#include "chromeos/audio/cras_audio_handler.h"
#include "media/audio/cras/cras_input.h"
#include "media/audio/cras/cras_unified.h"
#include "media/base/channel_layout.h"
@@ -49,7 +51,12 @@ bool AudioManagerCras::HasAudioOutputDevices() {
}
bool AudioManagerCras::HasAudioInputDevices() {
- return true;
+ chromeos::AudioDeviceList devices;
+ chromeos::CrasAudioHandler::Get()->GetAudioDevices(&devices);
+ for (size_t i = 0; i < devices.size(); ++i)
+ if (devices[i].is_input && devices[i].is_for_simple_usage())
+ return true;
+ return false;
}
AudioManagerCras::AudioManagerCras(AudioLogFactory* audio_log_factory)