From 170e7fbfa745726d13a84aa5d8edc4720f7ca0d4 Mon Sep 17 00:00:00 2001 From: jennyz Date: Mon, 30 Mar 2015 16:37:39 -0700 Subject: [PATCH] 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} --- ash/system/audio/audio_observer.h | 2 +- ash/system/audio/tray_audio.cc | 2 +- ash/system/audio/tray_audio.h | 2 +- ash/system/tray/system_tray_notifier.cc | 8 +-- ash/system/tray/system_tray_notifier.h | 2 +- chrome/browser/policy/policy_browsertest.cc | 4 +- .../browser/ui/app_list/start_page_service.cc | 2 +- .../ui/ash/system_tray_delegate_chromeos.cc | 6 +- .../ui/ash/system_tray_delegate_chromeos.h | 4 +- .../ui/ash/volume_controller_chromeos.cc | 2 +- .../ui/ash/volume_controller_chromeos.h | 2 +- chromeos/audio/cras_audio_handler.cc | 10 +-- chromeos/audio/cras_audio_handler.h | 4 +- chromeos/audio/cras_audio_handler_unittest.cc | 8 ++- extensions/browser/api/audio/audio_api.cc | 14 +++- extensions/browser/api/audio/audio_api.h | 1 + extensions/browser/api/audio/audio_apitest.cc | 65 +++++++++++++++++++ extensions/browser/api/audio/audio_service.h | 3 + .../api/audio/audio_service_chromeos.cc | 22 +++++-- extensions/common/api/audio.idl | 5 ++ .../shell_audio_controller_chromeos.cc | 6 +- .../browser/shell_audio_controller_chromeos.h | 4 +- .../audio/input_mute_change/background.js | 14 ++++ .../audio/input_mute_change/manifest.json | 13 ++++ .../audio/output_mute_change/background.js | 14 ++++ .../audio/output_mute_change/manifest.json | 13 ++++ 26 files changed, 194 insertions(+), 38 deletions(-) create mode 100644 extensions/test/data/api_test/audio/input_mute_change/background.js create mode 100644 extensions/test/data/api_test/audio/input_mute_change/manifest.json create mode 100644 extensions/test/data/api_test/audio/output_mute_change/background.js create mode 100644 extensions/test/data/api_test/audio/output_mute_change/manifest.json diff --git a/ash/system/audio/audio_observer.h b/ash/system/audio/audio_observer.h index 780bb5e402557b..3b94ebc8b5f6e9 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 6c2ae48631e117..21c2163c4d5606 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 65ac42ee3ab4e8..9d3b2c94463bb2 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 331fb956f5bde0..40e70501df9e11 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 632d122e0d8815..29bba2aa54d227 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 45f42922be33bb..103d5902df88f7 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 dc7e805c96c46d..bdb9cea37f6e1d 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 27ea957f9d7054..2ec98cc72a4ec9 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 5aa5ddcba15fc5..bdc1e083dc8f90 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 36d9676be0c3b5..5079c06bec4d87 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 3c3693376a46a2..4e94ae4f9c77e8 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 5cf17eebf937c0..52af951687b3b2 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 081e20dafb71c5..e16ab84e4e2cbc 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 ac9493c52d7d2e..72eaaf38411d32 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 4b4fa7d6384b18..fe5a26abe8a4ce 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(new Event( audio::OnDeviceChanged::kEventName, scoped_ptr(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 args = audio::OnLevelChanged::Create(id, level); scoped_ptr 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 args = + audio::OnMuteChanged::Create(is_input, is_muted); + scoped_ptr 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 1a5c0c2d67e4f0..1fd5ba8f93f219 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; diff --git a/extensions/browser/api/audio/audio_apitest.cc b/extensions/browser/api/audio/audio_apitest.cc index 96d72b4932de79..02bcfbc0d0e184 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 5d0ac0708be2a2..46b0ce282c5d01 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 0f652a0b0208db..915bf3630fdfa3 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 9461cbd3cf0437..dc3f1c7f8b94d8 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 66a599df8ed89f..550c56c645432e 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 f78cd90b6ffc8b..0f47352ad53283 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 00000000000000..f248c6196adf34 --- /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 00000000000000..014be98767bd26 --- /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 00000000000000..2a4d60a201f9e9 --- /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 00000000000000..d91d3dc8f36c9e --- /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" + ] +}