FILE *SndListOpen(char *nameFile,DWORD *pnItem,char mode) { FILE *pf=NULL; size_t nf1,nf2; char *opMode; char head[sizeof(SNDLISTHEADER)+1]; if(mode=='w'){ opMode=FMTWRITE; } else if(mode=='r') opMode=FMTREAD; else return NULL; pf=fopen(nameFile,opMode); ASSERTFILE(pf!=NULL,nameFile); if(mode=='w'){ nf1=fwrite(SNDLISTHEADER, sizeof(char), strlen(SNDLISTHEADER)+1, pf); nf2=fwrite(pnItem, sizeof(DWORD), 1, pf); } else{ nf1=fread(head, sizeof(char), strlen(SNDLISTHEADER)+1, pf); if(!strcmp(head,SNDLISTHEADER)) nf2=fread(pnItem, sizeof(DWORD), 1, pf); else{ fclose(pf); pf=NULL; } } return pf; }
//-------------------------------------------------------------------------- void SndObjGetFmt(BYTE *lpMem,LOADPATH lPath, LOADHANDLE lBlock, LOADHANDLE lID, LPSNDMIXFORMAT lpFmt, LPDWORD lpLengthData) { void *pf = 0; char nameBuf[MAX_PATH]; _WAVHEADER wavHeader; LPPACKEDFILE lpPf=NULL; if(lpMem) { COPYMEMORY(&wavHeader,lpMem,sizeof(wavHeader)); } else { if(lBlock[0]=='\0') { BuildFullPath(nameBuf,lPath, lID,sndDriveContext,SNDIDEXT); pf=fopen(nameBuf,"rb"); ASSERTFILE(pf,nameBuf); fread(&wavHeader, 1, sizeof( _WAVHEADER ), pf); } else { BuildFullPath(nameBuf,lPath, lBlock, sndDriveContext,SNDBLOCKEXT); // 'c' ?? lpPf=PkPackInit(nameBuf, 1, NULL); ASSERTFILE(lpPf,nameBuf); BuildFullPath(nameBuf,NULL, lID, sndDriveContext,SNDIDEXT); pf=Pkfopen(lpPf,nameBuf,"rb"); ASSERTFILE(pf,nameBuf); Pkfread(&wavHeader, 1, sizeof( _WAVHEADER ), pf); } } lpFmt->nSamplesPerSec=wavHeader.dwSamplesPerSec; lpFmt->wBitsPerSample=wavHeader.wBitsPerSample; lpFmt->nChannels=wavHeader.wChannels; *lpLengthData=wavHeader.dwDataLength; if (!lpMem) { if (lBlock[0]=='\0' && pf) fclose(pf); else { if (pf) Pkfclose(pf); PkPackClose(lpPf); } } return; }
void *HwSndObjLoad(LOADPATH lPath, LOADHANDLE lBlock, LOADHANDLE lID) { DWORD sizeBuff; BYTE *lpMem=NULL; //static LPPACKEDFILE lpPf=NULL; if(!lPath || !lID ||!lBlock) return NULL; if(lBlock[0]!='\0') { BuildFullPath(nameBuf,lPath, lBlock, sndDriveContext,SNDBLOCKEXT); // 'c' ?? lpPf=PkPackInit(nameBuf, 1, NULL); ASSERTFILE(lpPf,nameBuf); BuildFullPath(nameSnd,NULL, lID,'0',SNDIDEXT); lpMem=PkUnpack2Memory(lpPf,nameSnd, &sizeBuff); ASSERTFILE(lpMem,nameSnd); PkPackClose(lpPf); } else lpMem=HwSndObjLoadFile(lPath, lID); return (void *)lpMem; }
void HwSndStreamOpen(LPHWSNDSTREAM lpHwSndStream, void *lpMem, LOADPATH lPath, LOADHANDLE lBlock, LOADHANDLE lID) { char nameBuf[MAX_PATH]; if(lpMem!=NULL) { lpHwSndStream->whereType=HWSTR_MEM; lpHwSndStream->fread=Memfread; lpHwSndStream->ftell=Memftell; lpHwSndStream->fseek=Memfseek; lpHwSndStream->pf=Memfopen(lpMem,"rb"); } else { if(lBlock[0]=='\0') { BuildFullPath(nameBuf,lPath, lID,sndDriveContext,SNDIDEXT); lpHwSndStream->pf=fopen(nameBuf,"rb"); ASSERTFILE(lpHwSndStream->pf,nameBuf); lpHwSndStream->whereType=HWSTR_FILE; lpHwSndStream->fread=fread; lpHwSndStream->ftell=ftell; lpHwSndStream->fseek=fseek; } else { BuildFullPath(nameBuf,lPath, lBlock, sndDriveContext,SNDBLOCKEXT); // 'c' ?? ASSERTFILE(lpHwSndStream->lpPf=PkPackInit(nameBuf, 1, NULL),nameBuf); BuildFullPath(nameBuf,NULL, lID, sndDriveContext,SNDIDEXT); lpHwSndStream->pf=Pkfopen(lpHwSndStream->lpPf,nameBuf,"rb"); ASSERTFILE(lpHwSndStream->pf,nameBuf); lpHwSndStream->whereType=HWSTR_BLOCK; lpHwSndStream->fread=Pkfread; lpHwSndStream->ftell=Pkftell; lpHwSndStream->fseek=Pkfseek; } } }
// does it handle the drive problem? if from cd or from hdisk void *HwSndObjLoadFile(LOADPATH lPath, LOADHANDLE lID) { DWORD sizeBuff; FILE *pf; BYTE *lpMem=NULL,*lpScan; int c; char nameBuf[MAX_PATH]; if(!lPath || !lID) return NULL; BuildFullPath(nameBuf,lPath, lID,sndDriveContext,SNDIDEXT); // 'c' ?? pf=fopen(nameBuf, "rb"); ASSERTFILE(pf!=NULL,nameBuf); if(pf!=NULL) { fseek(pf,0,SEEK_END); sizeBuff=ftell(pf); lpScan=lpMem=MyMalloc(BYTE, sizeBuff); ASSERTOUTMEMORY(lpMem!=NULL); fseek(pf,0,SEEK_SET); while( (c=getc(pf))!=EOF) *lpScan++=c; fclose(pf); } return (void *)lpMem; }