// // arplayer.h // #ifndef __arplayer_H__ #define __arplayer_H__ #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #include "aeTypes.h" #include "aeTask.h" #include "OutputDistrib.h" #include "Recorder.h" #include "Midi.h" #include "AudioRingBuffer3.h" // main class defs class ARPlayer { public: unsigned long UID; // unique ID number for the contents of this player char* type; unsigned long status; float position; // play position in seconds float fade; int next; float segout; float bufftime; int pNum; float balance; unsigned long bus_assignment; AudioUnit outputSource; unsigned char connected; unsigned char disconnect; unsigned char Managed; virtual ~ARPlayer(void) { } virtual void start(void) = 0; virtual void stop(void) = 0; virtual void volChange(float) = 0; virtual void setPosition(float) = 0; virtual void setStatus(unsigned long) = 0; }; class Lock { public: Lock(void); ~Lock(void); unsigned char readLock(unsigned char block); unsigned char writeLock(unsigned char block); void readUnlock(void); void writeUnlock(void); char getState(void); private: thread_list threads; pthread_mutex_t lock; pthread_mutex_t mutex; pthread_cond_t semaphore; }; struct sourceRecord { ARPlayer *playerPtr; int cur_render_count; // number of renter calls using this record right now! pthread_mutex_t countLock; }; typedef struct sourceRecord sourceRec; class ServerLog { public: ServerLogStruct **logCUE; short cueSize; short writePos; short readPos; string FileName; FILE *FileObj; unsigned char run; pthread_mutex_t wlock; pthread_mutex_t semlock; pthread_cond_t cueSemaphore; pthread_t log_thread; ServerLog(void); ~ServerLog(void); void MakeEntry(string message); void CloseLogFile(void); private: static void *cueMonitor(void* refCon); }; class ProgramLog { public: ProgramLogStruct **logCUE; short cueSize; short writePos; short readPos; unsigned char run; pthread_mutex_t wlock; pthread_mutex_t semlock; pthread_cond_t cueSemaphore; pthread_t log_thread; time_t logChangeTime; ProgramLog(void); ~ProgramLog(void); void MakeEntry(ProgramLogStruct); void UIDEntry(unsigned long, unsigned char, unsigned char); private: static void *cueMonitor(void* refCon); }; class NotifyQue { public: struct notifyData *que; short queSize; short writePos; short readPos; unsigned char run; pthread_mutex_t wlock; pthread_mutex_t semlock; pthread_cond_t queSemaphore; pthread_t que_thread; NotifyQue(void); ~NotifyQue(void); void MakeEntry(struct notifyData entry); private: static void *queMonitor(void* refCon); }; // Global Variables extern unsigned char Debug; extern unsigned char msg; extern float coreRate; extern float latency_factor; extern meta_list metaList; // list of all items metaDataby UID number extern ARPlayer *pList[inBusNum]; extern sourceRec sourceList[inBusNum]; extern vector PlayList; extern vector TaskList; extern vector RecList; extern unsigned long plRev; // incremented each time a change is made to the Play List extern pthread_t manager_thread; extern Lock *lMutex; // mutual exclusion control for the play list extern Lock *tMutex; // mutual exclusion control for the task list extern Lock *pMutex; // mutual exclusion control for the player list extern Lock *dMutex; // mutual exclusion control for the metaData list extern pthread_mutex_t iMutex; // mutual exclusion control for the input device list extern pthread_mutex_t oMutex; // mutual exclusion control for the output device list extern pthread_mutex_t mMutex; // mutual exclusion control for the master output rendering extern pthread_mutex_t mgrMutex; // mutual exclusion control for the list manager semiphore extern pthread_cond_t mgrSemaphore; extern pthread_mutex_t pushMutex; // mutual exclusion control for the push mode output data semiphore extern pthread_cond_t pushSemaphore; extern int s; /* socket for accepting connections */ extern AudioUnit mixer; extern output_map outputMap; extern Distributor *Master; // pointer to the master output device bus distributer extern AudioRingBuffer *BusBuffer; extern double MasterOutputTime; extern unsigned char plRunning; extern ServerLog *ServerLoger; extern ProgramLog *ProgramLoger; extern NotifyQue *Notifier; extern MidiPort *MidiObj; extern unsigned char run; // Global Function Prototypes // main.cpp void INThandler(int); void TERMhandler(int); void HUPhandler(int); void* TCPListener(void *refCon); void* sessionThread(struct threadPass *pass); void loadPreConfig(string file_path); unsigned char loadConfiguration(int cs, string file_path, unsigned long *lastUID); void my_send(int cs, const char *buf, int tx_length, unsigned char silent); unsigned char processCommand(int cs, char *command, unsigned long *lastUID, unsigned char silent); void ShutDown(void); void DisconnectPlayerOutput(ARPlayer *playerPtr); OSStatus renderFromSource(void *inRefCon, AudioUnitRenderActionFlags *inActionFlags, const AudioTimeStamp *inTimeStamp, unsigned long inBusNumber, unsigned long inNumberFrames, AudioBufferList *ioData); OSStatus InitAudioSystem(void); void CloseAudioSystem(void); void setMixerInputVolume(unsigned long inputNum, double volume); float getMixerInputVolume(unsigned long inputNum); void setMixerMasterVolume(double volume); void setMixerOutputVolume(unsigned long outputNum, double volume); void enableMixerInput(unsigned long inputNum, double volume); void enableMixerOutput(unsigned long outputNum, double volume); void getMixerMeters(void); void setPlayerMetaData(char *data); void ReturnDeviceList(int cs, char *buf, unsigned long size); unsigned long GetDeviceID(const char *UID); void ReturnDevChNames(int cs, char *buf, unsigned long size, const char *UID, unsigned char input); void ReturnDevDMDest(int cs, char *buf, unsigned long size, const char *UID, long chan); void ReturnDevDMDestList(int cs, char *buf, unsigned long size, const char *UID, long chan); void UpdateMatrix(unsigned long pNum); unsigned long createMetaRecord(string Path); void registerMetaUser(unsigned long UID); void deleteMetaRecord(unsigned long UID); unsigned char LoadPlayer(int *pNum, const char *url_str, unsigned long UID); unsigned char LoadFilePlayer(int pNum, CFURLRef url); unsigned char LoadInputPlayer(int pNum, CFURLRef url); unsigned char LoadItemPlayer(int *pNum, const char *url_str, unsigned long UID); void GetURLMetaData(unsigned long UID, const char *url_str); void GetFileMetaData(unsigned long UID, CFURLRef url); char *GetTypeLable(OSType udType); unsigned long StrToFourChar(const char *cstr); unsigned char checkPnumber(int pNum); unsigned char getPlayerUID(unsigned int *ref); unsigned char getListPos(unsigned int *ref); void DeleteFromLists(ARPlayer *instance); void SetMetaData(unsigned long uid, string key, string value); string GetMetaData(unsigned long uid, string key); unsigned char URLfromString(CFURLRef *url, const char *url_str); string NthField(string source, string tolken, unsigned int field); int CountFields(string source, string tolken); void ReplaceAll(string *theStr, string find, string replace); void Execute(string command, unsigned long UID); // Manager.cpp void DeleteItem(int pos); unsigned long AddItem(int pos, string URLstr); void AddPlayer(int pos, int pNum); void MoveItem(int sourcePos, int destPos); void* ListManagerTask(void *refCon); void wakeManager(void); // Database.cpp void HandleDBerror(dbi_conn Conn, void *user_argument); void DumpDBDriverList(int cs, char *buf, unsigned long size); unsigned char MakeLogEntry(ProgramLogStruct* rec); void GetItemMetaData(unsigned long UID, CFURLRef url); void GetdbFileMetaData(unsigned long UID, unsigned long recID, dbi_driver driver, dbi_conn conn); void GetdbTaskMetaData(unsigned long UID, unsigned long recID, dbi_driver driver, dbi_conn conn); unsigned char GetFileMD5(char *file, unsigned char *md5_str); unsigned char GetFileVolume(char *file, char *mount); unsigned char GetFileInode(char *file, unsigned long *iNode); unsigned char dbTaskRunner(unsigned long UID, unsigned char load); unsigned char db_initialize(void); float GaussianNumber(void); float RandomNumber(void); void dbResultFree(dbi_result result); void dbPick(TaskItem *parent); void dbPickCleanUp(void *pass); void dbMacroReplace(string *query); #endif //__arplayer_H__