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