00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #pragma once
00024
00025 #include "cinder/Cinder.h"
00026 #include "cinder/audio/Io.h"
00027 #include "cinder/audio/Buffer.h"
00028
00029 #include <iostream>
00030
00031 namespace cinder { namespace audio {
00032
00033 typedef shared_ptr<class SourceCallback> SourceCallbackRef;
00034 typedef shared_ptr<class LoaderSourceCallback> LoaderSourceFileRef;
00035
00036
00037 typedef void (*CallbackFunction)( uint64_t inSampleOffset, uint32_t *ioSampleCount, Buffer *ioBuffer );
00038
00039 class Callback {
00040 private:
00041 struct Obj {
00042 Obj( CallbackFunction aCallback, uint32_t aSampleRate, uint16_t aChannelCount, uint16_t aBitsPerSample, uint16_t aBlockAlign );
00043 ~Obj();
00044 CallbackFunction mCallback;
00045 uint32_t mSampleRate;
00046 uint16_t mChannelCount;
00047 uint16_t mBitsPerSample;
00048 uint16_t mBlockAlign;
00049 };
00050
00051 public:
00052 Callback() {}
00053 Callback( CallbackFunction aCallback, uint32_t aSampleRate = 44100, uint16_t aChannelCount = 2, uint16_t aBitsPerSample = 32, uint16_t aBlockAlign = 8 );
00054 ~Callback() {}
00055
00056 operator SourceRef() const;
00057
00058 uint32_t getSampleRate() const { return mObj->mSampleRate; }
00059 uint16_t getChannelCount() const { return mObj->mChannelCount; }
00060 uint16_t getBitsPerSample() const { return mObj->mBitsPerSample; }
00061 uint16_t getBlockAlign() const { return mObj->mBlockAlign; }
00062 private:
00063 shared_ptr<Callback::Obj> mObj;
00064
00065 friend class SourceCallback;
00066 public:
00068
00069 Callback( const Callback &other ) { mObj = other.mObj; }
00070 Callback& operator=( const Callback &other ) { mObj = other.mObj; return *this; }
00071 bool operator==( const Callback &other ) { return mObj == other.mObj; }
00072 typedef shared_ptr<Obj> Callback::*unspecified_bool_type;
00073 operator unspecified_bool_type() { return ( mObj.get() == 0 ) ? 0 : &Callback::mObj; }
00074 void reset() { mObj.reset(); }
00076 };
00077
00078 }}