From d404946c14b00c4cce6129760056417c84be05da Mon Sep 17 00:00:00 2001 From: henrika Date: Fri, 12 Jul 2019 13:37:11 +0200 Subject: [PATCH] Minor modifications for ADM2 on Windows. Code is not used in production. Need this change for a local test. Using TBR. TBR: henrik.lundin Bug: webrtc:9265 Change-Id: I9f0cb265a51507de59ef2d7fd151465133687525 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/145330 Commit-Queue: Henrik Andreassson Reviewed-by: Henrik Andreassson Cr-Commit-Position: refs/heads/master@{#28557} --- modules/audio_device/audio_device_unittest.cc | 24 ++++++++++++++ .../win/audio_device_module_win.cc | 32 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/modules/audio_device/audio_device_unittest.cc b/modules/audio_device/audio_device_unittest.cc index aeb03ee5fe..8dab1c74e9 100644 --- a/modules/audio_device/audio_device_unittest.cc +++ b/modules/audio_device/audio_device_unittest.cc @@ -816,6 +816,30 @@ TEST_P(AudioDeviceTest, InitStopInitRecording) { StopRecording(); } +// Verify that additional attempts to initialize or start recording while +// already being active works. Additional calls should just be ignored. +TEST_P(AudioDeviceTest, StartInitRecording) { + SKIP_TEST_IF_NOT(requirements_satisfied()); + StartRecording(); + // An additional attempt to initialize at this stage should be ignored. + EXPECT_EQ(0, audio_device()->InitRecording()); + // Same for additional request to start recording while already active. + EXPECT_EQ(0, audio_device()->StartRecording()); + StopRecording(); +} + +// Verify that additional attempts to initialize or start playou while +// already being active works. Additional calls should just be ignored. +TEST_P(AudioDeviceTest, StartInitPlayout) { + SKIP_TEST_IF_NOT(requirements_satisfied()); + StartPlayout(); + // An additional attempt to initialize at this stage should be ignored. + EXPECT_EQ(0, audio_device()->InitPlayout()); + // Same for additional request to start playout while already active. + EXPECT_EQ(0, audio_device()->StartPlayout()); + StopPlayout(); +} + // Tests Init/Stop/Init recording while playout is active. TEST_P(AudioDeviceTest, InitStopInitRecordingWhilePlaying) { SKIP_TEST_IF_NOT(requirements_satisfied()); diff --git a/modules/audio_device/win/audio_device_module_win.cc b/modules/audio_device/win/audio_device_module_win.cc index f0c7349737..47d1ff79f5 100644 --- a/modules/audio_device/win/audio_device_module_win.cc +++ b/modules/audio_device/win/audio_device_module_win.cc @@ -39,6 +39,34 @@ namespace { } \ } while (0) +#define RETURN_IF_OUTPUT_IS_INITIALIZED(...) \ + do { \ + if (output_->PlayoutIsInitialized()) { \ + return __VA_ARGS__; \ + } \ + } while (0) + +#define RETURN_IF_INPUT_IS_INITIALIZED(...) \ + do { \ + if (input_->RecordingIsInitialized()) { \ + return __VA_ARGS__; \ + } \ + } while (0) + +#define RETURN_IF_OUTPUT_IS_ACTIVE(...) \ + do { \ + if (output_->Playing()) { \ + return __VA_ARGS__; \ + } \ + } while (0) + +#define RETURN_IF_INPUT_IS_ACTIVE(...) \ + do { \ + if (input_->Recording()) { \ + return __VA_ARGS__; \ + } \ + } while (0) + // This class combines a generic instance of an AudioInput and a generic // instance of an AudioOutput to create an AudioDeviceModule. This is mostly // done by delegating to the audio input/output with some glue code. This class @@ -230,6 +258,7 @@ class WindowsAudioDeviceModule : public AudioDeviceModuleForTest { RTC_LOG(INFO) << __FUNCTION__; RTC_DCHECK_RUN_ON(&thread_checker_); RETURN_IF_OUTPUT_RESTARTS(0); + RETURN_IF_OUTPUT_IS_INITIALIZED(0); return output_->InitPlayout(); } @@ -251,6 +280,7 @@ class WindowsAudioDeviceModule : public AudioDeviceModuleForTest { RTC_LOG(INFO) << __FUNCTION__; RTC_DCHECK_RUN_ON(&thread_checker_); RETURN_IF_INPUT_RESTARTS(0); + RETURN_IF_INPUT_IS_INITIALIZED(0); return input_->InitRecording(); } @@ -265,6 +295,7 @@ class WindowsAudioDeviceModule : public AudioDeviceModuleForTest { RTC_LOG(INFO) << __FUNCTION__; RTC_DCHECK_RUN_ON(&thread_checker_); RETURN_IF_OUTPUT_RESTARTS(0); + RETURN_IF_OUTPUT_IS_ACTIVE(0); return output_->StartPlayout(); } @@ -286,6 +317,7 @@ class WindowsAudioDeviceModule : public AudioDeviceModuleForTest { RTC_LOG(INFO) << __FUNCTION__; RTC_DCHECK_RUN_ON(&thread_checker_); RETURN_IF_INPUT_RESTARTS(0); + RETURN_IF_INPUT_IS_ACTIVE(0); return input_->StartRecording(); }