00001 #include "basic_source.h"
00002 #include "internal.h"
00003 #include "types.h"
00004
00005 namespace audiere {
00006
00007 class SquareWave : public BasicSource {
00008 public:
00009 SquareWave(double frequency) {
00010 m_frequency = frequency;
00011 doReset();
00012 }
00013
00014 void ADR_CALL getFormat(
00015 int& channel_count,
00016 int& sample_rate,
00017 SampleFormat& sample_format)
00018 {
00019 channel_count = 1;
00020 sample_rate = 44100;
00021 sample_format = SF_S16;
00022 }
00023
00024 int doRead(int frame_count, void* buffer) {
00025
00026 if (m_frequency == 0) {
00027 memset(buffer, 0, frame_count * 2);
00028 return frame_count;
00029 }
00030
00031 s16* out = (s16*)buffer;
00032 for (int i = 0; i < frame_count; ++i) {
00033 int value = (int)(elapsed++ * m_frequency / 44100);
00034 *out++ = (value % 2 ? -32678 : 32767);
00035 }
00036 return frame_count;
00037 }
00038
00039 void ADR_CALL reset() {
00040 doReset();
00041 }
00042
00043 private:
00044 void doReset() {
00045 elapsed = 0;
00046 }
00047
00048 double m_frequency;
00049 long elapsed;
00050 };
00051
00052
00053 ADR_EXPORT(SampleSource*) AdrCreateSquareWave(double frequency) {
00054 return new SquareWave(frequency);
00055 }
00056
00057 }