00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef CSL_RemoteStream_H
00024 #define CSL_RemoteStream_H
00025
00026 #include "CSL_Includes.h"
00027 #include "ThreadUtilities.h"
00028
00029 #include <stdio.h>
00030 #include <stdlib.h>
00031 #include <semaphore.h>
00032
00033 #ifdef CSL_WINDOWS // MS-Windows socket includes
00034
00035 #include <winsock.h>
00036 typedef unsigned int in_addr_t;
00037 typedef int ssize_t;
00038 #define MAXHOSTNAMELEN 256
00039 #include <fcntl.h>
00040 #define SEM_FAILED ((sem_t*) 0) // For pthread semaphores -- why do we need this?
00041
00042 #else // UNIX socket includes
00043
00044 #include <unistd.h>
00045 #include <sys/types.h>
00046 #include <sys/socket.h>
00047 #include <sys/param.h>
00048 #include <netdb.h>
00049 #include <netinet/in.h>
00050 #include <arpa/inet.h>
00051 #define closesocket(x) ::close(x)
00052
00053 #endif
00054
00055 namespace csl {
00056
00057
00058
00059 typedef struct {
00060 unsigned magic;
00061 unsigned short frames;
00062 unsigned short channels;
00063 } CSL_RS_MSG;
00064
00065
00066
00067 #define RS_PACKET_MAGIC 0x00420000 // RS packet magic number
00068 #define RS_PACKET_SIZE (sizeof(CSL_RFS_MSG)) // Size of RS request packets
00069 #define RS_BUFFER_SIZE (mBufferSize * mNumChannels * sizeof(sample))
00070 #define RS_RESPONSE_PACKET_SIZE (RFS_PACKET_SIZE + RS_BUFFER_SIZE + 4)
00071
00072
00073
00074 #define CSL_DEFAULT_REQUEST_PORT 57574 // Default port for RS requests (server listener)
00075
00076
00077
00078
00079
00080 #define CSL_CMD_SET_CLIENT 42 // Set up the server's response socket to the client
00081 #define CSL_CMD_NEXT_BUFFER 43 // Request a buffer of samples from the server
00082
00083
00084
00085 #define CSL_CMD_STOP 47 // Stop the server
00086
00087
00088
00089 extern "C" void * RS_read_loop(void * inst);
00090
00091
00092
00093 typedef void * (*THREAD_START_ROUTINE)(void *);
00094 extern "C" int CSL_CreateThread(THREAD_START_ROUTINE pfnThreadProc, void * pvParam);
00095
00096
00098
00099
00100 class RemoteStream : public UnitGenerator {
00101
00102 public:
00103 RemoteStream(char * clientName, unsigned short clientPort, unsigned ch, unsigned bufSize);
00104 ~RemoteStream();
00105
00107 sample **ioBuffers() { return mIoBuffers; };
00108 int socket() { return mSocket; };
00109 unsigned short requestSize() { return (RFS_BUFFER_SIZE); };
00110 unsigned bufferSwitch() { return mCurrentBuffer; };
00111 unsigned bufferIndex() { return mCurrentFrame; };
00112 unsigned bufferSize() { return mBufferSize; };
00113 sem_t *semaphore() { return mServerSemaphore; };
00114
00116 void nextBuffer(Buffer &outputBuffer) throw(CException);
00117
00118 protected:
00119 unsigned mBufferSize;
00120 sample * mIoBuffers[2];
00121 unsigned mCurrentBuffer;
00122 unsigned mCurrentFrame;
00123
00124
00125 int mSocket;
00126 CSL_RS_MSG mHeader;
00127 struct sockaddr_in mServerAddr;
00128 sem_t * mServerSemaphore;
00129
00130
00131 int initSockets(char * serverName, unsigned short serverPort);
00132 void initPacket();
00133 virtual int connectToServer();
00134
00135 };
00136
00137 }
00138
00139 #endif
00140