diff options
-rw-r--r-- | media/audio/simple_sources.h | 40 | ||||
-rw-r--r-- | media/audio/win/simple_sources_win.cc | 43 |
2 files changed, 83 insertions, 0 deletions
diff --git a/media/audio/simple_sources.h b/media/audio/simple_sources.h new file mode 100644 index 0000000..992aba5 --- /dev/null +++ b/media/audio/simple_sources.h @@ -0,0 +1,40 @@ +// Copyright (c) 2006-2008 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 "media/audio/audio_output.h" + +// An audio source that produces a pure sinusoidal tone. Each platform needs +// a slightly different implementation because it needs to handle the native +// audio buffer format. +class SineWaveAudioSource : public AudioOutputStream::AudioSourceCallback { + public: + enum Format { + FORMAT_8BIT_LINEAR_PCM, + FORMAT_16BIT_LINEAR_PCM, + }; + + // |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(Format format, int channels, + double freq, double sample_freq); + virtual ~SineWaveAudioSource() {} + + // Implementation of AudioSourceCallback. + virtual size_t OnMoreData(AudioOutputStream* stream, + void* dest, size_t max_size); + virtual void OnClose(AudioOutputStream* stream); + virtual void OnError(AudioOutputStream* stream, int code); + + protected: + Format format_; + int channels_; + double freq_; + double sample_freq_; +}; + +#endif // MEDIA_AUDIO_SIMPLE_SOURCES_H_ diff --git a/media/audio/win/simple_sources_win.cc b/media/audio/win/simple_sources_win.cc new file mode 100644 index 0000000..b6fda23 --- /dev/null +++ b/media/audio/win/simple_sources_win.cc @@ -0,0 +1,43 @@ +// Copyright (c) 2006-2008 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. + +#include <math.h> + +#include "base/basictypes.h" +#include "base/logging.h" +#include "media/audio/audio_output.h" +#include "media/audio/simple_sources.h" + +SineWaveAudioSource::SineWaveAudioSource(Format format, int channels, + double freq, double sample_freq) + : format_(format), + channels_(channels), + freq_(freq), + sample_freq_(sample_freq) { + // TODO(cpu): support other formats. + DCHECK((format_ == FORMAT_16BIT_LINEAR_PCM) && (channels_ == 1)); +} + +// The implementation could be more efficient if a lookup table is constructed +// but it is efficient enough for our simple needs. +size_t SineWaveAudioSource::OnMoreData(AudioOutputStream* stream, + void* dest, size_t max_size) { + const double kTwoPi = 2.0 * 3.141592653589; + double f = freq_ / sample_freq_; + int16* sin_tbl = reinterpret_cast<int16*>(dest); + size_t len = max_size / sizeof(int16); + // The table is filled with s(t) = 32768*sin(2PI*f*t). + for (size_t ix = 0; ix != len; ++ix) { + double th = kTwoPi * ix * f; + sin_tbl[ix] = static_cast<int16>((1 << 15) * sin(th)); + } + return max_size; +} + +void SineWaveAudioSource::OnClose(AudioOutputStream* stream) { +} + +void SineWaveAudioSource::OnError(AudioOutputStream* stream, int code) { + NOTREACHED(); +} |