Forráskód Böngészése

fix and complete to/fro seek

richarddobson 1 hónapja
szülő
commit
d541e92e9a
1 módosított fájl, 120 hozzáadás és 100 törlés
  1. 120 100
      dev/pvxio2/pvfileio.c

+ 120 - 100
dev/pvxio2/pvfileio.c

@@ -55,12 +55,15 @@
 #define REVDWBYTES(t)   ( (((t)&0xff) << 24) | (((t)&0xff00) << 8) | (((t)&0xff0000) >> 8) | (((t)>>24) & 0xff) )
 #define REVWBYTES(t)    ( (((t)&0xff) << 8) | (((t)>>8) &0xff) )
 #define TAG(a,b,c,d)    ( ((a)<<24) | ((b)<<16) | ((c)<<8) | (d) )
-#define WAVE_FORMAT_EXTENSIBLE (0xFFFE)
+#ifndef WAVE_FORMAT_EXTENSIBLE
+# define WAVE_FORMAT_EXTENSIBLE (0xFFFE)
+#endif
 #ifndef WAVE_FORMAT_PCM
 #define WAVE_FORMAT_PCM (0x0001)
 #endif
+#ifndef WAVE_FORMAT_IEEE_FLOAT
 #define WAVE_FORMAT_IEEE_FLOAT (0x0003)
-
+#endif
 
 const GUID KSDATAFORMAT_SUBTYPE_PVOC = {
                     0x8312b9c2,
@@ -134,10 +137,10 @@ static int32_t write_guid(int32_t fd,int32_t byterev,const GUID *pGuid)
         guid.Data2 = REVWBYTES(pGuid->Data2);
         guid.Data3 = REVWBYTES(pGuid->Data3);
         memcpy((char *) (guid.Data4),(char *) (pGuid->Data4),8);
-        written = write(fd,(char *) &guid,sizeof(GUID));
+        written = _write(fd,(char *) &guid,sizeof(GUID));
     }
     else
-        written = write(fd,(char *) pGuid,sizeof(GUID));
+        written = _write(fd,(char *) pGuid,sizeof(GUID));
 
     return written;
 
@@ -185,10 +188,10 @@ static int32_t write_pvocdata(int32_t fd,int32_t byterev,const PVOCDATA *pData)
         //data.fWindowParam = * (float *) &dwval;
         data.fWindowParam = ssamp.fsamp;
         
-        written = write(fd,(char *) &data,sizeof(PVOCDATA));
+        written = _write(fd,(char *) &data,sizeof(PVOCDATA));
     }
     else
-        written = write(fd,(char *) pData,sizeof(PVOCDATA));
+        written = _write(fd,(char *) pData,sizeof(PVOCDATA));
 
     return written;
 
@@ -215,25 +218,25 @@ static int32_t write_fmt(int fd, int byterev,const WAVEFORMATEX *pfmt)
         fmt.wBitsPerSample  = REVWBYTES(pfmt->wBitsPerSample);
         fmt.cbSize          = REVWBYTES(pfmt->cbSize);
 
