1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #include "base/logging.h"
8 #include "base/basictypes.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "media/audio/audio_parameters.h"
11 #include "media/audio/simple_sources.h"
12 #include "media/base/audio_bus.h"
13 #include "testing/gtest/include/gtest/gtest.h"
17 // Validate that the SineWaveAudioSource writes the expected values.
18 TEST(SimpleSources
, SineWaveAudioSource
) {
19 static const uint32 samples
= 1024;
20 static const uint32 bytes_per_sample
= 2;
21 static const int freq
= 200;
23 AudioParameters
params(
24 AudioParameters::AUDIO_PCM_LINEAR
, CHANNEL_LAYOUT_MONO
,
25 AudioParameters::kTelephoneSampleRate
, bytes_per_sample
* 8, samples
);
27 SineWaveAudioSource
source(1, freq
, params
.sample_rate());
28 scoped_ptr
<AudioBus
> audio_bus
= AudioBus::Create(params
);
29 source
.OnMoreData(audio_bus
.get(), 0);
30 EXPECT_EQ(1, source
.callbacks());
31 EXPECT_EQ(0, source
.errors());
33 uint32 half_period
= AudioParameters::kTelephoneSampleRate
/ (freq
* 2);
35 // Spot test positive incursion of sine wave.
36 EXPECT_NEAR(0, audio_bus
->channel(0)[0],
37 std::numeric_limits
<float>::epsilon());
38 EXPECT_FLOAT_EQ(0.15643446f
, audio_bus
->channel(0)[1]);
39 EXPECT_LT(audio_bus
->channel(0)[1], audio_bus
->channel(0)[2]);
40 EXPECT_LT(audio_bus
->channel(0)[2], audio_bus
->channel(0)[3]);
41 // Spot test negative incursion of sine wave.
42 EXPECT_NEAR(0, audio_bus
->channel(0)[half_period
],
43 std::numeric_limits
<float>::epsilon());
44 EXPECT_FLOAT_EQ(-0.15643446f
, audio_bus
->channel(0)[half_period
+ 1]);
45 EXPECT_GT(audio_bus
->channel(0)[half_period
+ 1],
46 audio_bus
->channel(0)[half_period
+ 2]);
47 EXPECT_GT(audio_bus
->channel(0)[half_period
+ 2],
48 audio_bus
->channel(0)[half_period
+ 3]);
51 TEST(SimpleSources
, SineWaveAudioCapped
) {
52 SineWaveAudioSource
source(1, 200, AudioParameters::kTelephoneSampleRate
);
54 static const int kSampleCap
= 100;
55 source
.CapSamples(kSampleCap
);
57 scoped_ptr
<AudioBus
> audio_bus
= AudioBus::Create(1, 2 * kSampleCap
);
58 EXPECT_EQ(source
.OnMoreData(
59 audio_bus
.get(), 0), kSampleCap
);
60 EXPECT_EQ(1, source
.callbacks());
61 EXPECT_EQ(source
.OnMoreData(audio_bus
.get(), 0), 0);
62 EXPECT_EQ(2, source
.callbacks());
64 EXPECT_EQ(source
.OnMoreData(
65 audio_bus
.get(), 0), kSampleCap
);
66 EXPECT_EQ(3, source
.callbacks());
67 EXPECT_EQ(0, source
.errors());
70 TEST(SimpleSources
, OnError
) {
71 SineWaveAudioSource
source(1, 200, AudioParameters::kTelephoneSampleRate
);
73 EXPECT_EQ(1, source
.errors());
75 EXPECT_EQ(2, source
.errors());