00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef _VRFILESINK_H_
00038 #define _VRFILESINK_H_
00039
00040 #include <VrSink.h>
00041 #include <fstream>
00042 #include <string.h>
00043
00044
00045 #include <sys/types.h>
00046 #include <sys/stat.h>
00047 #include <fcntl.h>
00048
00049
00050 #ifdef O_LARGEFILE
00051 #define OUR_O_LARGEFILE O_LARGEFILE
00052 #else
00053 #define OUR_O_LARGEFILE 0
00054 #endif
00055
00056
00057
00058
00059 template<class iType>
00060 class VrFileSink : public VrSink<iType> {
00061 protected:
00062 FILE* fp;
00063 char* filename;
00064
00065 public:
00066 virtual const char *name() { return "VrFileSink"; }
00067
00068 virtual int work3(VrSampleRange output,
00069 VrSampleRange inputs[], void *i[]);
00070
00071 virtual void initialize() {
00072 if(fp != NULL) fclose(fp);
00073 int fd = -1;
00074 if ((fd = open (filename,
00075 O_WRONLY | O_CREAT | O_TRUNC | OUR_O_LARGEFILE,
00076 0664)) < 0){
00077 perror (filename);
00078 exit (1);
00079 }
00080 if((fp = fdopen(fd,"wb")) == 0) {
00081 perror (filename);
00082
00083 exit(1);
00084 }
00085 }
00086
00087 VrFileSink(char* file) {
00088 filename=new char[strlen(file) + 1];
00089 strcpy(filename,file);
00090 fp = NULL;
00091
00092 }
00093
00094 virtual ~VrFileSink() {
00095 if(fp!=NULL) fclose(fp);
00096 delete filename;
00097 }
00098
00099 };
00100
00101 template<class iType> int
00102 VrFileSink<iType>::work3(VrSampleRange output,
00103 VrSampleRange inputs[], void *ai[])
00104 {
00105 iType **i = (iType **)ai;
00106
00107 sync (output.index);
00108
00109 int count = 0;
00110
00111 count = fwrite(i[0],sizeof(iType),output.size,fp);
00112 while ((count < 0) && (errno == EAGAIN)) {
00113 YIELD();
00114 count = fwrite(i[0],sizeof(iType),output.size,fp);
00115 }
00116
00117 if(count<0) {
00118 fprintf(stderr, "VrConnect.fileWrite(): error writing to file\n");
00119 exit(1);
00120 } else {
00121 if((unsigned int) count!=output.size)
00122 fprintf(stderr, "VrConnect.fileWrite(): warning: not all bytes written\n");
00123
00124 }
00125 return count;
00126
00127 }
00128
00129 #undef OUR_O_LARGEFILE
00130 #endif