summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjennyz <jennyz@chromium.org>2015-03-30 16:37:39 -0700
committerCommit bot <commit-bot@chromium.org>2015-03-30 23:38:24 +0000
commit170e7fbfa745726d13a84aa5d8edc4720f7ca0d4 (patch)
tree69735615f37e0d91b7c9db8887abf064d3eb1ec6
parent5f3a341cd644f5689736951ad1e8588e03cf90b7 (diff)
downloadchromium_src-170e7fbfa745726d13a84aa5d8edc4720f7ca0d4.zip
chromium_src-170e7fbfa745726d13a84aa5d8edc4720f7ca0d4.tar.gz
chromium_src-170e7fbfa745726d13a84aa5d8edc4720f7ca0d4.tar.bz2
Add a new audio extension event OnMuteChanged.
This is the part of audio extension redesign efforts. The original audio extension only has one OnDeviceChanged event without any input arguments to notify all sorts of audio events, which is not efficient. The hotrod app has to query getInfo to get all sets of the devices with properties, comparing the old data to decide what change really happens and handles the change. Therefore, in the new design, we will add new events to accurately report what exact audio change occurs. Eventually, we will migrate to use the new events and retire the old OnDeviceChanged event. See details in design doc: https://docs.google.com/a/google.com/document/d/1YFFLwX4mcKJyuAsZB13GhDid0MEt0QguKX0AxgvBoko/edit?usp=sharing BUG=429312 TBR=mnissler Review URL: https://codereview.chromium.org/1033603006 Cr-Commit-Position: refs/heads/master@{#322907}
-rw-r--r--ash/system/audio/audio_observer.h2
-rw-r--r--ash/system/audio/tray_audio.cc2
-rw-r--r--ash/system/audio/tray_audio.h2
-rw-r--r--ash/system/tray/system_tray_notifier.cc8
-rw-r--r--ash/system/tray/system_tray_notifier.h2
-rw-r--r--chrome/browser/policy/policy_browsertest.cc4
-rw-r--r--chrome/browser/ui/app_list/start_page_service.cc2
-rw-r--r--chrome/browser/ui/ash/system_tray_delegate_chromeos.cc6
-rw-r--r--chrome/browser/ui/ash/system_tray_delegate_chromeos.h4
-rw-r--r--chrome/browser/ui/ash/volume_controller_chromeos.cc2
-rw-r--r--chrome/browser/ui/ash/volume_controller_chromeos.h2
-rw-r--r--chromeos/audio/cras_audio_handler.cc10
-rw-r--r--chromeos/audio/cras_audio_handler.h4
-rw-r--r--chromeos/audio/cras_audio_handler_unittest.cc8
-rw-r--r--extensions/browser/api/audio/audio_api.cc14
-rw-r--r--extensions/browser/api/audio/audio_api.h1
-rw-r--r--extensions/browser/api/audio/audio_apitest.cc65
-rw-r--r--extensions/browser/api/audio/audio_service.h3
-rw-r--r--extensions/browser/api/audio/audio_service_chromeos.cc22
-rw-r--r--extensions/common/api/audio.idl5
-rw-r--r--extensions/shell/browser/shell_audio_controller_chromeos.cc6
-rw-r--r--extensions/shell/browser/shell_audio_controller_chromeos.h4
-rw-r--r--extensions/test/data/api_test/audio/input_mute_change/background.js14
-rw-r--r--extensions/test/data/api_test/audio/input_mute_change/manifest.json13
-rw-r--r--extensions/test/data/api_test/audio/output_mute_change/background.js14
-rw-r--r--extensions/test/data/api_test/audio/output_mute_change/manifest.json13
26 files changed, 194 insertions, 38 deletions
diff --git a/ash/system/audio/audio_observer.h b/ash/system/audio/audio_observer.h
index 780bb5e..3b94ebc8 100644
--- a/ash/system/audio/audio_observer.h
+++ b/ash/system/audio/audio_observer.h
@@ -19,7 +19,7 @@ class AudioObserver {
virtual void OnOutputNodeVolumeChanged(uint64_t node_id, double volume) = 0;
// Called when output mute state changed.
- virtual void OnOutputMuteChanged() = 0;
+ virtual void OnOutputMuteChanged(bool mute_on) = 0;
// Called when audio nodes changed.
virtual void OnAudioNodesChanged() = 0;
diff --git a/ash/system/audio/tray_audio.cc b/ash/system/audio/tray_audio.cc
index 6c2ae48..21c2163 100644
--- a/ash/system/audio/tray_audio.cc
+++ b/ash/system/audio/tray_audio.cc
@@ -113,7 +113,7 @@ void TrayAudio::OnOutputNodeVolumeChanged(uint64_t /* node_id */,
PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false);
}
-void TrayAudio::OnOutputMuteChanged() {
+void TrayAudio::OnOutputMuteChanged(bool /* mute_on */) {
if (tray_view())
tray_view()->SetVisible(GetInitialVisibility());
diff --git a/ash/system/audio/tray_audio.h b/ash/system/audio/tray_audio.h
index 65ac42e..9d3b2c9 100644
--- a/ash/system/audio/tray_audio.h
+++ b/ash/system/audio/tray_audio.h
@@ -54,7 +54,7 @@ class TrayAudio : public TrayImageItem,
// Overridden from AudioObserver.
void OnOutputNodeVolumeChanged(uint64_t node_id, double volume) override;
- void OnOutputMuteChanged() override;
+ void OnOutputMuteChanged(bool mute_on) override;
void OnAudioNodesChanged() override;
void OnActiveOutputNodeChanged() override;
void OnActiveInputNodeChanged() override;
diff --git a/ash/system/tray/system_tray_notifier.cc b/ash/system/tray/system_tray_notifier.cc
index 331fb95..40e7050 100644
--- a/ash/system/tray/system_tray_notifier.cc
+++ b/ash/system/tray/system_tray_notifier.cc
@@ -201,11 +201,9 @@ void SystemTrayNotifier::NotifyAudioOutputVolumeChanged(uint64_t node_id,
OnOutputNodeVolumeChanged(node_id, volume));
}
-void SystemTrayNotifier::NotifyAudioOutputMuteChanged() {
- FOR_EACH_OBSERVER(
- AudioObserver,
- audio_observers_,
- OnOutputMuteChanged());
+void SystemTrayNotifier::NotifyAudioOutputMuteChanged(bool mute_on) {
+ FOR_EACH_OBSERVER(AudioObserver, audio_observers_,
+ OnOutputMuteChanged(mute_on));
}
void SystemTrayNotifier::NotifyAudioNodesChanged() {
diff --git a/ash/system/tray/system_tray_notifier.h b/ash/system/tray/system_tray_notifier.h
index 632d122..29bba2a 100644
--- a/ash/system/tray/system_tray_notifier.h
+++ b/ash/system/tray/system_tray_notifier.h
@@ -111,7 +111,7 @@ class ASH_EXPORT SystemTrayNotifier {
void NotifyAccessibilityModeChanged(
ui::AccessibilityNotificationVisibility notify);
void NotifyAudioOutputVolumeChanged(uint64_t node_id, double volume);
- void NotifyAudioOutputMuteChanged();
+ void NotifyAudioOutputMuteChanged(bool mute_on);
void NotifyAudioNodesChanged();
void NotifyAudioActiveOutputNodeChanged();
void NotifyAudioActiveInputNodeChanged();
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index 45f4292..103d590 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -503,7 +503,9 @@ class TestAudioObserver : public chromeos::CrasAudioHandler::AudioObserver {
protected:
// chromeos::CrasAudioHandler::AudioObserver overrides.
- void OnOutputMuteChanged() override { ++output_mute_changed_count_; }
+ void OnOutputMuteChanged(bool /* mute_on */) override {
+ ++output_mute_changed_count_;
+ }
private:
int output_mute_changed_count_;
diff --git a/chrome/browser/ui/app_list/start_page_service.cc b/chrome/browser/ui/app_list/start_page_service.cc
index dc7e805..bdb9cea 100644
--- a/chrome/browser/ui/app_list/start_page_service.cc
+++ b/chrome/browser/ui/app_list/start_page_service.cc
@@ -217,7 +217,7 @@ class StartPageService::AudioStatus
}
// chromeos::CrasAudioHandler::AudioObserver:
- void OnInputMuteChanged() override { CheckAndUpdate(); }
+ void OnInputMuteChanged(bool /* mute_on */) override { CheckAndUpdate(); }
void OnActiveInputNodeChanged() override { CheckAndUpdate(); }
diff --git a/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc b/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc
index 27ea957..2ec98cc 100644
--- a/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc
+++ b/chrome/browser/ui/ash/system_tray_delegate_chromeos.cc
@@ -1224,15 +1224,15 @@ void SystemTrayDelegateChromeOS::OnOutputNodeVolumeChanged(uint64_t node_id,
GetSystemTrayNotifier()->NotifyAudioOutputVolumeChanged(node_id, volume);
}
-void SystemTrayDelegateChromeOS::OnOutputMuteChanged() {
- GetSystemTrayNotifier()->NotifyAudioOutputMuteChanged();
+void SystemTrayDelegateChromeOS::OnOutputMuteChanged(bool mute_on) {
+ GetSystemTrayNotifier()->NotifyAudioOutputMuteChanged(mute_on);
}
void SystemTrayDelegateChromeOS::OnInputNodeGainChanged(uint64_t /* node_id */,
int /* gain */) {
}
-void SystemTrayDelegateChromeOS::OnInputMuteChanged() {
+void SystemTrayDelegateChromeOS::OnInputMuteChanged(bool /* mute_on */) {
}
void SystemTrayDelegateChromeOS::OnAudioNodesChanged() {
diff --git a/chrome/browser/ui/ash/system_tray_delegate_chromeos.h b/chrome/browser/ui/ash/system_tray_delegate_chromeos.h
index 5aa5ddc..bdc1e08 100644
--- a/chrome/browser/ui/ash/system_tray_delegate_chromeos.h
+++ b/chrome/browser/ui/ash/system_tray_delegate_chromeos.h
@@ -221,9 +221,9 @@ class SystemTrayDelegateChromeOS
// Overridden from CrasAudioHandler::AudioObserver.
void OnOutputNodeVolumeChanged(uint64_t node_id, int volume) override;
- void OnOutputMuteChanged() override;
+ void OnOutputMuteChanged(bool mute_on) override;
void OnInputNodeGainChanged(uint64_t node_id, int gain) override;
- void OnInputMuteChanged() override;
+ void OnInputMuteChanged(bool mute_on) override;
void OnAudioNodesChanged() override;
void OnActiveOutputNodeChanged() override;
void OnActiveInputNodeChanged() override;
diff --git a/chrome/browser/ui/ash/volume_controller_chromeos.cc b/chrome/browser/ui/ash/volume_controller_chromeos.cc
index 36d9676..5079c06 100644
--- a/chrome/browser/ui/ash/volume_controller_chromeos.cc
+++ b/chrome/browser/ui/ash/volume_controller_chromeos.cc
@@ -99,7 +99,7 @@ void VolumeController::OnOutputNodeVolumeChanged(uint64_t node_id, int volume) {
audio_handler->IsOutputMuted());
}
-void VolumeController::OnOutputMuteChanged() {
+void VolumeController::OnOutputMuteChanged(bool /* mute_on */) {
CrasAudioHandler* audio_handler = CrasAudioHandler::Get();
extensions::DispatchVolumeChangedEvent(
audio_handler->GetOutputVolumePercent(),
diff --git a/chrome/browser/ui/ash/volume_controller_chromeos.h b/chrome/browser/ui/ash/volume_controller_chromeos.h
index 3c36933..4e94ae4 100644
--- a/chrome/browser/ui/ash/volume_controller_chromeos.h
+++ b/chrome/browser/ui/ash/volume_controller_chromeos.h
@@ -24,7 +24,7 @@ class VolumeController : public ash::VolumeControlDelegate,
// Overridden from chromeos::CrasAudioHandler::AudioObserver.
void OnOutputNodeVolumeChanged(uint64_t node_id, int volume) override;
- void OnOutputMuteChanged() override;
+ void OnOutputMuteChanged(bool mute_on) override;
private:
diff --git a/chromeos/audio/cras_audio_handler.cc b/chromeos/audio/cras_audio_handler.cc
index 5cf17ee..52af951 100644
--- a/chromeos/audio/cras_audio_handler.cc
+++ b/chromeos/audio/cras_audio_handler.cc
@@ -66,10 +66,10 @@ void CrasAudioHandler::AudioObserver::OnInputNodeGainChanged(
int /* gain */) {
}
-void CrasAudioHandler::AudioObserver::OnOutputMuteChanged() {
+void CrasAudioHandler::AudioObserver::OnOutputMuteChanged(bool /* mute_on */) {
}
-void CrasAudioHandler::AudioObserver::OnInputMuteChanged() {
+void CrasAudioHandler::AudioObserver::OnInputMuteChanged(bool /* mute_on */) {
}
void CrasAudioHandler::AudioObserver::OnAudioNodesChanged() {
@@ -367,7 +367,8 @@ void CrasAudioHandler::SetOutputMute(bool mute_on) {
}
}
- FOR_EACH_OBSERVER(AudioObserver, observers_, OnOutputMuteChanged());
+ FOR_EACH_OBSERVER(AudioObserver, observers_,
+ OnOutputMuteChanged(output_mute_on_));
}
void CrasAudioHandler::AdjustOutputVolumeToAudibleLevel() {
@@ -380,7 +381,8 @@ void CrasAudioHandler::AdjustOutputVolumeToAudibleLevel() {
void CrasAudioHandler::SetInputMute(bool mute_on) {
SetInputMuteInternal(mute_on);
- FOR_EACH_OBSERVER(AudioObserver, observers_, OnInputMuteChanged());
+ FOR_EACH_OBSERVER(AudioObserver, observers_,
+ OnInputMuteChanged(input_mute_on_));
}
void CrasAudioHandler::SetActiveOutputNode(uint64_t node_id, bool notify) {
diff --git a/chromeos/audio/cras_audio_handler.h b/chromeos/audio/cras_audio_handler.h
index 081e20d..e16ab84 100644
--- a/chromeos/audio/cras_audio_handler.h
+++ b/chromeos/audio/cras_audio_handler.h
@@ -40,13 +40,13 @@ class CHROMEOS_EXPORT CrasAudioHandler : public CrasAudioClient::Observer,
virtual void OnOutputNodeVolumeChanged(uint64_t node_id, int volume);
// Called when output mute state changed.
- virtual void OnOutputMuteChanged();
+ virtual void OnOutputMuteChanged(bool mute_on);
// Called when active input node's gain changed.
virtual void OnInputNodeGainChanged(uint64_t node_id, int gain);
// Called when input mute state changed.
- virtual void OnInputMuteChanged();
+ virtual void OnInputMuteChanged(bool mute_on);
// Called when audio nodes changed.
virtual void OnAudioNodesChanged();
diff --git a/chromeos/audio/cras_audio_handler_unittest.cc b/chromeos/audio/cras_audio_handler_unittest.cc
index ac9493c..72eaaf3 100644
--- a/chromeos/audio/cras_audio_handler_unittest.cc
+++ b/chromeos/audio/cras_audio_handler_unittest.cc
@@ -247,9 +247,13 @@ class TestObserver : public chromeos::CrasAudioHandler::AudioObserver {
void OnAudioNodesChanged() override { ++audio_nodes_changed_count_; }
- void OnOutputMuteChanged() override { ++output_mute_changed_count_; }
+ void OnOutputMuteChanged(bool /* mute_on */) override {
+ ++output_mute_changed_count_;
+ }
- void OnInputMuteChanged() override { ++input_mute_changed_count_; }
+ void OnInputMuteChanged(bool /* mute_on */) override {
+ ++input_mute_changed_count_;
+ }
void OnOutputNodeVolumeChanged(uint64 /* node_id */,
int /* volume */) override {
diff --git a/extensions/browser/api/audio/audio_api.cc b/extensions/browser/api/audio/audio_api.cc
index 4b4fa7d..fe5a26a 100644
--- a/extensions/browser/api/audio/audio_api.cc
+++ b/extensions/browser/api/audio/audio_api.cc
@@ -37,7 +37,7 @@ AudioService* AudioAPI::GetService() const {
}
void AudioAPI::OnDeviceChanged() {
- if (browser_context_ && EventRouter::Get(browser_context_)) {
+ if (EventRouter::Get(browser_context_)) {
scoped_ptr<Event> event(new Event(
audio::OnDeviceChanged::kEventName,
scoped_ptr<base::ListValue>(new base::ListValue())));
@@ -46,7 +46,7 @@ void AudioAPI::OnDeviceChanged() {
}
void AudioAPI::OnLevelChanged(const std::string& id, int level) {
- if (browser_context_ && EventRouter::Get(browser_context_)) {
+ if (EventRouter::Get(browser_context_)) {
scoped_ptr<base::ListValue> args = audio::OnLevelChanged::Create(id, level);
scoped_ptr<Event> event(
new Event(audio::OnLevelChanged::kEventName, args.Pass()));
@@ -54,6 +54,16 @@ void AudioAPI::OnLevelChanged(const std::string& id, int level) {
}
}
+void AudioAPI::OnMuteChanged(bool is_input, bool is_muted) {
+ if (EventRouter::Get(browser_context_)) {
+ scoped_ptr<base::ListValue> args =
+ audio::OnMuteChanged::Create(is_input, is_muted);
+ scoped_ptr<Event> event(
+ new Event(audio::OnMuteChanged::kEventName, args.Pass()));
+ EventRouter::Get(browser_context_)->BroadcastEvent(event.Pass());
+ }
+}
+
///////////////////////////////////////////////////////////////////////////////
bool AudioGetInfoFunction::RunAsync() {
diff --git a/extensions/browser/api/audio/audio_api.h b/extensions/browser/api/audio/audio_api.h
index 1a5c0c2..1fd5ba8 100644
--- a/extensions/browser/api/audio/audio_api.h
+++ b/extensions/browser/api/audio/audio_api.h
@@ -26,6 +26,7 @@ class AudioAPI : public BrowserContextKeyedAPI, public AudioService::Observer {
// AudioService::Observer implementation.
void OnDeviceChanged() override;
void OnLevelChanged(const std::string& id, int level) override;
+ void OnMuteChanged(bool is_input, bool is_muted) override;
private:
friend class BrowserContextKeyedAPIFactory<AudioAPI>;
diff --git a/extensions/browser/api/audio/audio_apitest.cc b/extensions/browser/api/audio/audio_apitest.cc
index 96d72b4..02bcfbc 100644
--- a/extensions/browser/api/audio/audio_apitest.cc
+++ b/extensions/browser/api/audio/audio_apitest.cc
@@ -135,6 +135,71 @@ IN_PROC_BROWSER_TEST_F(AudioApiTest, OnLevelChangedOutputDevice) {
ASSERT_TRUE(result_listener.WaitUntilSatisfied());
EXPECT_EQ("success", result_listener.message());
}
+
+IN_PROC_BROWSER_TEST_F(AudioApiTest, OnOutputMuteChanged) {
+ AudioNodeList audio_nodes;
+ audio_nodes.push_back(kJabraSpeaker1);
+ audio_nodes.push_back(kHDMIOutput);
+ SetUpCrasAudioHandlerWithTestingNodes(audio_nodes);
+
+ // Verify the jabra speaker is the active output device.
+ AudioDevice device;
+ EXPECT_TRUE(cras_audio_handler_->GetPrimaryActiveOutputDevice(&device));
+ EXPECT_EQ(device.id, kJabraSpeaker1.id);
+
+ // Mute the output.
+ cras_audio_handler_->SetOutputMute(true);
+ EXPECT_TRUE(cras_audio_handler_->IsOutputMuted());
+
+ // Loads background app.
+ ExtensionTestMessageListener load_listener("loaded", false);
+ ExtensionTestMessageListener result_listener("success", false);
+ result_listener.set_failure_message("failure");
+ ASSERT_TRUE(LoadApp("api_test/audio/output_mute_change"));
+ ASSERT_TRUE(load_listener.WaitUntilSatisfied());
+
+ // Un-mute the output.
+ cras_audio_handler_->SetOutputMute(false);
+ EXPECT_FALSE(cras_audio_handler_->IsOutputMuted());
+
+ // Verify the background app got the OnMuteChanged event
+ // with the expected output un-muted state.
+ ASSERT_TRUE(result_listener.WaitUntilSatisfied());
+ EXPECT_EQ("success", result_listener.message());
+}
+
+IN_PROC_BROWSER_TEST_F(AudioApiTest, OnInputMuteChanged) {
+ AudioNodeList audio_nodes;
+ audio_nodes.push_back(kJabraMic1);
+ audio_nodes.push_back(kUSBCameraMic);
+ SetUpCrasAudioHandlerWithTestingNodes(audio_nodes);
+
+ // Set the jabra mic to be the active input device.
+ AudioDevice jabra_mic(kJabraMic1);
+ cras_audio_handler_->SwitchToDevice(jabra_mic, true);
+ EXPECT_EQ(kJabraMic1.id, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+ // Un-mute the input.
+ cras_audio_handler_->SetInputMute(false);
+ EXPECT_FALSE(cras_audio_handler_->IsInputMuted());
+
+ // Loads background app.
+ ExtensionTestMessageListener load_listener("loaded", false);
+ ExtensionTestMessageListener result_listener("success", false);
+ result_listener.set_failure_message("failure");
+ ASSERT_TRUE(LoadApp("api_test/audio/input_mute_change"));
+ ASSERT_TRUE(load_listener.WaitUntilSatisfied());
+
+ // Mute the input.
+ cras_audio_handler_->SetInputMute(true);
+ EXPECT_TRUE(cras_audio_handler_->IsInputMuted());
+
+ // Verify the background app got the OnMuteChanged event
+ // with the expected input muted state.
+ ASSERT_TRUE(result_listener.WaitUntilSatisfied());
+ EXPECT_EQ("success", result_listener.message());
+}
+
#endif // OS_CHROMEOS
} // namespace extensions
diff --git a/extensions/browser/api/audio/audio_service.h b/extensions/browser/api/audio/audio_service.h
index 5d0ac07..46b0ce2 100644
--- a/extensions/browser/api/audio/audio_service.h
+++ b/extensions/browser/api/audio/audio_service.h
@@ -29,6 +29,9 @@ class AudioService {
// Called when the sound level of an active audio node changes.
virtual void OnLevelChanged(const std::string& id, int level) = 0;
+ // Called when the mute state of audio input/output changes.
+ virtual void OnMuteChanged(bool is_input, bool is_muted) = 0;
+
protected:
virtual ~Observer() {}
};
diff --git a/extensions/browser/api/audio/audio_service_chromeos.cc b/extensions/browser/api/audio/audio_service_chromeos.cc
index 0f652a0..915bf36 100644
--- a/extensions/browser/api/audio/audio_service_chromeos.cc
+++ b/extensions/browser/api/audio/audio_service_chromeos.cc
@@ -40,8 +40,8 @@ class AudioServiceImpl : public AudioService,
// chromeos::CrasAudioHandler::AudioObserver overrides.
void OnOutputNodeVolumeChanged(uint64_t id, int volume) override;
void OnInputNodeGainChanged(uint64_t id, int gain) override;
- void OnOutputMuteChanged() override;
- void OnInputMuteChanged() override;
+ void OnOutputMuteChanged(bool mute_on) override;
+ void OnInputMuteChanged(bool mute_on) override;
void OnAudioNodesChanged() override;
void OnActiveOutputNodeChanged() override;
void OnActiveInputNodeChanged() override;
@@ -49,6 +49,7 @@ class AudioServiceImpl : public AudioService,
private:
void NotifyDeviceChanged();
void NotifyLevelChanged(uint64_t id, int level);
+ void NotifyMuteChanged(bool is_input, bool is_muted);
bool FindDevice(uint64_t id, chromeos::AudioDevice* device);
uint64_t GetIdFromStr(const std::string& id_str);
@@ -196,16 +197,16 @@ void AudioServiceImpl::OnOutputNodeVolumeChanged(uint64_t id, int volume) {
NotifyLevelChanged(id, volume);
}
-void AudioServiceImpl::OnOutputMuteChanged() {
- NotifyDeviceChanged();
+void AudioServiceImpl::OnOutputMuteChanged(bool mute_on) {
+ NotifyMuteChanged(false, mute_on);
}
void AudioServiceImpl::OnInputNodeGainChanged(uint64_t id, int gain) {
NotifyLevelChanged(id, gain);
}
-void AudioServiceImpl::OnInputMuteChanged() {
- NotifyDeviceChanged();
+void AudioServiceImpl::OnInputMuteChanged(bool mute_on) {
+ NotifyMuteChanged(true, mute_on);
}
void AudioServiceImpl::OnAudioNodesChanged() {
@@ -233,6 +234,15 @@ void AudioServiceImpl::NotifyLevelChanged(uint64_t id, int level) {
NotifyDeviceChanged();
}
+void AudioServiceImpl::NotifyMuteChanged(bool is_input, bool is_muted) {
+ FOR_EACH_OBSERVER(AudioService::Observer, observer_list_,
+ OnMuteChanged(is_input, is_muted));
+
+ // Notify DeviceChanged event for backward compatibility.
+ // TODO(jennyz): remove this code when the old version of hotrod retires.
+ NotifyDeviceChanged();
+}
+
AudioService* AudioService::CreateInstance() {
return new AudioServiceImpl;
}
diff --git a/extensions/common/api/audio.idl b/extensions/common/api/audio.idl
index 9461cbd3..dc3f1c7 100644
--- a/extensions/common/api/audio.idl
+++ b/extensions/common/api/audio.idl
@@ -78,5 +78,10 @@ namespace audio {
// |id|: id of the audio node.
// |level|: new sound level of the node(volume for output, gain for input).
static void OnLevelChanged(DOMString id, long level);
+
+ // Fired when the mute state of the audio input or output changes.
+ // |isInput|: true indicating audio input; false indicating audio output.
+ // |isMuted|: new value of mute state.
+ static void OnMuteChanged(boolean isInput, boolean isMuted);
};
};
diff --git a/extensions/shell/browser/shell_audio_controller_chromeos.cc b/extensions/shell/browser/shell_audio_controller_chromeos.cc
index 66a599d..550c56c 100644
--- a/extensions/shell/browser/shell_audio_controller_chromeos.cc
+++ b/extensions/shell/browser/shell_audio_controller_chromeos.cc
@@ -39,13 +39,15 @@ void ShellAudioController::OnOutputNodeVolumeChanged(uint64_t /* node_id */,
int /* volume */) {
}
-void ShellAudioController::OnOutputMuteChanged() {}
+void ShellAudioController::OnOutputMuteChanged(bool /* mute_on */) {
+}
void ShellAudioController::OnInputNodeGainChanged(uint64_t /* node_id */,
int /* gain */) {
}
-void ShellAudioController::OnInputMuteChanged() {}
+void ShellAudioController::OnInputMuteChanged(bool /* mute_on */) {
+}
void ShellAudioController::OnAudioNodesChanged() {
VLOG(1) << "Audio nodes changed";
diff --git a/extensions/shell/browser/shell_audio_controller_chromeos.h b/extensions/shell/browser/shell_audio_controller_chromeos.h
index f78cd90..0f47352 100644
--- a/extensions/shell/browser/shell_audio_controller_chromeos.h
+++ b/extensions/shell/browser/shell_audio_controller_chromeos.h
@@ -18,9 +18,9 @@ class ShellAudioController : public chromeos::CrasAudioHandler::AudioObserver {
// chromeos::CrasAudioHandler::Observer implementation:
void OnOutputNodeVolumeChanged(uint64_t node_id, int volume) override;
- void OnOutputMuteChanged() override;
+ void OnOutputMuteChanged(bool mute_on) override;
void OnInputNodeGainChanged(uint64_t node_id, int gain) override;
- void OnInputMuteChanged() override;
+ void OnInputMuteChanged(bool mute_on) override;
void OnAudioNodesChanged() override;
void OnActiveOutputNodeChanged() override;
void OnActiveInputNodeChanged() override;
diff --git a/extensions/test/data/api_test/audio/input_mute_change/background.js b/extensions/test/data/api_test/audio/input_mute_change/background.js
new file mode 100644
index 0000000..f248c61
--- /dev/null
+++ b/extensions/test/data/api_test/audio/input_mute_change/background.js
@@ -0,0 +1,14 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+chrome.audio.OnMuteChanged.addListener(function (is_input, is_muted) {
+ if (is_input === true && is_muted === true) {
+ chrome.test.sendMessage("success");
+ } else {
+ console.error("Got unexpected OnMuteChanged event is_input:" + is_input +
+ " is_muted:" + is_muted);
+ chrome.test.sendMessage("failure");
+ }
+});
+chrome.test.sendMessage("loaded");
diff --git a/extensions/test/data/api_test/audio/input_mute_change/manifest.json b/extensions/test/data/api_test/audio/input_mute_change/manifest.json
new file mode 100644
index 0000000..014be98
--- /dev/null
+++ b/extensions/test/data/api_test/audio/input_mute_change/manifest.json
@@ -0,0 +1,13 @@
+{
+ "name": "chrome.audio.OnInputMuteChanged",
+ "version": "1.0",
+ "description": "browser test for chrome.audio.OnInputMuteChanged event",
+ "app": {
+ "background": {
+ "scripts": ["background.js"]
+ }
+ },
+ "permissions": [
+ "audio"
+ ]
+}
diff --git a/extensions/test/data/api_test/audio/output_mute_change/background.js b/extensions/test/data/api_test/audio/output_mute_change/background.js
new file mode 100644
index 0000000..2a4d60a
--- /dev/null
+++ b/extensions/test/data/api_test/audio/output_mute_change/background.js
@@ -0,0 +1,14 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+chrome.audio.OnMuteChanged.addListener(function (is_input, is_muted) {
+ if (is_input === false && is_muted === false) {
+ chrome.test.sendMessage("success");
+ } else {
+ console.error("Got unexpected OnMuteChanged event is_input:" + is_input +
+ " is_muted:" + is_muted);
+ chrome.test.sendMessage("failure");
+ }
+});
+chrome.test.sendMessage("loaded");
diff --git a/extensions/test/data/api_test/audio/output_mute_change/manifest.json b/extensions/test/data/api_test/audio/output_mute_change/manifest.json
new file mode 100644
index 0000000..d91d3dc
--- /dev/null
+++ b/extensions/test/data/api_test/audio/output_mute_change/manifest.json
@@ -0,0 +1,13 @@
+{
+ "name": "chrome.audio.OnOutputMuteChanged",
+ "version": "1.0",
+ "description": "browser test for chrome.audio.OnOutputMuteChanged event",
+ "app": {
+ "background": {
+ "scripts": ["background.js"]
+ }
+ },
+ "permissions": [
+ "audio"
+ ]
+}