15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_BASE_FAKE_AUDIO_RENDER_CALLBACK_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_FAKE_AUDIO_RENDER_CALLBACK_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/audio_converter.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_renderer_sink.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fake RenderCallback which will fill each request with a sine wave. Sine 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// state is kept across callbacks. State can be reset to default via reset(). 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Also provide an interface to AudioTransformInput. 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeAudioRenderCallback 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public AudioRendererSink::RenderCallback, 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public AudioConverter::InputCallback { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The function used to fulfill Render() is f(x) = sin(2 * PI * x * |step|), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // where x = [|number_of_frames| * m, |number_of_frames| * (m + 1)] and m = 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the number of Render() calls fulfilled thus far. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FakeAudioRenderCallback(double step); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeAudioRenderCallback(); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Renders a sine wave into the provided audio data buffer. If |half_fill_| 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is set, will only fill half the buffer. 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int Render(AudioBus* audio_bus, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int audio_delay_milliseconds) OVERRIDE; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD0(OnRenderError, void()); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // AudioTransform::ProvideAudioTransformInput implementation. 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual double ProvideInput(AudioBus* audio_bus, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta buffer_delay) OVERRIDE; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Toggles only filling half the requested amount during Render(). 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_half_fill(bool half_fill) { half_fill_ = half_fill; } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the sine state to initial value. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void reset() { x_ = 0; } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the last |audio_delay_milliseconds| provided to Render() or -1 if 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no Render() call occurred. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_audio_delay_milliseconds() { return last_audio_delay_milliseconds_; } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set volume information used by ProvideAudioTransformInput(). 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_volume(double volume) { volume_ = volume; } 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool half_fill_; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double x_; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double step_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_audio_delay_milliseconds_; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double volume_; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeAudioRenderCallback); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_BASE_FAKE_AUDIO_RENDER_CALLBACK_H_ 63