-        if(write(fd,(char *) &(fmt.wFormatTag),sizeof(WORD)) != sizeof(WORD)
-            || write(fd,(char *) &(fmt.nChannels),sizeof(WORD)) != sizeof(WORD)
-            || write(fd,(char *) &(fmt.nSamplesPerSec),sizeof(DWORD)) != sizeof(DWORD)
-            || write(fd,(char *) &(fmt.nAvgBytesPerSec),sizeof(DWORD)) != sizeof(DWORD)
-            || write(fd,(char *) &(fmt.nBlockAlign),sizeof(WORD)) != sizeof(WORD)
-            || write(fd,(char *) &(fmt.wBitsPerSample),sizeof(WORD)) != sizeof(WORD)
-            || write(fd,(char *) &(fmt.cbSize),sizeof(WORD)) != sizeof(WORD))
+        if(_write(fd,(char *) &(fmt.wFormatTag),sizeof(WORD)) != sizeof(WORD)
+            || _write(fd,(char *) &(fmt.nChannels),sizeof(WORD)) != sizeof(WORD)
+            || _write(fd,(char *) &(fmt.nSamplesPerSec),sizeof(DWORD)) != sizeof(DWORD)
+            || _write(fd,(char *) &(fmt.nAvgBytesPerSec),sizeof(DWORD)) != sizeof(DWORD)
+            || _write(fd,(char *) &(fmt.nBlockAlign),sizeof(WORD)) != sizeof(WORD)
+            || _write(fd,(char *) &(fmt.wBitsPerSample),sizeof(WORD)) != sizeof(WORD)
+            || _write(fd,(char *) &(fmt.cbSize),sizeof(WORD)) != sizeof(WORD))
 
         return 0;
 
     }
     else {
-       if(write(fd,(char *) &(pfmt->wFormatTag),sizeof(WORD)) != sizeof(WORD)
-            || write(fd,(char *) &(pfmt->nChannels),sizeof(WORD)) != sizeof(WORD)
-            || write(fd,(char *) &(pfmt->nSamplesPerSec),sizeof(DWORD)) != sizeof(DWORD)
-            || write(fd,(char *) &(pfmt->nAvgBytesPerSec),sizeof(DWORD)) != sizeof(DWORD)
-            || write(fd,(char *) &(pfmt->nBlockAlign),sizeof(WORD)) != sizeof(WORD)
-            || write(fd,(char *) &(pfmt->wBitsPerSample),sizeof(WORD)) != sizeof(WORD)
-            || write(fd,(char *) &(pfmt->cbSize),sizeof(WORD)) != sizeof(WORD))
+       if(_write(fd,(char *) &(pfmt->wFormatTag),sizeof(WORD)) != sizeof(WORD)
+            || _write(fd,(char *) &(pfmt->nChannels),sizeof(WORD)) != sizeof(WORD)
+            || _write(fd,(char *) &(pfmt->nSamplesPerSec),sizeof(DWORD)) != sizeof(DWORD)
+            || _write(fd,(char *) &(pfmt->nAvgBytesPerSec),sizeof(DWORD)) != sizeof(DWORD)
+            || _write(fd,(char *) &(pfmt->nBlockAlign),sizeof(WORD)) != sizeof(WORD)
+            || _write(fd,(char *) &(pfmt->wBitsPerSample),sizeof(WORD)) != sizeof(WORD)
+            || _write(fd,(char *) &(pfmt->cbSize),sizeof(WORD)) != sizeof(WORD))
 
         return 0;
     }
@@ -251,12 +254,12 @@ static int32_t pvoc_writeWindow(int32_t fd,int32_t byterev,float *window,DWORD l
         for(i=0;i < length; i++){
             lval = *lp++;
             lval = REVDWBYTES(lval);
-            if(write(fd,(char *)&lval,sizeof(int32_t)) != sizeof(int32_t))
+            if(_write(fd,(char *)&lval,sizeof(int32_t)) != sizeof(int32_t))
                 return 0;
         }
     }
     else{
-        if(write(fd,(char *) window,length * sizeof(float)) != (int32_t)(length*sizeof(float)))
+        if(_write(fd,(char *) window,length * sizeof(float)) != (int32_t)(length*sizeof(float)))
             return 0;
     }
 
@@ -271,14 +274,14 @@ static int32_t pvoc_readWindow(int fd, int byterev, float *window,DWORD length)
         int32_t got,oval,lval, *lp = (int32_t *) window;
 #ifdef SINGLE_FLOAT 
         for(i=0;i < length;i++){
-            if(read(fd,(char *)&lval,sizeof(int32_t)) != sizeof(int32_t))
+            if(_read(fd,(char *)&lval,sizeof(int32_t)) != sizeof(int32_t))
                 return 0;
             oval = REVDWBYTES(lval);
             *lp++ = oval;
         }
 #else
         /* read whole block then swap...should be faster */
-        got = read(fd,(char *) window,length * sizeof(float));
+        got = _read(fd,(char *) window,length * sizeof(float));
         if(got != (int)(length * sizeof(float)))
             return 0;
         /* then byterev */
@@ -291,7 +294,7 @@ static int32_t pvoc_readWindow(int fd, int byterev, float *window,DWORD length)
 #endif
     }
     else{
-        if(read(fd,(char *) window,length * sizeof(float)) != (int)(length * sizeof(float)))
+        if(_read(fd,(char *) window,length * sizeof(float)) != (int)(length * sizeof(float)))
             return 0;
     }
 
@@ -301,7 +304,7 @@ static int32_t pvoc_readWindow(int fd, int byterev, float *window,DWORD length)
 
 
 
-const char *pvoc_errorstr()
+const char *pvoc_errorstr(void)
 {
     return (const char *) pv_errstr;
 }
@@ -311,7 +314,7 @@ const char *pvoc_errorstr()
 /* thanks to the SNDAN programmers for this! */
 /* return 0 for big-endian machine, 1 for little-endian machine*/
 /* probably no good for 16bit swapping though */
