📄 audio.c
字号:
/**********************************************************************MPEG-4 Audio VMAudio i/o moduleThis software module was originally developed byHeiko Purnhagen (University of Hannover / ACTS-MoMuSys)and edited byin the course of development of the MPEG-2 NBC/MPEG-4 Audio standardISO/IEC 13818-7, 14496-1,2 and 3. This software module is animplementation of a part of one or more MPEG-2 NBC/MPEG-4 Audio toolsas specified by the MPEG-2 NBC/MPEG-4 Audio standard. ISO/IEC givesusers of the MPEG-2 NBC/MPEG-4 Audio standards free license to thissoftware module or modifications thereof for use in hardware orsoftware products claiming conformance to the MPEG-2 NBC/ MPEG-4 Audiostandards. Those intending to use this software module in hardware orsoftware products are advised that this use may infringe existingpatents. The original developer of this software module and his/hercompany, the subsequent editors and their companies, and ISO/IEC haveno liability for use of this software module or modifications thereofin an implementation. Copyright is not released for non MPEG-2NBC/MPEG-4 Audio conforming products. The original developer retainsfull right to use the code for his/her own purpose, assign or donatethe code to a third party and to inhibit third party from using thecode for non MPEG-2 NBC/MPEG-4 Audio conforming products. Thiscopyright notice must be included in all copies or derivative works.Copyright (c) 1996, 1999.Source file: audio.c$Id: audio.c,v 1.13 1999/05/19 15:18:15 purnhage Exp $Required libraries:libtsp.a AFsp audio file libraryRequired modules:common.o common moduleaustream.o audio i/o streams (.au format)Authors:HP Heiko Purnhagen, Uni Hannover <purnhage@tnt.uni-hannover.de>BT Bodo Teichmann, FhG/IIS <tmn@iis.fhg.de>Changes:21-jan-97 HP born (using AFsp-V2R2)27-jan-97 HP set unavailable samples to 0 in AudioReadData()03-feb-97 HP fix bug AudioInit formatString=NULL19-feb-97 HP made internal data structures invisible21-feb-97 BT raw: big-endian12-sep-97 HP fixed numSample bug for mch files in AudioOpenRead()30-dec-98 HP uses austream for stdin/stdout, evaluates USE_AFSP07-jan-99 HP AFsp-v4r1 (AFsp-V3R2 still supported)11-jan-99 HP clipping & seeking for austream module17-jan-99 HP fixed quantisation to 16 bit26-jan-99 HP improved output file format evaluation17-may-99 HP improved output file format detection**********************************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#ifdef USE_AFSP#include <libtsp.h> /* AFsp audio file library */#include <libtsp/AFpar.h> /* AFsp audio file library - definitions */#endif#include "audio.h" /* audio i/o module */#include "common_m4a.h" /* common module */#include "austream.h" /* audio i/o streams (.au format) *//* ---------- declarations ---------- */#define SAMPLE_BUF_SIZE 16384 /* local sample buffer size */#define min(a,b) ((a) < (b) ? (a) : (b))#define max(a,b) ((a) > (b) ? (a) : (b))#ifdef USE_AFSP#ifdef FW_SUN/* only AFsp-V3R2 available: map AFsp-V3R2 to AFsp-v4r1 */#define AFsetNHpar AFsetNH#define FTW_AU (FW_SUN/256)#define FTW_WAVE (FW_WAVE/256)#define FTW_AIFF_C (FW_AIFF_C/256)#define FTW_NH_EB (FW_NH_EB/256)#endif#endif/* ---------- declarations (structures) ---------- */struct AudioFileStruct /* audio file handle */{#ifdef USE_AFSP AFILE *file; /* AFILE handle */#else int *file;#endif AuStream *stream; /* AuStream handle */ /* NULL if AFsp used */ int numChannel; /* number of channels */ long currentSample; /* number of samples read/written */ /* (samples per channel!) */ int write; /* 0=read 1=write */ long numClip; /* number of samples clipped */};/* ---------- variables ---------- */static int AUdebugLevel = 0; /* debug level *//* ---------- local functions ---------- */int isfmtstr (char *filename, char *fmtstr)/* isfmtstr returns true if filename has extension fmtstr */{ int i; i = strlen(filename)-strlen(fmtstr); if (i<0) return 0; filename += i; while (*filename) { if (tolower(*filename) != *fmtstr) return 0; filename++; fmtstr++; } return 1;}/* ---------- functions ---------- *//* AudioInit() *//* Init audio i/o module. *//* formatString options: see AFsp documentation */void AudioInit ( char *formatString, /* in: file format for headerless files */ int debugLevel) /* in: debug level */ /* 0=off 1=basic 2=full */{ AUdebugLevel = debugLevel; if (AUdebugLevel >= 1) { printf("AudioInit: formatString=\"%s\"\n", (formatString!=NULL)?formatString:"(null)"); printf("AudioInit: debugLevel=%d\n",AUdebugLevel);#ifdef USE_AFSP printf("AudioInit: all AFsp file formats supported\n");#else printf("AudioInit: only 16 bit .au format supported\n");#endif }#ifdef USE_AFSP if (formatString!=NULL) AFsetNHpar(formatString); /* headerless file support */#endif}/* AudioOpenRead() *//* Open audio file for reading. */AudioFile *AudioOpenRead ( char *fileName, /* in: file name */ /* "-": stdin (only 16 bit .au) */ int *numChannel, /* out: number of channels */ float *fSample, /* out: sampling frequency [Hz] */ long *numSample) /* out: number of samples in file */ /* (samples per channel!) */ /* or 0 if not available */ /* returns: */ /* audio file (handle) */ /* or NULL if error */{ AudioFile *file;#ifdef USE_AFSP AFILE *af;#else int *af;#endif AuStream *as; long ns; long nc; int nci; float fs; if (AUdebugLevel >= 1) printf("AudioOpenRead: fileName=\"%s\"\n",fileName); if ((file=(AudioFile*)malloc(sizeof(AudioFile))) == NULL) CommonExit(1,"AudioOpenRead: memory allocation error");#ifdef USE_AFSP if (strcmp(fileName,"-")) { af = AFopenRead(fileName,&ns,&nc,&fs, AUdebugLevel?stdout:(FILE*)NULL); as = NULL; } else {#endif af = NULL; as = AuOpenRead(fileName,&nci,&fs,&ns); nc = nci; ns = max(0,ns);#ifdef USE_AFSP }#endif if (as==NULL && af==NULL) { CommonWarning("AudioOpenRead: error opening audio file %s",fileName); free(file); return (AudioFile*)NULL; } file->file = af; file->stream = as; file->numChannel = nc; file->currentSample = 0; file->write = 0; file->numClip = 0; *numChannel = nc; *fSample = fs; *numSample = ns/nc; if (AUdebugLevel >= 1) printf("AudioOpenRead: numChannel=%d fSample=%.1f numSample=%ld\n", *numChannel,*fSample,*numSample); return file;}/* AudioOpenWrite() *//* Open audio file for writing. *//* Sample format: 16 bit twos complement, uniform quantisation *//* Supported file formats: (matching substring of format) *//* au, snd: Sun (AFsp) audio file *//* wav: RIFF WAVE file *//* aif: AIFF-C audio file *//* raw: headerless (raw) audio file (native byte order) */AudioFile *AudioOpenWrite ( char *fileName, /* in: file name */ /* "-": stdout (only 16 bit .au) */ char *format, /* in: file format (ignored if stdout) */ /* (au, snd, wav, aif, raw) */ int numChannel, /* in: number of channels */ float fSample) /* in: sampling frequency [Hz] */ /* returns: */ /* audio file (handle) */ /* or NULL if error */{ AudioFile *file;#ifdef USE_AFSP AFILE *af; int fmt; int fmti; struct { char *str; int fmt; } fmtstr[] = { {"au",FTW_AU*256}, {"snd",FTW_AU*256}, {"wav",FTW_WAVE*256}, {"wave",FTW_WAVE*256}, {"aif",FTW_AIFF_C*256}, {"aiff",FTW_AIFF_C*256}, {"aifc",FTW_AIFF_C*256}, {"raw",FTW_NH_EB*256}, /* no header big-endian */ {NULL,-1} };#else int *af; int fmti; struct { char *str; int fmt; } fmtstr[] = { {"au",1}, {"snd",1}, {NULL,-1} };#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -