⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audio.c

📁 MPEG2/MPEG4编解码参考程序(实现了MPEG4的部分功能)
💻 C
📖 第 1 页 / 共 2 页
字号:
  AuStream *as;  if (AUdebugLevel >= 1) {    printf("AudioOpenWrite: fileName=\"%s\"  format=\"%s\"\n",fileName,format);    printf("AudioOpenWrite: numChannel=%d  fSample=%.1f\n",	   numChannel,fSample);  }  if (strcmp(fileName,"-")) {#ifdef USE_AFSP    fmti = 0;    while (fmtstr[fmti].str && !isfmtstr(format,fmtstr[fmti].str))      fmti++;    if (fmtstr[fmti].str)      fmt = FD_INT16 + fmtstr[fmti].fmt;    else {#else    fmti = 0;    while (fmtstr[fmti].str && !isfmtstr(format,fmtstr[fmti].str))      fmti++;    if (!fmtstr[fmti].str) {#endif      CommonWarning("AudioOpenWrite: unkown audio file format \"%s\"",		    format);      return (AudioFile*)NULL;    }  }  if ((file=(AudioFile*)malloc(sizeof(AudioFile))) == NULL)    CommonExit(1,"AudioOpenWrite: memory allocation error");#ifdef USE_AFSP  if (strcmp(fileName,"-")) {    af = AFopenWrite(fileName,fmt,numChannel,fSample,		     AUdebugLevel?stdout:(FILE*)NULL);    as = NULL;  }  else {#endif    af = NULL;    as = AuOpenWrite(fileName,numChannel,fSample);#ifdef USE_AFSP  }#endif  if (as==NULL && af==NULL) {    CommonWarning("AudioOpenWrite: error opening audio file %s",fileName);    free(file);    return (AudioFile*)NULL;  }  file->file = af;  file->stream = as;  file->numChannel = numChannel;  file->currentSample = 0;  file->write = 1;  file->numClip = 0;  return file;}/* AudioReadData() *//* Read data from audio file. *//* Requested samples that could not be read from the file are set to 0. */long AudioReadData (  AudioFile *file,		/* in: audio file (handle) */  float **data,			/* out: data[channel][sample] */				/*      (range [-32768 .. 32767]) */  long numSample)		/* in: number of samples to be read */				/*     (samples per channel!) */				/* returns: */				/*  number of samples read */{  long tot,cur,num,tmp;  long i;  long numRead;#ifdef USE_AFSP  float buf[SAMPLE_BUF_SIZE];#endif  short bufs[SAMPLE_BUF_SIZE];  if (AUdebugLevel >= 2)    printf("AudioReadData: numSample=%ld (currentSample=%ld)\n",	   numSample,file->currentSample);  if (file->write != 0)    CommonExit(1,"AudioReadData: audio file not in read mode");  /* set initial unavailable samples to 0 */  tot = file->numChannel*numSample;  cur = 0;  if (file->stream && file->currentSample < 0) {    cur = min(-file->numChannel*file->currentSample,tot);    for (i=0; i<cur; i++)      data[i%file->numChannel][i/file->numChannel] = 0;  }  /* read samples from file */  while (cur < tot) {    num = min(tot-cur,SAMPLE_BUF_SIZE);#ifdef USE_AFSP    if (file->file) {      tmp = AFreadData(file->file,		       file->numChannel*file->currentSample+cur,buf,num);      for (i=0; i<tmp; i++)	data[(cur+i)%file->numChannel][(cur+i)/file->numChannel] = buf[i];    }#endif    if (file->stream) {      tmp = AuReadData(file->stream,bufs,num);      for (i=0; i<tmp; i++)	data[(cur+i)%file->numChannel][(cur+i)/file->numChannel] = bufs[i];    }    cur += tmp;    if (tmp < num)      break;  }  numRead = cur/file->numChannel;  file->currentSample += numRead;  /* set remaining unavailable samples to 0 */  for (i=cur; i<tot; i++)    data[i%file->numChannel][i/file->numChannel] = 0;  return numRead;}/* AudioWriteData() *//* Write data to audio file. */void AudioWriteData (  AudioFile *file,		/* in: audio file (handle) */  float **data,			/* in: data[channel][sample] */				/*     (range [-32768 .. 32767]) */  long numSample)		/* in: number of samples to be written */				/*     (samples per channel!) */{  long tot,cur,num;  long i;  long numClip,tmp;#ifdef USE_AFSP  float buf[SAMPLE_BUF_SIZE];#endif  short bufs[SAMPLE_BUF_SIZE];  if (AUdebugLevel >= 2)    printf("AudioWriteData: numSample=%ld (currentSample=%ld)\n",	   numSample,file->currentSample);  if (file->write != 1)    CommonExit(1,"AudioWriteData: audio file not in write mode");  tot = file->numChannel*numSample;  cur = max(0,-file->numChannel*file->currentSample);  while (cur < tot) {    num = min(tot-cur,SAMPLE_BUF_SIZE);#ifdef USE_AFSP    if (file->file) {      for (i=0; i<num; i++)	buf[i] = data[(cur+i)%file->numChannel][(cur+i)/file->numChannel];      AFwriteData(file->file,buf,num);    }#endif    if (file->stream) {      numClip = 0;      for (i=0; i<num; i++) {	tmp = ((long)(data[(cur+i)%file->numChannel]		      [(cur+i)/file->numChannel]+32768.5))-32768;	if (tmp>32767) {	  tmp = 32767;	  numClip++;	}	if (tmp<-32768) {	    tmp = -32768;	    numClip++;	}	bufs[i] = (short)tmp;      }      if (numClip && !file->numClip)	CommonWarning("AudioWriteData: output samples clipped");      file->numClip += numClip;      AuWriteData(file->stream,bufs,num);    }    cur += num;  }  file->currentSample += tot/file->numChannel;}/* AudioSeek() *//* Set position in audio file to curSample. *//* (Beginning of file: curSample=0) *//* NOTE: It is not possible to seek backwards in a output file if *//*       any samples were already written to the file. */void AudioSeek (  AudioFile *file,		/* in: audio file (handle) */  long curSample)		/* in: new position [samples] */				/*     (samples per channel!) */{  long tot,cur,num,tmp;#ifdef USE_AFSP  float buf[SAMPLE_BUF_SIZE];#endif  short bufs[SAMPLE_BUF_SIZE];  if (AUdebugLevel >= 1)    printf("AudioSeek: curSample=%ld (currentSample=%ld)\n",	   curSample,file->currentSample);  if (file->write==0) {    if (file->stream) {      if (file->currentSample <= 0) {	/* nothing read from stream yet */	if (curSample <= 0)	  file->currentSample = curSample;	else	  file->currentSample = 0;      }      if (curSample < file->currentSample)	CommonWarning("AudioSeek: can not seek backward in input stream");      else {	/* read samples to skip */	tot = file->numChannel*(curSample-file->currentSample);	cur = 0;	while (cur < tot) {	  num = min(tot-cur,SAMPLE_BUF_SIZE);	  tmp = AuReadData(file->stream,bufs,num);	  cur += tmp;	  if (tmp < num)	    break;	}	file->currentSample = curSample;      }    }    else      file->currentSample = curSample;  }  else {    if (file->currentSample <= 0) {      /* nothing written to file yet */      if (curSample <= 0)	file->currentSample = curSample;      else	file->currentSample = 0;    }    if (curSample < file->currentSample)      CommonExit(1,"AudioSeek: error seeking backwards in output file");    if (curSample > file->currentSample) {      /* seek forward, fill skipped region with silence */#ifdef USE_AFSP      memset(buf,0,SAMPLE_BUF_SIZE*sizeof(float));#endif      memset(bufs,0,SAMPLE_BUF_SIZE*sizeof(short));      tot = file->numChannel*(curSample-file->currentSample);      cur = 0;      while (cur < tot) {	num = min(tot-cur,SAMPLE_BUF_SIZE);#ifdef USE_AFSP	if (file->file)	  AFwriteData(file->file,buf,num);#endif	if (file->stream)	  AuWriteData(file->stream,bufs,num);	cur += num;      }      file->currentSample = curSample;    }  }}/* AudioClose() *//* Close audio file.*/void AudioClose (  AudioFile *file)		/* in: audio file (handle) */{  if (AUdebugLevel >= 1)    printf("AudioClose: (currentSample=%ld)\n",file->currentSample);  if (file->numClip)    CommonWarning("AudioClose: %ld samples clipped",file->numClip);#ifdef USE_AFSP  if (file->file)    AFclose(file->file);#endif  if (file->stream)    AuClose(file->stream);  free(file);}/* end of audio.c */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -