Chromium Code Reviews| Index: chrome/browser/copresence/chrome_whispernet_client_browsertest.cc |
| diff --git a/chrome/browser/copresence/chrome_whispernet_client_browsertest.cc b/chrome/browser/copresence/chrome_whispernet_client_browsertest.cc |
| index 5c1f5b885ee968a4aecea6fe0c89fce4c820b62c..f1d3c2a78d60892a0a012eb711b6eb606f5f52b9 100644 |
| --- a/chrome/browser/copresence/chrome_whispernet_client_browsertest.cc |
| +++ b/chrome/browser/copresence/chrome_whispernet_client_browsertest.cc |
| @@ -4,6 +4,7 @@ |
| #include "chrome/browser/copresence/chrome_whispernet_client.h" |
| +#include <cmath> |
| #include <cstdlib> |
| #include <string> |
| @@ -17,8 +18,13 @@ |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| +#include "components/audio_modem/public/audio_modem_types.h" |
| #include "components/audio_modem/public/whispernet_client.h" |
| +#include "media/audio/audio_manager.h" |
| +#include "media/audio/audio_manager_base.h" |
| +#include "media/audio/audio_parameters.h" |
| #include "media/base/audio_bus.h" |
| +#include "media/base/audio_converter.h" |
| using audio_modem::WhispernetClient; |
| using audio_modem::AUDIBLE; |
| @@ -56,10 +62,14 @@ std::string AudioBusToString(scoped_refptr<media::AudioBusRefCounted> source) { |
| } // namespace |
| -class ChromeWhispernetClientTest : public ExtensionBrowserTest { |
| +class ChromeWhispernetClientTest : public ExtensionBrowserTest, |
| + public media::AudioConverter::InputCallback { |
| protected: |
| ChromeWhispernetClientTest() |
| - : context_(NULL), expected_audible_(false), initialized_(false) {} |
| + : context_(NULL), |
| + expected_audible_(false), |
| + saved_samples_index_(0), |
| + initialized_(false) {} |
| ~ChromeWhispernetClientTest() override {} |
| @@ -69,8 +79,24 @@ class ChromeWhispernetClientTest : public ExtensionBrowserTest { |
| GetWhispernetClient(context_)->Initialize(base::Bind( |
| &ChromeWhispernetClientTest::InitCallback, base::Unretained(this))); |
| run_loop_->Run(); |
| - |
| EXPECT_TRUE(initialized_); |
| + |
| + // We get default parameters here instead of the constructor since |
| + // initializing Whispernet also creates our AudioManager. Initializing from |
| + // the test instead causes issues. |
| + default_params_ = media::AudioManager::Get()->GetInputStreamParameters( |
| + media::AudioManagerBase::kDefaultDeviceId); |
| + |
| + coder_params_ = media::AudioParameters( |
|
Charlie
2015/02/20 00:58:20
nit: extra space before =
rkc
2015/02/20 18:53:07
There is a space between the coder_params_ and the
|
| + default_params_.format(), audio_modem::kDefaultChannelLayout, |
| + audio_modem::kDefaultSampleRate, audio_modem::kDefaultBitsPerSample, |
| + default_params_.frames_per_buffer(), |
| + media::AudioParameters::NO_EFFECTS); |
| + |
| + converter_.reset(new media::AudioConverter( |
| + coder_params_, default_params_, |
| + default_params_.sample_rate() == coder_params_.sample_rate())); |
| + converter_->AddInput(this); |
| } |
| void EncodeTokenAndSaveSamples(bool audible, const std::string& token) { |
| @@ -104,17 +130,8 @@ class ChromeWhispernetClientTest : public ExtensionBrowserTest { |
| ASSERT_GT(saved_samples_->frames(), 0); |
| - // Convert our single channel samples to two channel. Decode samples |
| - // expects 2 channel data. |
| scoped_refptr<media::AudioBusRefCounted> samples_bus = |
| - media::AudioBusRefCounted::Create(2, saved_samples_->frames()); |
| - memcpy(samples_bus->channel(0), |
| - saved_samples_->channel(0), |
| - sizeof(float) * saved_samples_->frames()); |
| - memcpy(samples_bus->channel(1), |
| - saved_samples_->channel(0), |
| - sizeof(float) * saved_samples_->frames()); |
| - |
| + ConvertSavedSamplesToSystemParams(); |
| client->DecodeSamples( |
| expect_audible ? AUDIBLE : INAUDIBLE, |
| AudioBusToString(samples_bus), token_length); |
| @@ -165,13 +182,66 @@ class ChromeWhispernetClientTest : public ExtensionBrowserTest { |
| run_loop_->Quit(); |
| } |
| + // AudioConverter::InputCallback overrides: |
| + double ProvideInput(media::AudioBus* dest, |
|
Charlie
2015/02/20 00:58:20
This can be private.
rkc
2015/02/20 18:53:07
Done.
|
| + base::TimeDelta /* buffer_delay */) override { |
| + int remaining_frames = saved_samples_->frames() - saved_samples_index_; |
| + int frames_to_copy = std::min(remaining_frames, dest->frames()); |
| + saved_samples_stereo_->CopyPartialFramesTo(saved_samples_index_, |
| + frames_to_copy, 0, dest); |
| + saved_samples_index_ += frames_to_copy; |
| + return 1.0; |
| + } |
| + |
| private: |
| + scoped_refptr<media::AudioBusRefCounted> ConvertSavedSamplesToSystemParams() { |
| + int new_size = |
| + saved_samples_->frames() * |
| + std::ceil(static_cast<double>(default_params_.sample_rate()) / |
|
Charlie
2015/02/20 00:58:21
Instead of static_cast<double>, just multiply by 1
rkc
2015/02/20 18:53:07
I prefer casting here since it makes it very expli
|
| + coder_params_.sample_rate()); |
| + new_size = |
| + std::ceil(static_cast<double>(new_size) / converter_->ChunkSize()) * |
| + converter_->ChunkSize(); |
| + scoped_refptr<media::AudioBusRefCounted> converted_samples = |
| + media::AudioBusRefCounted::Create(default_params_.channels(), new_size); |
| + int converted_samples_index = 0; |
| + |
| + // Convert our single channel samples to two channel. Decode samples |
| + // expects 2 channel data. |
| + saved_samples_stereo_ = |
| + media::AudioBusRefCounted::Create(2, saved_samples_->frames()); |
| + memcpy(saved_samples_stereo_->channel(0), saved_samples_->channel(0), |
| + sizeof(float) * saved_samples_->frames()); |
| + memcpy(saved_samples_stereo_->channel(1), saved_samples_->channel(0), |
| + sizeof(float) * saved_samples_->frames()); |
| + |
| + saved_samples_index_ = 0; |
| + // While we still have frames to convert. |
| + while (saved_samples_->frames() - saved_samples_index_ != 0) { |
|
Charlie
2015/02/20 00:58:20
while (saved_samples_index_ < saved_samples_->fram
rkc
2015/02/20 18:53:07
Done.
|
| + scoped_ptr<media::AudioBus> converted_source = media::AudioBus::Create( |
|
DaleCurtis
2015/02/20 18:31:42
Why not just make a single call to Convert asking
rkc
2015/02/20 18:53:07
Done.
|
| + default_params_.channels(), converter_->ChunkSize()); |
| + converter_->Convert(converted_source.get()); |
| + converted_source->CopyPartialFramesTo(0, converted_source->frames(), |
| + converted_samples_index, |
| + converted_samples.get()); |
| + converted_samples_index += converted_source->frames(); |
| + } |
| + |
| + return converted_samples; |
| + } |
| + |
| scoped_ptr<base::RunLoop> run_loop_; |
| content::BrowserContext* context_; |
| std::string expected_token_; |
| bool expected_audible_; |
| scoped_refptr<media::AudioBusRefCounted> saved_samples_; |
| + scoped_refptr<media::AudioBusRefCounted> saved_samples_stereo_; |
| + int saved_samples_index_; |
| + scoped_ptr<media::AudioConverter> converter_; |
| + |
| + media::AudioParameters default_params_; |
| + media::AudioParameters coder_params_; |
| bool initialized_; |
| @@ -183,18 +253,19 @@ class ChromeWhispernetClientTest : public ExtensionBrowserTest { |
| #define MAYBE_Initialize DISABLED_Initialize |
| #define MAYBE_EncodeToken DISABLED_EncodeToken |
| #define MAYBE_DecodeSamples DISABLED_DecodeSamples |
| -#define MAYBE_DetectBroadcast DISABLED_DetectBroadcast |
| #define MAYBE_Audible DISABLED_Audible |
| #define MAYBE_TokenLengths DISABLED_TokenLengths |
| #else |
| #define MAYBE_Initialize Initialize |
| #define MAYBE_EncodeToken EncodeToken |
| #define MAYBE_DecodeSamples DecodeSamples |
| -#define MAYBE_DetectBroadcast DetectBroadcast |
| #define MAYBE_Audible Audible |
| #define MAYBE_TokenLengths TokenLengths |
| #endif |
| +// DetectBroadcast will be removed soon, it isn't supported or needed anymore. |
|
Charlie
2015/02/20 00:58:21
The CL I just checked in deletes this. And leaves
rkc
2015/02/20 18:53:07
Acknowledged.
|
| +#define MAYBE_DetectBroadcast DISABLED_DetectBroadcast |
| + |
| IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_Initialize) { |
| InitializeWhispernet(); |
| } |