square_wave.cpp

Go to the documentation of this file.
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(); // not supposed to call virtual functions in constructors
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       // if frequency is 0 Hz, use silence
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 }

Generated on Mon Feb 13 23:07:47 2006 for audiere by  doxygen 1.4.6