-static int32_t byte_order()
+static int32_t byte_order(void)
 {
   int32_t   one = 1;
   char* endptr = (char *) &one;
@@ -490,7 +493,7 @@ int32_t  pvoc_createfile(const char *filename,
     }
 
 
-    pfile->fd = open(filename,O_BINARY | O_CREAT | O_RDWR | O_TRUNC,_S_IWRITE | _S_IREAD);
+    pfile->fd = _open(filename,O_BINARY | O_CREAT | O_RDWR | O_TRUNC,_S_IWRITE | _S_IREAD);
     if(pfile->fd < 0){
         free(pname);        
         if(pfile->customWindow)
@@ -510,7 +513,7 @@ int32_t  pvoc_createfile(const char *filename,
     files[i] = pfile;
 
     if(!pvoc_writeheader(i)) {
-        close(pfile->fd);
+        _close(pfile->fd);
         remove(pfile->name);
         free(pfile->name);
         if(pfile->customWindow)
@@ -616,7 +619,7 @@ int32_t pvoc_openfile(const char *filename,PVOCDATA *data,WAVEFORMATEX *fmt)
         pv_errstr = "\npvsys: no memory";
         return -1;
     }
-    pfile->fd = open(filename,O_BINARY | O_RDONLY,_S_IREAD);
+    pfile->fd = _open(filename,O_BINARY | O_RDONLY,_S_IREAD);
     if(pfile->fd < 0){
         free(pname);
         free(pfile);
@@ -636,7 +639,7 @@ int32_t pvoc_openfile(const char *filename,PVOCDATA *data,WAVEFORMATEX *fmt)
     files[i] = pfile;
 
     if(!pvoc_readheader(i,&wfpx)){
-        close(pfile->fd);
+        _close(pfile->fd);
         free(pfile->name);
         if(pfile->customWindow)
             free(pfile->customWindow);
@@ -664,13 +667,13 @@ static int32_t pvoc_readfmt(int32_t fd,int32_t byterev,WAVEFORMATPVOCEX *pWfpx)
     assert(pWfpx);
 #endif
 
-    if(read(fd,(char *) &(pWfpx->wxFormat.Format.wFormatTag),sizeof(WORD)) != sizeof(WORD)
-        || read(fd,(char *) &(pWfpx->wxFormat.Format.nChannels),sizeof(WORD)) != sizeof(WORD)
-        || read(fd,(char *) &(pWfpx->wxFormat.Format.nSamplesPerSec),sizeof(DWORD)) != sizeof(DWORD)
-        || read(fd,(char *) &(pWfpx->wxFormat.Format.nAvgBytesPerSec),sizeof(DWORD)) != sizeof(DWORD)
-        || read(fd,(char *) &(pWfpx->wxFormat.Format.nBlockAlign),sizeof(WORD)) != sizeof(WORD)
-        || read(fd,(char *) &(pWfpx->wxFormat.Format.wBitsPerSample),sizeof(WORD)) != sizeof(WORD)
-        || read(fd,(char *) &(pWfpx->wxFormat.Format.cbSize),sizeof(WORD)) != sizeof(WORD)){
+    if(_read(fd,(char *) &(pWfpx->wxFormat.Format.wFormatTag),sizeof(WORD)) != sizeof(WORD)
+        || _read(fd,(char *) &(pWfpx->wxFormat.Format.nChannels),sizeof(WORD)) != sizeof(WORD)
+        || _read(fd,(char *) &(pWfpx->wxFormat.Format.nSamplesPerSec),sizeof(DWORD)) != sizeof(DWORD)
+        || _read(fd,(char *) &(pWfpx->wxFormat.Format.nAvgBytesPerSec),sizeof(DWORD)) != sizeof(DWORD)
+        || _read(fd,(char *) &(pWfpx->wxFormat.Format.nBlockAlign),sizeof(WORD)) != sizeof(WORD)
+        || _read(fd,(char *) &(pWfpx->wxFormat.Format.wBitsPerSample),sizeof(WORD)) != sizeof(WORD)
+        || _read(fd,(char *) &(pWfpx->wxFormat.Format.cbSize),sizeof(WORD)) != sizeof(WORD)){
         pv_errstr = "\npvsys: error reading Source format data";
         return 0;
     }
@@ -704,9 +707,9 @@ static int32_t pvoc_readfmt(int32_t fd,int32_t byterev,WAVEFORMATPVOCEX *pWfpx)
         return 0;
     }
 
-    if(read(fd,(char *) &(pWfpx->wxFormat.Samples.wValidBitsPerSample),sizeof(WORD)) != sizeof(WORD)
-        || read(fd,(char *) &(pWfpx->wxFormat.dwChannelMask),sizeof(DWORD)) != sizeof(DWORD)
-        || read(fd,(char *) &(pWfpx->wxFormat.SubFormat),sizeof(GUID)) != sizeof(GUID)){
+    if(_read(fd,(char *) &(pWfpx->wxFormat.Samples.wValidBitsPerSample),sizeof(WORD)) != sizeof(WORD)
+        || _read(fd,(char *) &(pWfpx->wxFormat.dwChannelMask),sizeof(DWORD)) != sizeof(DWORD)
+        || _read(fd,(char *) &(pWfpx->wxFormat.SubFormat),sizeof(GUID)) != sizeof(GUID)){
         pv_errstr = "\npvsys: error reading Extended format data";
         return 0;
     }
@@ -732,9 +735,9 @@ static int32_t pvoc_readfmt(int32_t fd,int32_t byterev,WAVEFORMATPVOCEX *pWfpx)
         return 0;
     }
 
-    if(read(fd,(char *) &(pWfpx->dwVersion),sizeof(DWORD)) != sizeof(DWORD)
-        || read(fd,(char *) &(pWfpx->dwDataSize),sizeof(DWORD)) != sizeof(DWORD)
-        || read(fd,(char *) &(pWfpx->data),sizeof(PVOCDATA)) != sizeof(PVOCDATA)){
+    if(_read(fd,(char *) &(pWfpx->dwVersion),sizeof(DWORD)) != sizeof(DWORD)
+        || _read(fd,(char *) &(pWfpx->dwDataSize),sizeof(DWORD)) != sizeof(DWORD)
+        || _read(fd,(char *) &(pWfpx->data),sizeof(PVOCDATA)) != sizeof(PVOCDATA)){
         pv_errstr = "\npvsys: error reading Extended pvoc format data";
         return 0;
     }
@@ -812,8 +815,8 @@ static int32_t pvoc_readheader(int32_t ifd,WAVEFORMATPVOCEX *pWfpx)
     size += sizeof(PVOCDATA);
 #endif
 
-    if(read(files[ifd]->fd,(char *) &tag,sizeof(DWORD)) != sizeof(DWORD)
-        || read(files[ifd]->fd,(char *) &size,sizeof(DWORD)) != sizeof(DWORD)){
+    if(_read(files[ifd]->fd,(char *) &tag,sizeof(DWORD)) != sizeof(DWORD)
+        || _read(files[ifd]->fd,(char *) &size,sizeof(DWORD)) != sizeof(DWORD)){
         pv_errstr = "\npvsys: error reading header";
         return 0;
     }
@@ -831,7 +834,7 @@ static int32_t pvoc_readheader(int32_t ifd,WAVEFORMATPVOCEX *pWfpx)
         return 0;
     }
     riffsize = size;
-    if(read(files[ifd]->fd,(char *) &tag,sizeof(DWORD)) != sizeof(DWORD)){
+    if(_read(files[ifd]->fd,(char *) &tag,sizeof(DWORD)) != sizeof(DWORD)){
         pv_errstr = "\npvsys: error reading header";
         return 0;
     }
@@ -846,8 +849,8 @@ static int32_t pvoc_readheader(int32_t ifd,WAVEFORMATPVOCEX *pWfpx)
     riffsize -= sizeof(DWORD);
     /*loop for chunks */
     while(riffsize > 0){
-        if(read(files[ifd]->fd,(char *) &tag,sizeof(DWORD)) != sizeof(DWORD)
-            || read(files[ifd]->fd,(char *) &size,sizeof(DWORD)) != sizeof(DWORD)){
+        if(_read(files[ifd]->fd,(char *) &tag,sizeof(DWORD)) != sizeof(DWORD)
+            || _read(files[ifd]->fd,(char *) &size,sizeof(DWORD)) != sizeof(DWORD)){
             pv_errstr = "\npvsys: error reading header";
             return 0;
         }
@@ -912,7 +915,7 @@ static int32_t pvoc_readheader(int32_t ifd,WAVEFORMATPVOCEX *pWfpx)
                     return 0;
                 }
 
-            files[ifd]->datachunkoffset = lseek(files[ifd]->fd,0,SEEK_CUR);
+            files[ifd]->datachunkoffset = _lseek(files[ifd]->fd,0,SEEK_CUR);
             files[ifd]->curpos = files[ifd]->datachunkoffset;
             /* not m/c frames, for now */
             files[ifd]->nFrames = size / files[ifd]->pvdata.dwFrameAlign;
@@ -922,7 +925,7 @@ static int32_t pvoc_readheader(int32_t ifd,WAVEFORMATPVOCEX *pWfpx)
         default:
             /* skip any onknown chunks */
             riffsize -= 2 * sizeof(DWORD);
-            if(lseek(files[ifd]->fd,size,SEEK_CUR) < 0){
+            if(_lseek(files[ifd]->fd,size,SEEK_CUR) < 0){
                 pv_errstr = "\npvsys: error skipping unknown WAVE chunk";
                 return 0;
             }
@@ -957,8 +960,8 @@ static int32_t pvoc_writeheader(int ofd)
     if(!files[ofd]->do_byte_reverse)
         tag = REVDWBYTES(tag);
 
-    if(write(files[ofd]->fd,&tag,sizeof(int32_t)) != sizeof(int32_t)
-        || write(files[ofd]->fd,&size,sizeof(int32_t)) != sizeof(int32_t)) {
+    if(_write(files[ofd]->fd,&tag,sizeof(int32_t)) != sizeof(int32_t)
+        || _write(files[ofd]->fd,&size,sizeof(int32_t)) != sizeof(int32_t)) {
         pv_errstr = "\npvsys: error writing header";
         return 0;
     }
@@ -966,7 +969,7 @@ static int32_t pvoc_writeheader(int ofd)
     tag = TAG('W','A','V','E');
     if(!files[ofd]->do_byte_reverse)
         tag = REVDWBYTES(tag);
-    if(write(files[ofd]->fd,&tag,sizeof(int32_t)) != sizeof(int32_t)){
+    if(_write(files[ofd]->fd,&tag,sizeof(int32_t)) != sizeof(int32_t)){
         pv_errstr = "\npvsys: error writing header";
         return 0;
     }
@@ -981,13 +984,13 @@ static int32_t pvoc_writeheader(int ofd)
         size = REVDWBYTES(size);
     if(!files[ofd]->do_byte_reverse)
         tag = REVDWBYTES(tag);
-    if(write(files[ofd]->fd,(char *)&tag,sizeof(int32_t)) != sizeof(int32_t)
-        || write(files[ofd]->fd,(char *)&size,sizeof(int32_t)) != sizeof(int32_t)) {
+    if(_write(files[ofd]->fd,(char *)&tag,sizeof(int32_t)) != sizeof(int32_t)
+        || _write(files[ofd]->fd,(char *)&size,sizeof(int32_t)) != sizeof(int32_t)) {
         pv_errstr = "\npvsys: error writing header";
         return 0;
     }
     /* we need to record where we are, as we may have to update fmt data before file close */
-    files[ofd]->fmtchunkoffset = lseek(files[ofd]->fd,0,SEEK_CUR);
+    files[ofd]->fmtchunkoffset = _lseek(files[ofd]->fd,0,SEEK_CUR);
     
     if(write_fmt(files[ofd]->fd,files[ofd]->do_byte_reverse,&(files[ofd]->fmtdata)) != SIZEOF_WFMTEX){
         pv_errstr = "\npvsys: error writing fmt chunk";
@@ -998,13 +1001,13 @@ static int32_t pvoc_writeheader(int ofd)
     if(files[ofd]->do_byte_reverse)
         validbits = REVWBYTES(validbits);
 
-    if(write(files[ofd]->fd,(char *) &validbits,sizeof(WORD)) != sizeof(WORD)){
+    if(_write(files[ofd]->fd,(char *) &validbits,sizeof(WORD)) != sizeof(WORD)){
         pv_errstr = "\npvsys: error writing fmt chunk";
         return 0;
     }
     /* we will take this from a WAVE_EX file, in due course */
     size = 0;   /*dwChannelMask*/
-    if(write(files[ofd]->fd,(char *)&size,sizeof(DWORD)) != sizeof(DWORD)){
+    if(_write(files[ofd]->fd,(char *)&size,sizeof(DWORD)) != sizeof(DWORD)){
         pv_errstr = "\npvsys: error writing fmt chunk";
         return 0;
     }
@@ -1020,13 +1023,13 @@ static int32_t pvoc_writeheader(int ofd)
         size = REVDWBYTES(size);
     }
 
-    if(write(files[ofd]->fd,&version,sizeof(int32_t)) != sizeof(int32_t)
-        || write(files[ofd]->fd,&size,sizeof(int32_t)) != sizeof(int32_t)){
+    if(_write(files[ofd]->fd,&version,sizeof(int32_t)) != sizeof(int32_t)
+        || _write(files[ofd]->fd,&size,sizeof(int32_t)) != sizeof(int32_t)){
         pv_errstr = "\npvsys: error writing fmt chunk";
         return 0;
     }
 /* RWD new 2022 so we can update all pvocex props on closing new file */
-    files[ofd]->propsoffset = lseek(files[ofd]->fd,0,SEEK_CUR);
+    files[ofd]->propsoffset = _lseek(files[ofd]->fd,0,SEEK_CUR);
     
     if(write_pvocdata(files[ofd]->fd,files[ofd]->do_byte_reverse,&(files[ofd]->pvdata)) != sizeof(PVOCDATA)){
         pv_errstr = "\npvsys: error writing fmt chunk";
@@ -1043,8 +1046,8 @@ static int32_t pvoc_writeheader(int ofd)
             size = REVDWBYTES(size);
         else
             tag = REVDWBYTES(tag);
-        if(write(files[ofd]->fd,(char *)&tag,sizeof(int32_t)) != sizeof(int32_t)
-            || write(files[ofd]->fd,(char *)&size,sizeof(int32_t)) != sizeof(int32_t)) {
+        if(_write(files[ofd]->fd,(char *)&tag,sizeof(int32_t)) != sizeof(int32_t)
+            || _write(files[ofd]->fd,(char *)&size,sizeof(int32_t)) != sizeof(int32_t)) {
             pv_errstr = "\npvsys: error writing header";
             return 0;
         }
@@ -1061,7 +1064,7 @@ static int32_t pvoc_writeheader(int ofd)
     tag = TAG('d','a','t','a');
     if(!files[ofd]->do_byte_reverse)
         tag = REVDWBYTES(tag);
-    if(write(files[ofd]->fd,&tag,sizeof(int32_t)) != sizeof(int32_t)){
+    if(_write(files[ofd]->fd,&tag,sizeof(int32_t)) != sizeof(int32_t)){
         pv_errstr = "\npvsys: write error writing header";
         return 0;
     }
@@ -1069,11 +1072,11 @@ static int32_t pvoc_writeheader(int ofd)
     /* we need to update size later on...*/
 
     size = 0;
-    if(write(files[ofd]->fd,&size,sizeof(int32_t)) != sizeof(int32_t)){
+    if(_write(files[ofd]->fd,&size,sizeof(int32_t)) != sizeof(int32_t)){
         pv_errstr = "\npvsys: write error writing header";
         return 0;
     }
-    files[ofd]->datachunkoffset = lseek(files[ofd]->fd,0,SEEK_CUR);
+    files[ofd]->datachunkoffset = _lseek(files[ofd]->fd,0,SEEK_CUR);
 
     files[ofd]->curpos = files[ofd]->datachunkoffset;
     return 1;
@@ -1085,6 +1088,8 @@ static int32_t pvoc_updateheader(int ofd)
 {
     int32_t riffsize,datasize;
     DWORD pos;
+    //RWD Oct 2025 avoid singed/unsigned errors
+    long longpos;
 
 #ifdef _DEBUG   
     assert(files[ofd]);
@@ -1093,7 +1098,7 @@ static int32_t pvoc_updateheader(int ofd)
     assert(!files[ofd]->readonly);
 #endif
     datasize = files[ofd]->curpos - files[ofd]->datachunkoffset;
-    pos = lseek(files[ofd]->fd,files[ofd]->datachunkoffset-sizeof(DWORD),SEEK_SET);
+    pos = _lseek(files[ofd]->fd,files[ofd]->datachunkoffset-sizeof(DWORD),SEEK_SET);
     if(pos != files[ofd]->datachunkoffset-sizeof(DWORD)){
         pv_errstr = "\npvsys: seek error updating data chunk";
         return 0;
@@ -1101,7 +1106,7 @@ static int32_t pvoc_updateheader(int ofd)
 
     if(files[ofd]->do_byte_reverse)
         datasize = REVDWBYTES(datasize);
-    if(write(files[ofd]->fd,(char *) &datasize,sizeof(DWORD)) != sizeof(DWORD)){
+    if(_write(files[ofd]->fd,(char *) &datasize,sizeof(DWORD)) != sizeof(DWORD)){
         pv_errstr = "\npvsys: write error updating data chunk";
         return 0;
     }
@@ -1110,12 +1115,12 @@ static int32_t pvoc_updateheader(int ofd)
     riffsize = files[ofd]->curpos - 2* sizeof(DWORD);
     if(files[ofd]->do_byte_reverse)
         riffsize = REVDWBYTES(riffsize);
-    pos = lseek(files[ofd]->fd,sizeof(DWORD),SEEK_SET);
+    pos = _lseek(files[ofd]->fd,sizeof(DWORD),SEEK_SET);
     if(pos != sizeof(DWORD)){
         pv_errstr = "\npvsys: seek error updating riff chunk";
         return 0;
     }
-    if(write(files[ofd]->fd,(char *) &riffsize,sizeof(DWORD)) != sizeof(DWORD)){
+    if(_write(files[ofd]->fd,(char *) &riffsize,sizeof(DWORD)) != sizeof(DWORD)){
         pv_errstr = "\npvsys: write error updating riff chunk";
         return 0;
     }
@@ -1127,8 +1132,8 @@ static int32_t pvoc_updateheader(int ofd)
 #endif
         WORD validbits;
         
-        pos = lseek(files[ofd]->fd,files[ofd]->fmtchunkoffset,SEEK_SET);
-        if(pos != files[ofd]->fmtchunkoffset){
+        pos = _lseek(files[ofd]->fd,files[ofd]->fmtchunkoffset,SEEK_SET);
+        if(pos != (DWORD) files[ofd]->fmtchunkoffset){
             pv_errstr = "\npvsys: seek error updating fmt data";
             return 0;
         }
@@ -1144,12 +1149,12 @@ static int32_t pvoc_updateheader(int ofd)
         if(files[ofd]->do_byte_reverse)
             validbits = REVWBYTES(validbits);
         
-        if(write(files[ofd]->fd,(char *) &validbits,sizeof(WORD)) != sizeof(WORD)){
+        if(_write(files[ofd]->fd,(char *) &validbits,sizeof(WORD)) != sizeof(WORD)){
             pv_errstr = "\npvsys: error writing extended fmt chunk";
             return 0;
         }
-        pos = lseek(files[ofd]->fd,files[ofd]->propsoffset,SEEK_SET);
-        if(pos != files[ofd]->propsoffset){
+        pos = _lseek(files[ofd]->fd,files[ofd]->propsoffset,SEEK_SET);
+        if(pos != (DWORD) files[ofd]->propsoffset){
             pv_errstr = "\npvsys: seek error updating pvx data";
             return 0;
         }
@@ -1160,8 +1165,8 @@ static int32_t pvoc_updateheader(int ofd)
             return 0;
         }
     }
-    pos = lseek(files[ofd]->fd,0,SEEK_END);
-    if(pos < 0){
+    /*pos*/ longpos = _lseek(files[ofd]->fd, 0, SEEK_END);
+    if(/*pos*/ longpos  < 0) {
         pv_errstr = "\npvsys: seek error seeking to end of file";
         return 0;
     }
@@ -1206,7 +1211,7 @@ int32_t pvoc_closefile(int ofd)
         if(!pvoc_updateheader(ofd))
             return 0;
     }
-    close(files[ofd]->fd);
+    _close(files[ofd]->fd);
     if(files[ofd]->to_delete && !(files[ofd]->readonly))
         remove(files[ofd]->name);
 
@@ -1260,7 +1265,7 @@ int32_t pvoc_putframes(int ofd,const float *frame,int32_t numframes)
         for(i=0;i < towrite; i++){
             temp = *lfp++;
             temp = REVDWBYTES(temp);
-            if(write(files[ofd]->fd,(char *) &temp,sizeof(int32_t)) != sizeof(int32_t)){
+            if(_write(files[ofd]->fd,(char *) &temp,sizeof(int32_t)) != sizeof(int32_t)){
                 pv_errstr = "\npvsys: error writing data";
                 return 0;
             }
@@ -1268,7 +1273,7 @@ int32_t pvoc_putframes(int ofd,const float *frame,int32_t numframes)
         }
     }
     else {
-        if(write(files[ofd]->fd,(char *) frame,towrite * sizeof(float)) != (int32_t)(towrite * sizeof(float))){
+        if(_write(files[ofd]->fd,(char *) frame,towrite * sizeof(float)) != (int32_t)(towrite * sizeof(float))){
             pv_errstr = "\npvsys: error writing data";
             return 0;
         }
@@ -1306,7 +1311,7 @@ int32_t pvoc_getframes(int32_t ifd,float *frames,DWORD nframes)
         lfp = (int32_t *) frames;
 #ifdef SINGLE_FLOAT
         for(i=0;i < toread;i++){
-            if((got=read(files[ifd]->fd,(char *) &temp,sizeof(int32_t))) <0){
+            if((got=_read(files[ifd]->fd,(char *) &temp,sizeof(int32_t))) <0){
                 pv_errstr = "\npvsys: error reading data";
                 return rc;
             }
@@ -1319,12 +1324,12 @@ int32_t pvoc_getframes(int32_t ifd,float *frames,DWORD nframes)
         }
 #else
         /* much faster on G4!!! */
-        got = read(files[ifd]->fd,(char *)frames,toread * sizeof(float));
+        got = _read(files[ifd]->fd,(char *)frames,toread * sizeof(float));
         if(got < 0){
             pv_errstr = "\npvsys: error reading data";
             return rc;
         }
-        for(i=0;i < got / sizeof(float);i++){
+        for(i=0;i < got / (int32_t) sizeof(float);i++){
             temp = *lfp;
             oval = REVDWBYTES(temp);
             *lfp++ = oval;
@@ -1340,7 +1345,7 @@ int32_t pvoc_getframes(int32_t ifd,float *frames,DWORD nframes)
         rc = nframes;   /*RWD 4:2002 */
     }
     else{
-        if((got = read(files[ifd]->fd,(char *)frames,toread * sizeof(float))) < (int32_t)(toread * sizeof(float))){
+        if((got = _read(files[ifd]->fd,(char *)frames,toread * sizeof(float))) < (int32_t)(toread * sizeof(float))){
             if(got < 0){
                 pv_errstr = "\npvsys: error reading data";
                 return rc;
@@ -1389,7 +1394,7 @@ int32_t pvoc_rewind(int32_t ifd,int32_t skip_first_frame)
         skipsize =  files[ifd]->pvdata.dwFrameAlign * skipframes;
         pos += skipsize;
     }
-    if(lseek(fd,pos,SEEK_SET) != pos ) {
+    if(_lseek(fd,pos,SEEK_SET) != pos ) {
         pv_errstr = "\npvsys: error rewinding file";
         return rc;
     }
@@ -1444,20 +1449,20 @@ int32_t pvoc_seek_mcframe(int32_t ifd, int32_t offset, int32_t mode)
     DWORD rawoffset;
     int32_t rc = -1;
     int32_t mcframealign;
-    
+    int32_t pvxcur = 0;
     if(files[ifd]==NULL)
         return -1;
     mcframealign =  files[ifd]->pvdata.dwFrameAlign * files[ifd]->fmtdata.nChannels;
     rawoffset = offset * mcframealign;
-    switch(mode){
+    switch (mode) {
     case SEEK_SET:
-            // offset is m/c quantity, e.g. 2 * frame for stereo
-        if(offset >= (files[ifd]->nFrames / files[ifd]->fmtdata.nChannels)){
+        // offset is m/c quantity, e.g. 2 * frame for stereo
+        if (offset >= (files[ifd]->nFrames / files[ifd]->fmtdata.nChannels)) {
             pv_errstr = "\npvsys: seek target beyond end of file";
             break;
-        } 
+        }
         rawoffset += files[ifd]->datachunkoffset;
-        if(lseek(files[ifd]->fd,rawoffset,SEEK_SET) != rawoffset ) {
+        if (_lseek(files[ifd]->fd, rawoffset, SEEK_SET) != (long)rawoffset) {
             pv_errstr = "\npvsys: seek error, SEEK_SET";
             return -1;
         }
@@ -1466,32 +1471,47 @@ int32_t pvoc_seek_mcframe(int32_t ifd, int32_t offset, int32_t mode)
         rc = 0;
         break;
     case SEEK_END:
-    // go to end of file + offset, offset <= 0
-        if(offset > 0){
+        // go to end of file + offset, offset <= 0
+        if (offset > 0) {
             pv_errstr = "\npvsys: seek target before start of file, offset must be <= 0";
             break;
         }
 #ifdef _DEBUG
-        fprintf(stderr,"pvoc_seek_mcframe: fd = %d\n",ifd);
+        fprintf(stderr, "pvoc_seek_mcframe: fd = %d\n", ifd);
 #endif
         //NB not relative to datachunkoffset in this case
-        if(lseek(files[ifd]->fd,rawoffset,SEEK_END) < 0){
+        if (_lseek(files[ifd]->fd, rawoffset, SEEK_END) < 0) {
             pv_errstr = "\npvsys: seek error, SEEK_END";
             return -1;
         }
 #ifdef _DEBUG
-        fprintf(stderr,"pvoc_seek_mcframe: files[%d]->nFrames = %d\n",ifd,files[ifd]->nFrames);
+        fprintf(stderr, "pvoc_seek_mcframe: files[%d]->nFrames = %d\n", ifd, files[ifd]->nFrames);
 #endif
         files[ifd]->FramePos = files[ifd]->nFrames - (offset * files[ifd]->fmtdata.nChannels);
         files[ifd]->curpos = files[ifd]->datachunkoffset + files[ifd]->FramePos * files[ifd]->pvdata.dwFrameAlign;
 #ifdef _DEBUG
-        fprintf(stderr,"pvoc_seek_mcframe: got curpos = %d\n",files[ifd]->curpos);
+        fprintf(stderr, "pvoc_seek_mcframe: got curpos = %d\n", files[ifd]->curpos);
 #endif
         rc = 0;  //success!
         break;
     case SEEK_CUR:
-        // covered by pvoc_framepos(), equiv to a pvoc_tell() function.
-        pv_errstr = "\npvsys: SEEK_CUR mode not supported yet!";
+        pvxcur = pvoc_framepos(ifd);
+        if (pvxcur + offset >= files[ifd]->nFrames) {
+            pv_errstr = "\npvsys: seek target beyond end of file";
+            return rc;
+        }
+        if (pvxcur + offset < 0) {
+            pv_errstr = "\npvsys: seek target beyond start of file";
+            return rc;
+        }
+        rawoffset = offset * mcframealign;
+        if (_lseek(files[ifd]->fd, rawoffset, SEEK_CUR) < 0) {
+            pv_errstr = "\npvsys: seek error, SEEK_CUR";
+            return -1;
+        }
+        files[ifd]->FramePos = pvxcur + (offset * files[ifd]->fmtdata.nChannels);
+        files[ifd]->curpos = files[ifd]->datachunkoffset + files[ifd]->FramePos * files[ifd]->pvdata.dwFrameAlign;
+        rc = 0;
         break;
     }
     return rc;