#ifndef __Recorderer_H__ #define __Recorderer_H__ #include "AudioRingBuffer3.h" #include #include #include #include #include using namespace std; class Recorder; class RecOutput { public: virtual ~RecOutput(void){ } virtual unsigned char init(Recorder*) = 0; virtual unsigned char Start(void) = 0; virtual void Stop(void) = 0; virtual void post(ProgramLogStruct*) = 0; virtual OSStatus passSampleBufferIn(void *, size_t) = 0; virtual unsigned char CantKeepUp(void) = 0; Recorder *parent; }; class shoutcastOut: public RecOutput { public: shoutcastOut(void); ~shoutcastOut(void); unsigned char init(Recorder*); unsigned char Start(void); void Stop(void); void post(ProgramLogStruct*); OSStatus passSampleBufferIn(void *, size_t); unsigned char CantKeepUp(void); private: int tcp_socket; pid_t encoder; int sockset[2]; pthread_t transmit_thread; unsigned char connected; unsigned char retry; void SetupEncoder(void); void HandleConnectionLoss(void); unsigned char escapeString(string &result, string source); unsigned char Connect(void); static void *TransmitThread(void* refCon); }; class mp3FileOut: public RecOutput { public: mp3FileOut(void); ~mp3FileOut(void); unsigned char init(Recorder*); unsigned char Start(void); void Stop(void); void post(ProgramLogStruct*); OSStatus passSampleBufferIn(void*, size_t); unsigned char CantKeepUp(void); private: FILE *fp; pid_t encoder; int sockset[2]; pthread_t write_thread; void SetupEncoder(void); static void *WriteThread(void* refCon); }; class aiffOut: public RecOutput { public: aiffOut(void); ~aiffOut(void); unsigned char init(Recorder*); unsigned char Start(void); void Stop(void); void post(ProgramLogStruct*); OSStatus passSampleBufferIn(void*, size_t); unsigned char CantKeepUp(void); private: AudioFileID audioFileID; FSRef fileRef; }; class waveOut: public RecOutput { public: waveOut(void); ~waveOut(void); unsigned char init(Recorder*); unsigned char Start(void); void Stop(void); void post(ProgramLogStruct*); OSStatus passSampleBufferIn(void*, size_t); unsigned char CantKeepUp(void); private: AudioFileID audioFileID; FSRef fileRef; }; class Recorder { public: Recorder(void); ~Recorder(void); void Recorder::UnInit(void); void start(void); void stop(void); void post(ProgramLogStruct*); unsigned char SetDelay(float sec); float GetDelay(void); unsigned char init(void); unsigned char initSource(void); void shutdownSource(void); unsigned long UID; int mode; int Bus[2]; AudioUnit converter; AudioUnit *sourceAU; string source; AudioStreamBasicDescription fileStreamFormat; AudioStreamBasicDescription sourceFormat; AudioTimeStamp TimeStamp; AudioRingBuffer *SourceBuffer; pthread_mutex_t *wakeMutex; pthread_cond_t *wakeSemaphore; float sourceBuffDur; double *sourceOutputTime; double readTime; double RecordTime; double t_limit; double stopTime; double delay; unsigned char runThread; pthread_t record_thread; int errCode; private: RecOutput *output_instance; // RecSource *source_instance; float ratio; AudioBufferList outputData; unsigned long blockSize; AudioUnit mInputUnit; AudioBufferList *mInputBuffer; pthread_mutex_t inputMutex; pthread_cond_t inputSemaphore; double inputTime; unsigned char Recorder::InputSetUp(AudioDeviceID in, long *OutputMap); unsigned char Recorder::SetupBuffers(unsigned long inbufferSizeFrames); static void *Recorder::RecordingThread(void* refCon); static OSStatus Recorder::ReadBuffer(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *TimeStamp, unsigned long inBusNumber, unsigned long inNumberFrames, AudioBufferList * ioData); static OSStatus Recorder::FillSourceBuffer(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, unsigned long, unsigned long, AudioBufferList*); }; #endif //__Recorderer_H__