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

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: 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 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();
}

Powered by Google App Engine
This is Rietveld 408576698