Index: chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc |
diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc |
index 2b7b358343a5b3a2acffba6dfefc9273d1890a3a..39760c7e4bbcfb6891056e016892a48df78c9050 100644 |
--- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc |
+++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa_unittest.cc |
@@ -26,8 +26,8 @@ namespace media { |
namespace { |
// Testing constants that are common to multiple test cases. |
+const size_t kBytesPerSample = sizeof(int32_t); |
const int kNumChannels = 2; |
-const int kBytesPerSample = 4; |
const int kTestMaxReadSize = 4096; |
const int kTestSamplesPerSecond = 12345; |
@@ -36,73 +36,77 @@ const int kTestSamplesPerSecond = 12345; |
#define NUM_DATA_SETS 2u |
#define NUM_SAMPLES 64u |
-float kTestData[NUM_DATA_SETS][NUM_SAMPLES] = { |
+// Note: Test data should be represented as 32-bit integers and copied into |
+// ::media::AudioBus instances, rather than wrapping statically declared float |
+// arrays. The latter method is brittle, as ::media::AudioBus requires 16-bit |
+// alignment for internal data. |
+const int32_t kTestData[NUM_DATA_SETS][NUM_SAMPLES] = { |
{ |
- 0.034619, -0.62082, |
- -0.633705, 0.530298, |
- 0.89957, 0.864411, |
- 0.302309, 0.262931, |
- 0.780742, 0.0109042, |
- -0.602219, 0.255149, |
- -0.454606, 0.857073, |
- 0.798388, 0.167035, |
- 0.458046, 0.588998, |
- 0.206043, 0.569494, |
- 0.147803, 0.170857, |
- 0.648797, -0.475908, |
- -0.95678, -0.0743951, |
- 0.524809, -0.924101, |
- 0.65518, -0.322856, |
- -0.721563, 0.573805, |
- 0.451849, -0.814982, |
- -0.364712, 0.573464, |
- 0.537977, -0.381851, |
- 0.53816, -0.516168, |
- -0.0700984, 0.481362, |
- 0.98778, 0.852158, |
- -0.8815, -0.381422, |
- -0.230589, 0.466485, |
- -0.67107, 0.322319, |
- 0.892472, -0.320276, |
- -0.424015, 0.789646, |
- 0.462945, 0.826759, |
- 0.423481, 0.229418, |
- -0.354715, -0.961272, |
- 0.632236, -0.735754, |
- 0.872045, -0.709881, |
+ 74343736, -1333200799, |
+ -1360871126, 1138806283, |
+ 1931811865, 1856308487, |
+ 649203634, 564640023, |
+ 1676630678, 23416591, |
+ -1293255456, 547928305, |
+ -976258952, 1840550252, |
+ 1714525174, 358704931, |
+ 983646295, 1264863573, |
+ 442473973, 1222979052, |
+ 317404525, 366912613, |
+ 1393280948, -1022004648, |
+ -2054669405, -159762261, |
+ 1127018745, -1984491787, |
+ 1406988336, -693327981, |
+ -1549544744, 1232236854, |
+ 970338338, -1750160519, |
+ -783213057, 1231504562, |
+ 1155296810, -820018779, |
+ 1155689800, -1108462340, |
+ -150535168, 1033717023, |
+ 2121241397, 1829995370, |
+ -1893006836, -819097508, |
+ -495186107, 1001768909, |
+ -1441111852, 692174781, |
+ 1916569026, -687787473, |
+ -910565280, 1695751872, |
+ 994166817, 1775451433, |
+ 909418522, 492671403, |
+ -761744663, -2064315902, |
+ 1357716471, -1580019684, |
+ 1872702377, -1524457840, |
}, { |
- 0.908805, 0.331583, |
- 0.514689, 0.803509, |
- -0.459579, 0.106887, |
- 0.48557, 0.879381, |
- 0.688156, 0.692105, |
- -0.158415, -0.851542, |
- 0.660676, -0.33735, |
- -0.49228, 0.655911, |
- -0.014641, 0.66197, |
- -0.573276, 0.254189, |
- 0.666018, 0.98153, |
- -0.967202, -0.525433, |
- -0.838106, -0.484799, |
- 0.889906, -0.548501, |
- -0.889936, -0.432651, |
- 0.590209, 0.0801954, |
- -0.953734, -0.994462, |
- 0.341957, 0.565746, |
- 0.605983, -0.152254, |
- -0.232025, -0.54384, |
- -0.274306, 0.275652, |
- 0.276137, -0.367112, |
- -0.000647, 0.68271, |
- 0.179821, 0.646818, |
- 0.435898, -0.669994, |
- 0.624382, -0.752883, |
- -0.396175, 0.776021, |
- 0.600866, -0.2293, |
- 0.306964, -0.252563, |
- -0.055882, 0.480061, |
- -0.408798, -0.405238, |
- 0.61592, -0.16056, |
+ 1951643876, 712069070, |
+ 1105286211, 1725522438, |
+ -986938388, 229538084, |
+ 1042753634, 1888456317, |
+ 1477803757, 1486284170, |
+ -340193623, -1828672521, |
+ 1418790906, -724453609, |
+ -1057163251, 1408558147, |
+ -31441309, 1421569750, |
+ -1231100836, 545866721, |
+ 1430262764, 2107819625, |
+ -2077050480, -1128358776, |
+ -1799818931, -1041097926, |
+ 1911058583, -1177896929, |
+ -1911123008, -929110948, |
+ 1267464176, 172218310, |
+ -2048128170, -2135590884, |
+ 734347065, 1214930283, |
+ 1301338583, -326962976, |
+ -498269894, -1167887508, |
+ -589067650, 591958162, |
+ 592999692, -788367017, |
+ -1389422, 1466108561, |
+ 386162657, 1389031078, |
+ 936083827, -1438801160, |
+ 1340850135, -1616803932, |
+ -850779335, 1666492408, |
+ 1290349909, -492418001, |
+ 659200170, -542374913, |
+ -120005682, 1030923147, |
+ -877887021, -870241979, |
+ 1322678128, -344799975, |
} |
}; |
@@ -110,8 +114,8 @@ float kTestData[NUM_DATA_SETS][NUM_SAMPLES] = { |
scoped_ptr<::media::AudioBus> GetTestData(size_t index) { |
CHECK_LT(index, NUM_DATA_SETS); |
int frames = NUM_SAMPLES / kNumChannels; |
- auto data = |
- ::media::AudioBus::WrapMemory(kNumChannels, frames, kTestData[index]); |
+ auto data = ::media::AudioBus::Create(kNumChannels, frames); |
+ data->FromInterleaved(kTestData[index], frames, kBytesPerSample); |
return data; |
} |
@@ -394,6 +398,8 @@ TEST_F(StreamMixerAlsaTest, OneStreamMixesProperly) { |
const int kNumFrames = 32; |
input->SetData(GetTestData(0)); |
+ ASSERT_EQ(mock_alsa()->data().size(), 0u); |
+ |
// Write the stream to ALSA. |
EXPECT_CALL(*input, GetResampledData(_, kNumFrames)); |
EXPECT_CALL(*input, AfterWriteFrames(_)); |
@@ -405,8 +411,7 @@ TEST_F(StreamMixerAlsaTest, OneStreamMixesProperly) { |
ASSERT_GT(mock_alsa()->data().size(), 0u); |
actual->FromInterleaved( |
&(mock_alsa()->data()[0]), kNumFrames, kBytesPerSample); |
- auto expected = GetMixedAudioData(input); |
- CompareAudioData(*expected, *actual); |
+ CompareAudioData(input->data(), *actual); |
} |
TEST_F(StreamMixerAlsaTest, OneStreamIsScaledDownProperly) { |
@@ -422,8 +427,7 @@ TEST_F(StreamMixerAlsaTest, OneStreamIsScaledDownProperly) { |
const int kNumFrames = 32; |
ASSERT_EQ((int)sizeof(kTestData[0]), |
kNumChannels * kNumFrames * kBytesPerSample); |
- auto data = |
- ::media::AudioBus::WrapMemory(kNumChannels, kNumFrames, kTestData[0]); |
+ auto data = GetTestData(0); |
input->SetData(std::move(data)); |
// Set a volume multiplier on the stream. |
@@ -497,36 +501,42 @@ TEST_F(StreamMixerAlsaTest, TwoUnscaledStreamsMixProperlyWithEdgeCases) { |
} |
// Create edge case data for the inputs. By mixing these two short streams, |
- // every combination of {-1.0, 0.0, 1.0} is tested. Note that this test case |
- // is intended to be a hand-checkable gut check. |
+ // every combination of {-(2^31), 0, 2^31-1} is tested. This test case is |
+ // intended to be a hand-checkable gut check. |
+ // Note: Test data should be represented as 32-bit integers and copied into |
+ // ::media::AudioBus instances, rather than wrapping statically declared float |
+ // arrays. The latter method is brittle, as ::media::AudioBus requires 16-bit |
+ // alignment for internal data. |
const int kNumFrames = 3; |
- float kEdgeData[2][8] = { |
+ const int32_t kMaxSample = std::numeric_limits<int32_t>::max(); |
+ const int32_t kMinSample = std::numeric_limits<int32_t>::min(); |
+ const int32_t kEdgeData[2][8] = { |
{ |
- -1.0, -1.0, |
- -1.0, 0.0, |
- 0.0, 1.0, |
- 0.0, 0.0, |
+ kMinSample, kMinSample, |
+ kMinSample, 0.0, |
+ 0.0, kMaxSample, |
+ 0.0, 0.0, |
}, { |
- -1.0, 0.0, |
- 1.0, 0.0, |
- 1.0, 1.0, |
- 0.0, 0.0, |
+ kMinSample, 0.0, |
+ kMaxSample, 0.0, |
+ kMaxSample, kMaxSample, |
+ 0.0, 0.0, |
} |
}; |
- // Hand-calculate the results. Index 0 is clamped to -1.0 from -2.0. Index |
- // 5 is clamped from 2.0 to 1.0. |
- float kResult[8] = { |
- -1.0, -1.0, |
- 0.0, 0.0, |
- 1.0, 1.0, |
- 0.0, 0.0, |
+ // Hand-calculate the results. Index 0 is clamped to -(2^31). Index 5 is |
+ // clamped to 2^31-1. |
+ const int32_t kResult[8] = { |
+ kMinSample, kMinSample, |
+ 0.0, 0.0, |
+ kMaxSample, kMaxSample, |
+ 0.0, 0.0, |
}; |
for (size_t i = 0; i < inputs.size(); ++i) { |
- auto test_data = |
- ::media::AudioBus::WrapMemory(kNumChannels, kNumFrames, kEdgeData[i]); |
+ auto test_data = ::media::AudioBus::Create(kNumChannels, kNumFrames); |
+ test_data->FromInterleaved(kEdgeData[i], kNumFrames, kBytesPerSample); |
inputs[i]->SetData(std::move(test_data)); |
EXPECT_CALL(*inputs[i], GetResampledData(_, kNumFrames)); |
EXPECT_CALL(*inputs[i], AfterWriteFrames(_)); |
@@ -536,8 +546,8 @@ TEST_F(StreamMixerAlsaTest, TwoUnscaledStreamsMixProperlyWithEdgeCases) { |
mixer->WriteFramesForTest(); |
// Use the hand-calculated results above. |
- auto expected = |
- ::media::AudioBus::WrapMemory(kNumChannels, kNumFrames, kResult); |
+ auto expected = ::media::AudioBus::Create(kNumChannels, kNumFrames); |
+ expected->FromInterleaved(kResult, kNumFrames, kBytesPerSample); |
// Get the actual stream rendered to ALSA, and compare it against the |
// expected stream. The stream should match exactly. |