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_AUDIO_SIMPLE_SOURCES_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_AUDIO_SIMPLE_SOURCES_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_io.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/seekable_buffer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An audio source that produces a pure sinusoidal tone.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT SineWaveAudioSource
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public AudioOutputStream::AudioSourceCallback {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |channels| is the number of audio channels, |freq| is the frequency in
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hertz and it has to be less than half of the sampling frequency
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |sample_freq| or else you will get aliasing.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SineWaveAudioSource(int channels, double freq, double sample_freq);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SineWaveAudioSource() {}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return up to |cap| samples of data via OnMoreData().  Use Reset() to
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // allow more data to be served.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CapSamples(int cap);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementation of AudioSourceCallback.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int OnMoreData(AudioBus* audio_bus,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         AudioBuffersState audio_buffers) OVERRIDE;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnError(AudioOutputStream* stream) OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The number of OnMoreData()+OnMoreIOData() and OnError() calls respectively.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int callbacks() { return callbacks_; }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int errors() { return errors_; }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int channels_;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double f_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int time_state_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cap_;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int callbacks_;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int errors_;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Lock time_lock_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_AUDIO_SIMPLE_SOURCES_H_
51