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.
4
5// MSVC++ requires this to be set before any other includes to get M_PI.
6#define _USE_MATH_DEFINES
7
8#include <cmath>
9
10#include "media/base/fake_audio_render_callback.h"
11
12namespace media {
13
14FakeAudioRenderCallback::FakeAudioRenderCallback(double step)
15    : half_fill_(false),
16      step_(step),
17      last_audio_delay_milliseconds_(-1),
18      volume_(1) {
19  reset();
20}
21
22FakeAudioRenderCallback::~FakeAudioRenderCallback() {}
23
24int FakeAudioRenderCallback::Render(AudioBus* audio_bus,
25                                    int audio_delay_milliseconds) {
26  last_audio_delay_milliseconds_ = audio_delay_milliseconds;
27  int number_of_frames = audio_bus->frames();
28  if (half_fill_)
29    number_of_frames /= 2;
30
31  // Fill first channel with a sine wave.
32  for (int i = 0; i < number_of_frames; ++i)
33    audio_bus->channel(0)[i] = sin(2 * M_PI * (x_ + step_ * i));
34  x_ += number_of_frames * step_;
35
36  // Copy first channel into the rest of the channels.
37  for (int i = 1; i < audio_bus->channels(); ++i)
38    memcpy(audio_bus->channel(i), audio_bus->channel(0),
39           number_of_frames * sizeof(*audio_bus->channel(i)));
40
41  return number_of_frames;
42}
43
44double FakeAudioRenderCallback::ProvideInput(AudioBus* audio_bus,
45                                             base::TimeDelta buffer_delay) {
46  Render(audio_bus, buffer_delay.InMillisecondsF() + 0.5);
47  return volume_;
48}
49
50}  // namespace media
51