www.pudn.com > ica_C.rar > wav_io.c


#include 
#include 
#include 
#include "wav_io.h"

int Read_matrix(int n, int m, char *fname, matrix x)
{
  FILE *fin;
  int i;

  fopen_r(fin,fname);
  for(i=0;iFS=tmplong;
  fread(&tmplong,4,1,fp);  printf("%ld byte/sec, ",tmplong);
  fread(&tmpshort,2,1,fp); printf("%d block align, ",tmpshort);
  fread(&tmpshort,2,1,fp); printf("%d bits/samp, \n",tmpshort);

  fread(magic,4,1,fp);
  if (strncmp(magic , "data", 4) !=0){
    printf("Sorry, missing data chunk\n"); exit(0);
  }

  fread(&len,4,1,fp);

  readwav->length=len;
  readwav->data=(short *)malloc((sizeof(short))*len/2);
  fread(readwav->data,2,len/2,fp);

  fclose(fp);
  return(len/4);
}

void write_wav(char *fname, wavfmt *writewav)
{
  unsigned long ltmp;
  unsigned short stmp;
  FILE *fp;

  fopen_w(fp,fname);

  fwrite("RIFF",1,4,fp);
  
  ltmp=writewav->length+36; fwrite(<mp,4,1,fp);

  fwrite("WAVE",1,4,fp); fwrite("fmt ",1,4,fp);

  ltmp=16; fwrite(<mp,4,1,fp);
  stmp=1;  fwrite(&stmp,2,1,fp);
  stmp=2;  fwrite(&stmp,2,1,fp);
  ltmp=writewav->FS;   fwrite(<mp,4,1,fp);
  ltmp=writewav->FS*4; fwrite(<mp,4,1,fp);
  stmp=4;  fwrite(&stmp,2,1,fp);
  stmp=16; fwrite(&stmp,2,1,fp);

  fwrite("data",1,4,fp);
  ltmp=writewav->length; fwrite(<mp,4,1,fp);
  fwrite(writewav->data,2,ltmp/2,fp);

  fclose(fp);
}

FILE *write_wav_head(char *fname, wavfmt *writewav)
{
  unsigned long ltmp;
  unsigned short stmp;
  FILE *fp;

  fopen_w(fp,fname);

  fwrite("RIFF",1,4,fp);
  
  ltmp=writewav->length+36; fwrite(<mp,4,1,fp);

  fwrite("WAVE",1,4,fp); fwrite("fmt ",1,4,fp);

  ltmp=16; fwrite(<mp,4,1,fp);
  stmp=1;  fwrite(&stmp,2,1,fp);
  stmp=2;  fwrite(&stmp,2,1,fp);
  ltmp=writewav->FS;   fwrite(<mp,4,1,fp);
  ltmp=writewav->FS*4; fwrite(<mp,4,1,fp);
  stmp=4;  fwrite(&stmp,2,1,fp);
  stmp=16; fwrite(&stmp,2,1,fp);

  fwrite("data",1,4,fp);
  ltmp=writewav->length; fwrite(<mp,4,1,fp);
/*    fwrite(writewav->data,2,ltmp/2,fp); fclose(fp); */
  return(fp);
}

int WaveData_2_DoubleMat(wavfmt fmt, matrix x)
{
  int i,m=fmt.length/4;

  new_matrix(2,m);

  for(i=0;ilength=2*n*(sizeof(short));
  fmt->data=(short *)malloc(fmt->length);

  for(i=0;i=1){
      printf("data is too large and be clipped\n");
      *(fmt->data+2*i)  =MAX-1;
    }
    else if(x[0][i]<-1){
      printf("data is too large and be clipped\n");
      *(fmt->data+2*i)  =-MAX;
    }
    else *(fmt->data+2*i)  =(short)(MAX*x[0][i]);
    if(x[1][i]>=1){
      printf("data is too large and be clipped\n");
      *(fmt->data+2*i+1)  =MAX-1;
    }
    else if(x[1][i]<-1){
      printf("data is too large and be clipped\n");
      *(fmt->data+2*i+1)  =-MAX;
    }
    else *(fmt->data+2*i+1)=(short)(MAX*x[1][i]);
  }
  return(n);
}

int round(SCALAR x){
  if((x-floor(x))>0.5)return(ceil(x));
  else return floor(x);
}