// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_AUDIO_SIMPLE_SOURCES_H_
#define MEDIA_AUDIO_SIMPLE_SOURCES_H_
#include "base/synchronization/lock.h"
#include "media/audio/audio_io.h"
#include "media/base/seekable_buffer.h"
namespace media {
// An audio source that produces a pure sinusoidal tone.
class MEDIA_EXPORT SineWaveAudioSource
: public AudioOutputStream::AudioSourceCallback {
public:
// |channels| is the number of audio channels, |freq| is the frequency in
// hertz and it has to be less than half of the sampling frequency
// |sample_freq| or else you will get aliasing.
SineWaveAudioSource(int channels, double freq, double sample_freq);
virtual ~SineWaveAudioSource() {}
// Return up to |cap| samples of data via OnMoreData(). Use Reset() to
// allow more data to be served.
void CapSamples(int cap);
void Reset();
// Implementation of AudioSourceCallback.
virtual int OnMoreData(AudioBus* audio_bus,
AudioBuffersState audio_buffers) OVERRIDE;
virtual int OnMoreIOData(AudioBus* source,
AudioBus* dest,
AudioBuffersState audio_buffers) OVERRIDE;
virtual void OnError(AudioOutputStream* stream) OVERRIDE;
// The number of OnMoreData()+OnMoreIOData() and OnError() calls respectively.
int callbacks() { return callbacks_; }
int errors() { return errors_; }
protected:
int channels_;
double f_;
int time_state_;
int cap_;
int callbacks_;
int errors_;
base::Lock time_lock_;
};
} // namespace media
#endif // MEDIA_AUDIO_SIMPLE_SOURCES_H_