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

Unified Diff: chrome/browser/copresence/chrome_whispernet_client_browsertest.cc

Issue 940123004: Convert audio samples in Whispernet. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: test fix. Created 5 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
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 c6a9bc79ad3bab591f8bbd1d1cae854bb5a768c0..772d2e177b2d7ed7dfd5dfa604eee6c180143b5b 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;
@@ -59,10 +65,13 @@ void IgnoreResult(bool success) {}
} // namespace
-class ChromeWhispernetClientTest : public ExtensionBrowserTest {
+class ChromeWhispernetClientTest : public ExtensionBrowserTest,
+ public media::AudioConverter::InputCallback {
protected:
ChromeWhispernetClientTest()
- : initialized_(false), expected_audible_(false) {}
+ : initialized_(false),
+ expected_audible_(false),
+ saved_samples_index_(0) {}
~ChromeWhispernetClientTest() override {}
@@ -74,10 +83,35 @@ class ChromeWhispernetClientTest : public ExtensionBrowserTest {
run_loop_.reset(new base::RunLoop());
run_loop_->Run();
-
EXPECT_TRUE(initialized_);
}
+ // This needs to be called before any of the decoder tests are run. We can't
+ // run this code in the constructor or the SetUp methods because the audio
+ // manager seems to get initialized only *after* ExtensionBrowserTest::SetUp
+ // has finished executing. Setting up a testing AudioMager causes the actual
+ // create happening later in the browser initialization to fail. The only way
+ // around this at the moment seems to be to have this method called from
+ // every test before they try to decode.
+ void SetupDecode() {
+ // 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(
+ 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(WhispernetClient* client,
bool audible,
const std::string& token) {
@@ -107,20 +141,10 @@ 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_params);
+ AudioBusToString(samples_bus), token_params);
run_loop_->Run();
}
@@ -150,13 +174,59 @@ class ChromeWhispernetClientTest : public ExtensionBrowserTest {
EXPECT_EQ(expected_audible_, tokens[0].audible);
}
+ private:
+ scoped_refptr<media::AudioBusRefCounted> ConvertSavedSamplesToSystemParams() {
+ int new_size =
+ saved_samples_->frames() *
+ std::ceil(static_cast<double>(default_params_.sample_rate()) /
+ 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);
+
+ // 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;
+ converter_->Convert(converted_samples.get());
+
+ return converted_samples;
+ }
+
+ // AudioConverter::InputCallback overrides:
+ double ProvideInput(media::AudioBus* dest,
+ 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;
+ }
+
scoped_ptr<base::RunLoop> run_loop_;
bool initialized_;
- private:
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_;
DISALLOW_COPY_AND_ASSIGN(ChromeWhispernetClientTest);
};
@@ -186,6 +256,8 @@ IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_EncodeAndDecode) {
TokenParameters token_params[2];
GetTokenParamsForLengths(kTokenLengths, token_params);
+ SetupDecode();
+
EncodeTokenAndSaveSamples(client.get(), true, kSixZeros);
DecodeSamplesAndVerifyToken(client.get(), true, kSixZeros, token_params);
@@ -201,6 +273,9 @@ IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_TokenLengths) {
const size_t kLongTokenLengths[2] = {8, 9};
TokenParameters token_params[2];
GetTokenParamsForLengths(kLongTokenLengths, token_params);
+
+ SetupDecode();
+
EncodeTokenAndSaveSamples(client.get(), true, kEightZeros);
DecodeSamplesAndVerifyToken(client.get(), true, kEightZeros, token_params);
@@ -217,6 +292,8 @@ IN_PROC_BROWSER_TEST_F(ChromeWhispernetClientTest, MAYBE_MultipleClients) {
TokenParameters token_params[2];
GetTokenParamsForLengths(kTokenLengths, token_params);
+ SetupDecode();
+
client_1->Initialize(base::Bind(&IgnoreResult));
EncodeTokenAndSaveSamples(client_1.get(), true, kSixZeros);
« no previous file with comments | « chrome/browser/copresence/chrome_whispernet_client.cc ('k') | chrome/browser/copresence/chrome_whispernet_config.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698