Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(347)

Unified Diff: chromeos/audio/cras_audio_handler_unittest.cc

Issue 2721733003: Handle the dual microphones and dual cameras cases. Activate the proper microphone when user activa… (Closed)
Patch Set: Nit: log only the invalid camera facing mode value. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chromeos/audio/cras_audio_handler.cc ('k') | media/base/BUILD.gn » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chromeos/audio/cras_audio_handler_unittest.cc
diff --git a/chromeos/audio/cras_audio_handler_unittest.cc b/chromeos/audio/cras_audio_handler_unittest.cc
index 03c158f1dfd9cb471fd5032c5c9c24f4a2c8dab3..21c1a894452419534d0adc26b686e02f709c268c 100644
--- a/chromeos/audio/cras_audio_handler_unittest.cc
+++ b/chromeos/audio/cras_audio_handler_unittest.cc
@@ -21,6 +21,7 @@
#include "chromeos/dbus/audio_node.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/fake_cras_audio_client.h"
+#include "media/base/video_facing.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
@@ -36,6 +37,8 @@ const uint64_t kUSBHeadphoneId1 = 10007;
const uint64_t kUSBHeadphoneId2 = 10008;
const uint64_t kMicJackId = 10009;
const uint64_t kKeyboardMicId = 10010;
+const uint64_t kFrontMicId = 10011;
+const uint64_t kRearMicId = 10012;
const uint64_t kOtherTypeOutputId = 90001;
const uint64_t kOtherTypeInputId = 90002;
const uint64_t kUSBJabraSpeakerOutputId1 = 90003;
@@ -71,6 +74,12 @@ const AudioNodeInfo kKeyboardMic[] = {{true, kKeyboardMicId,
"Fake Keyboard Mic", "KEYBOARD_MIC",
"Keyboard Mic"}};
+const AudioNodeInfo kFrontMic[] = {
+ {true, kFrontMicId, "Fake Front Mic", "FRONT_MIC", "Front Mic"}};
+
+const AudioNodeInfo kRearMic[] = {
+ {true, kRearMicId, "Fake Rear Mic", "REAR_MIC", "Rear Mic"}};
+
const AudioNodeInfo kOtherTypeOutput[] = {{false, kOtherTypeOutputId,
"Output Device", "SOME_OTHER_TYPE",
"Other Type Output Device"}};
@@ -211,6 +220,32 @@ class TestObserver : public chromeos::CrasAudioHandler::AudioObserver {
DISALLOW_COPY_AND_ASSIGN(TestObserver);
};
+class FakeVideoCaptureManager {
+ public:
+ FakeVideoCaptureManager() {}
+ virtual ~FakeVideoCaptureManager() {}
+
+ void AddObserver(media::VideoCaptureObserver* observer) {
+ observers_.AddObserver(observer);
+ }
+
+ void RemoveAllObservers() { observers_.Clear(); }
+
+ void NotifyVideoCaptureStarted(media::VideoFacingMode facing) {
+ for (auto& observer : observers_)
+ observer.OnVideoCaptureStarted(facing);
+ }
+
+ void NotifyVideoCaptureStopped(media::VideoFacingMode facing) {
+ for (auto& observer : observers_)
+ observer.OnVideoCaptureStopped(facing);
+ }
+
+ private:
+ base::ObserverList<media::VideoCaptureObserver> observers_;
+ DISALLOW_COPY_AND_ASSIGN(FakeVideoCaptureManager);
+};
+
} // namespace
// Test param is the version of stabel device id used by audio node.
@@ -219,11 +254,15 @@ class CrasAudioHandlerTest : public testing::TestWithParam<int> {
CrasAudioHandlerTest() {}
~CrasAudioHandlerTest() override {}
- void SetUp() override {}
+ void SetUp() override {
+ video_capture_manager_.reset(new FakeVideoCaptureManager);
+ }
void TearDown() override {
cras_audio_handler_->RemoveAudioObserver(test_observer_.get());
test_observer_.reset();
+ video_capture_manager_->RemoveAllObservers();
+ video_capture_manager_.reset();
CrasAudioHandler::Shutdown();
audio_pref_handler_ = nullptr;
DBusThreadManager::Shutdown();
@@ -257,6 +296,7 @@ class CrasAudioHandlerTest : public testing::TestWithParam<int> {
cras_audio_handler_ = CrasAudioHandler::Get();
test_observer_.reset(new TestObserver);
cras_audio_handler_->AddAudioObserver(test_observer_.get());
+ video_capture_manager_->AddObserver(cras_audio_handler_);
base::RunLoop().RunUntilIdle();
}
@@ -348,12 +388,33 @@ class CrasAudioHandlerTest : public testing::TestWithParam<int> {
base::RunLoop().RunUntilIdle();
}
+ void StartFrontFacingCamera() {
+ video_capture_manager_->NotifyVideoCaptureStarted(
+ media::MEDIA_VIDEO_FACING_USER);
+ }
+
+ void StopFrontFacingCamera() {
+ video_capture_manager_->NotifyVideoCaptureStopped(
+ media::MEDIA_VIDEO_FACING_USER);
+ }
+
+ void StartRearFacingCamera() {
+ video_capture_manager_->NotifyVideoCaptureStarted(
+ media::MEDIA_VIDEO_FACING_ENVIRONMENT);
+ }
+
+ void StopRearFacingCamera() {
+ video_capture_manager_->NotifyVideoCaptureStopped(
+ media::MEDIA_VIDEO_FACING_ENVIRONMENT);
+ }
+
protected:
base::MessageLoopForUI message_loop_;
CrasAudioHandler* cras_audio_handler_ = nullptr; // Not owned.
FakeCrasAudioClient* fake_cras_audio_client_ = nullptr; // Not owned.
std::unique_ptr<TestObserver> test_observer_;
scoped_refptr<AudioDevicesPrefHandlerStub> audio_pref_handler_;
+ std::unique_ptr<FakeVideoCaptureManager> video_capture_manager_;
private:
DISALLOW_COPY_AND_ASSIGN(CrasAudioHandlerTest);
@@ -3680,4 +3741,191 @@ TEST_P(CrasAudioHandlerTest, HDMIOutputUnplugDuringSuspension) {
EXPECT_TRUE(test_observer_->output_mute_by_system());
}
+TEST_P(CrasAudioHandlerTest, FrontCameraStartStop) {
+ AudioNodeList audio_nodes = GenerateAudioNodeList({kFrontMic, kRearMic});
+ SetUpCrasAudioHandler(audio_nodes);
+
+ // Verify the audio devices size.
+ AudioDeviceList audio_devices;
+ cras_audio_handler_->GetAudioDevices(&audio_devices);
+ EXPECT_EQ(audio_nodes.size(), audio_devices.size());
+
+ // Verify the front mic has been selected as the active input.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+ EXPECT_TRUE(cras_audio_handler_->HasDualInternalMic());
+
+ // Start the front facing camera.
+ StartFrontFacingCamera();
+ // Verify the front mic has been selected as the active input.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+ // Stop the front facing camera.
+ StopFrontFacingCamera();
+ // Verify the front mic has been selected as the active input.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+}
+
+TEST_P(CrasAudioHandlerTest, RearCameraStartStop) {
+ AudioNodeList audio_nodes = GenerateAudioNodeList({kFrontMic, kRearMic});
+ SetUpCrasAudioHandler(audio_nodes);
+
+ // Verify the audio devices size.
+ AudioDeviceList audio_devices;
+ cras_audio_handler_->GetAudioDevices(&audio_devices);
+ EXPECT_EQ(audio_nodes.size(), audio_devices.size());
+
+ // Verify the front mic has been selected as the active input.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+ EXPECT_TRUE(cras_audio_handler_->HasDualInternalMic());
+
+ // Start the rear facing camera.
+ StartRearFacingCamera();
+ // Verify the active input is switched to the rear mic.
+ EXPECT_EQ(kRearMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+ // Stop the rear facing camera.
+ StopRearFacingCamera();
+ // Verify the active input is switched back to front mic.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+}
+
+TEST_P(CrasAudioHandlerTest, SwitchFrontRearCamera) {
+ AudioNodeList audio_nodes = GenerateAudioNodeList({kFrontMic, kRearMic});
+ SetUpCrasAudioHandler(audio_nodes);
+
+ // Verify the audio devices size.
+ AudioDeviceList audio_devices;
+ cras_audio_handler_->GetAudioDevices(&audio_devices);
+ EXPECT_EQ(audio_nodes.size(), audio_devices.size());
+
+ // Verify the front mic has been selected as the active input.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+ EXPECT_TRUE(cras_audio_handler_->HasDualInternalMic());
+
+ // Start the front facing camera.
+ StartFrontFacingCamera();
+ // Verify the front mic has been selected as the active input.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+ // Simulates the camera app switching from front camera to rear camera.
+ StopFrontFacingCamera();
+ StartRearFacingCamera();
+
+ // Verify the rear mic has been selected as the active input.
+ EXPECT_EQ(kRearMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+}
+
+TEST_P(CrasAudioHandlerTest, StartFrontCameraWithActiveExternalInput) {
+ AudioNodeList audio_nodes =
+ GenerateAudioNodeList({kFrontMic, kRearMic, kMicJack});
+ SetUpCrasAudioHandler(audio_nodes);
+
+ // Verify the audio devices size.
+ AudioDeviceList audio_devices;
+ cras_audio_handler_->GetAudioDevices(&audio_devices);
+ EXPECT_EQ(audio_nodes.size(), audio_devices.size());
+
+ // Verify the mic Jack has been selected as the active input.
+ EXPECT_EQ(kMicJackId, cras_audio_handler_->GetPrimaryActiveInputNode());
+ EXPECT_TRUE(cras_audio_handler_->HasDualInternalMic());
+
+ // Start the front facing camera.
+ StartFrontFacingCamera();
+ // Verify the mic Jack has been selected as the active input.
+ EXPECT_EQ(kMicJackId, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+ // Stop the front facing camera.
+ StopFrontFacingCamera();
+ // Verify the mic Jack remains as the active input.
+ EXPECT_EQ(kMicJackId, cras_audio_handler_->GetPrimaryActiveInputNode());
+}
+
+TEST_P(CrasAudioHandlerTest, StartFrontCameraWithInactiveExternalInput) {
+ AudioNodeList audio_nodes =
+ GenerateAudioNodeList({kFrontMic, kRearMic, kMicJack});
+ SetUpCrasAudioHandler(audio_nodes);
+
+ // Verify the audio devices size.
+ AudioDeviceList audio_devices;
+ cras_audio_handler_->GetAudioDevices(&audio_devices);
+ EXPECT_EQ(audio_nodes.size(), audio_devices.size());
+
+ // Verify the mic Jack has been selected as the active input.
+ EXPECT_EQ(kMicJackId, cras_audio_handler_->GetPrimaryActiveInputNode());
+ EXPECT_TRUE(cras_audio_handler_->HasDualInternalMic());
+
+ // Change the active input to internal mic.
+ cras_audio_handler_->SwitchToFrontOrRearMic();
+ // Verify the active input has been switched to front mic.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+ // Start the front facing camera.
+ StartFrontFacingCamera();
+ // Verify the front mic has been selected as the active input.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+ // Stop the front facing camera.
+ StopFrontFacingCamera();
+ // Verify the active input remains as front mic.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+}
+
+TEST_P(CrasAudioHandlerTest, StartFrontCameraWithoutDualMic) {
+ AudioNodeList audio_nodes = GenerateAudioNodeList({kInternalMic});
+ SetUpCrasAudioHandler(audio_nodes);
+
+ // Verify the audio devices size.
+ AudioDeviceList audio_devices;
+ cras_audio_handler_->GetAudioDevices(&audio_devices);
+ EXPECT_EQ(audio_nodes.size(), audio_devices.size());
+
+ // Verify the mic Jack has been selected as the active input.
+ EXPECT_EQ(kInternalMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+ EXPECT_FALSE(cras_audio_handler_->HasDualInternalMic());
+
+ // Start the front facing camera.
+ StartFrontFacingCamera();
+ // Verify the internal mic has been selected as the active input.
+ EXPECT_EQ(kInternalMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+ // Stop the front facing camera.
+ StopFrontFacingCamera();
+ // Verify the active input remains as interanl mic.
+ EXPECT_EQ(kInternalMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+}
+
+TEST_P(CrasAudioHandlerTest, FrontRearCameraBothOn) {
+ AudioNodeList audio_nodes = GenerateAudioNodeList({kFrontMic, kRearMic});
+ SetUpCrasAudioHandler(audio_nodes);
+
+ // Verify the audio devices size.
+ AudioDeviceList audio_devices;
+ cras_audio_handler_->GetAudioDevices(&audio_devices);
+ EXPECT_EQ(audio_nodes.size(), audio_devices.size());
+
+ // Verify the front mic has been selected as the active input.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+ EXPECT_TRUE(cras_audio_handler_->HasDualInternalMic());
+
+ // Start the rear facing camera.
+ StartRearFacingCamera();
+ // Verify the rear mic has been selected as the active input.
+ EXPECT_EQ(kRearMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+ // Start front camera without stopping the front camera.
+ StartFrontFacingCamera();
+ // Verify the active microphone does not change.
+ EXPECT_EQ(kRearMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+ // Stop the front mic.
+ StopFrontFacingCamera();
+ // Verity the active mic does not change when there is still camera on.
+ EXPECT_EQ(kRearMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+
+ // Stop the rear mic.
+ StopRearFacingCamera();
+ // Verify the actice mic changes to front mic after both cameras stop.
+ EXPECT_EQ(kFrontMicId, cras_audio_handler_->GetPrimaryActiveInputNode());
+}
+
} // namespace chromeos
« no previous file with comments | « chromeos/audio/cras_audio_handler.cc ('k') | media/base/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698