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

📄 pcm2aiff.c

📁 ISO mp3 sources (distribution 10) Layer 1/2/3, C Source, 512 k Sources of the Mpeg 1,2 layer 1,2
💻 C
📖 第 1 页 / 共 2 页
字号:
		return(0);}/************************************************************************  Audio Interchange File Format(AIFF) to PCM conversion.***********************************************************************/int aiff2pcm(char *fname,IFF_AIFF *aiff_ptr){int             *byte_per_sample;FILE            *file_ptr,*write_file_ptr[MaxNumberOfChannels];int             ch,numChan,diff_numChan,sample_size;register char   i;long            index;register long   seek_offset;char            temp_sampleRate[10];char            tmpBuf[10];int             *dummy,*dummy1;char            holder;static char     tmp_file_name[200];Chunk           FormChunk;CommonChunk     CommChunk;SoundDataChunk  SndDChunk;identifier      ident;void            exit();IEEE_DBL        *p_dbl,dbl;#ifdef  __MSDOS__unsigned long   lholder;void            swab();#endif	p_dbl=&dbl;	printf("        aiff to pcm conversion\n");	strcpy( tmp_file_name,fname); 	strcat( tmp_file_name,aiffFilenameSuffix); 	if(NULL==(file_ptr=fopen(tmp_file_name,"rb"))){	    printf("    read file open error\n");	    exit();	}	if (fseek(file_ptr, 0, SEEK_SET) != 0)	    return(-1);	if (fread(&FormChunk, sizeof(Chunk), 1, file_ptr) != 1)	    return(-1);	if (strncmp(FormChunk.ckID,IFF_ID_FORM,4) != 0 ||	      strncmp(FormChunk.formType,IFF_ID_AIFF,4) != 0)	    return(-1);	if (fread(&ident,sizeof(identifier), 1, file_ptr) != 1)	    return(-1);#ifdef __MSDOS__	lholder=ident.ck_length;	swab(&lholder,&ident.ck_length,4);	lholder=ident.ck_length&0xffff;	ident.ck_length=(((ident.ck_length>>16)&0xffff)+(lholder<<16))&0xffffffff;#endif		while(strncmp(ident.name,IFF_ID_COMM,4) != 0)	{	    if(NULL==(dummy = (int *)calloc( ident.ck_length, sizeof(char)))){		printf("        NULL pointer 1 \n");	    }	    if(fread( dummy, ident.ck_length, 1, file_ptr) != 1)		return(-1);	    free(dummy);	    if(fread( &ident, sizeof(identifier),1, file_ptr) != 1)		return(-1);#ifdef __MSDOS__	    lholder=ident.ck_length;	    swab(&lholder,&ident.ck_length,4);	    lholder=ident.ck_length&0xffff;	    ident.ck_length=(((ident.ck_length>>16)&0xffff)+(lholder<<16))&0xffffffff;#endif	}		for( i = 0; i < 4; ++i){		CommChunk.ckID[i] = ident.name[i];	}	CommChunk.ckSize = ident.ck_length;	if (fread(&CommChunk.numChannels, sizeof(short), 1, file_ptr) != 1)	    return(-1);	if (fread(&CommChunk.numSampleFrames, sizeof(unsigned long), 1,	      file_ptr) != 1)	    return(-1);	if (fread(&CommChunk.sampleSize, sizeof(short), 1, file_ptr) != 1)	    return(-1);	if (fread(CommChunk.sampleRate, sizeof(char[10]), 1, file_ptr) != 1)	    return(-1);#ifdef __MSDOS__	lholder=CommChunk.numChannels;	swab(&lholder,&CommChunk.numChannels,2);		lholder=CommChunk.numSampleFrames;	swab(&lholder,&CommChunk.numSampleFrames,4);	lholder=CommChunk.numSampleFrames&0xffff;	CommChunk.numSampleFrames=((CommChunk.numSampleFrames>>16)+(lholder<<16))&0xffffffff;		lholder=CommChunk.sampleSize;	swab(&lholder,&CommChunk.sampleSize,2);#endif	for (i = 0; i < sizeof(char[10]); i++)	    temp_sampleRate[i] = CommChunk.sampleRate[i];	extended_to_double(temp_sampleRate, &aiff_ptr->sampleRate);	fseek (file_ptr, sizeof(Chunk), SEEK_SET);	if (fread(&ident, sizeof(identifier), 1, file_ptr) != 1)	    return(-1);#ifdef __MSDOS__	lholder=ident.ck_length;	swab(&lholder,&ident.ck_length,4);	lholder=ident.ck_length&0xffff;	ident.ck_length=(((ident.ck_length>>16)&0xffff)+(lholder<<16))&0xffffffff;#endif	while(strncmp(ident.name,IFF_ID_SSND,4) != 0)	{	    if(NULL==(dummy1 = (int *)calloc( ident.ck_length, sizeof(char)))){		printf("        NULL pointer2 \n");	    }	    if(fread( dummy1, ident.ck_length, 1, file_ptr) != 1)		return(-1);	    free(dummy1);	    if(fread( &ident, sizeof(identifier),1, file_ptr) != 1)		return (-1);#ifdef __MSDOS__	    lholder=ident.ck_length;	    swab(&lholder,&ident.ck_length,4);	    lholder=ident.ck_length&0xffff;	    ident.ck_length=(((ident.ck_length>>16)&0xffff)+(lholder<<16))&0xffffffff;#endif	}	for(i = 0; i < 4; ++i)	    SndDChunk.ckID[i] = ident.name[i];	if (fread(&SndDChunk.offset, sizeof(unsigned long), 1, file_ptr)!=1)	    return(-1);#ifdef __MSDOS__	lholder=SndDChunk.offset;	swab(&lholder,&SndDChunk.offset,4);	lholder=SndDChunk.offset&0xffff;	SndDChunk.offset=(((SndDChunk.offset>>16)&0xffff)+(lholder<<16))&0xffffffff;#endif	if (fread(&SndDChunk.blockSize, sizeof(unsigned long), 1,	     file_ptr) != 1)	    return(-1);#ifdef __MSDOS__	lholder=SndDChunk.blockSize;	swab(&lholder,&SndDChunk.blockSize,4);	lholder=SndDChunk.blockSize&0xffff;	SndDChunk.blockSize=(((SndDChunk.blockSize>>16)&0xffff)+(lholder<<16))&0xffffffff;#endif	numChan = CommChunk.numChannels;	ch=0;	for (i = 0; i < numChan; i++) {	    sprintf(tmp_file_name, "%s_%s.pcm", fname, pcmFilenameSuffix[i]);	    if(NULL==(write_file_ptr[ch]=fopen(tmp_file_name,"wb"))){		printf("        write file open error\n");		exit(1);	    }	    ch++;	}	diff_numChan=numChan-CommChunk.numChannels;	if(diff_numChan>0){	}	printf("        number of samples in frame / channel = %ld\n",CommChunk.numSampleFrames);	sample_size=(CommChunk.sampleSize+BITS_IN_A_BYTE-1)/BITS_IN_A_BYTE;	for(index = 0; index < CommChunk.numSampleFrames; index++){	    for(ch = 0; ch < CommChunk.numChannels; ch++){		if (fread(&tmpBuf, sample_size, 1,file_ptr) != 1)		    return(-1);		if (fwrite(&tmpBuf, sample_size, 1,write_file_ptr[ch]) != 1)		    return(-1);	    }	}	aiff_ptr->numChannels       = CommChunk.numChannels;	aiff_ptr->numSampleFrames   = CommChunk.numSampleFrames;	aiff_ptr->sampleSize        = CommChunk.sampleSize;	aiff_ptr->blkAlgn.offset    = SndDChunk.offset;	aiff_ptr->blkAlgn.blockSize = SndDChunk.blockSize;	strncpy(aiff_ptr->sampleType, SndDChunk.ckID, 4);		for (i = 0; i < numChan; i++) {		fclose(write_file_ptr[i]);	}	fclose(file_ptr);		return(0);}/************************************************************************  Seek past some Audio Interchange File Format (AIFF) headers to sound data.***********************************************************************/int aiff_seek_to_sound_data(FILE *file_ptr){	if (fseek(file_ptr,sizeof(Chunk)+sizeof(SoundDataChunk),SEEK_SET)!=0)	    return(-1);	else	    return(0);}/************************************************************************  double_to_extended()**  Purpose:     Convert from IEEE double precision format to SANE extended*               format.**  Passed:      Pointer to the double precision number and a pointer to what*               will hold the Apple SANE extended format value.**  Outputs:     The SANE extended format pointer will be filled with the*               converted value.**  Returned:    Nothing.**********************************************************************/void    double_to_extended(double *pd, char ps[10]){#ifdef  MACINTOSH	x96tox80(pd, (extended *) ps);#elseregister unsigned long  top2bits;register unsigned short *ps2;register IEEE_DBL       *p_dbl;register SANE_EXT       *p_ext;SANE_EXT ext_align;char *c_align;int i;#ifdef  __MSDOS__unsigned long  holder;void    swab();#endif	p_dbl = (IEEE_DBL *) pd;#ifdef  __MSDOS__	holder = p_dbl->lo;	p_dbl->lo = p_dbl->hi;	p_dbl->hi = holder;#endif	p_ext=&ext_align;		top2bits = p_dbl->hi & 0xc0000000L;	p_ext->l1 = ((p_dbl->hi >> 4) & 0x3ff0000L) | top2bits;	p_ext->l1 |= ((p_dbl->hi >> 5) & 0x7fffL) | 0x8000L;	p_ext->l2 = (p_dbl->hi << 27) & 0xf8000000L;	p_ext->l2 |= ((p_dbl->lo >> 5) & 0x07ffffffL);#ifdef  __MSDOS__	holder = p_ext->l1 ;	swab(&holder,&p_ext->l1,4);	holder=p_ext->l1&0xffff;	p_ext->l1=((p_ext->l1>>16)+(holder<<16))&0xffffffff;	holder = p_ext->l2 ;	swab(&holder,&p_ext->l2,4);	holder=p_ext->l2&0xffff;	p_ext->l2=((p_ext->l2>>16)+(holder<<16))&0xffffffff;#endif		ps2 = (unsigned short *) & (p_dbl->lo);	ps2++;	ext_align.s1 = (*ps2 << 11) & 0xf800;		c_align = (char *) p_ext;	for (i=0;i<10;i++)	    ps[i] = c_align[i];#endif}/************************************************************************  extended_to_double()**  Purpose:     Convert from SANE extended format to IEEE double precision*               format.**  Passed:      Pointer to the Apple SANE extended format value and a pointer*               to what will hold the the IEEE double precision number.**  Outputs:     The IEEE double precision format pointer will be filled with*               the converted value.**  Returned:    Nothing.***********************************************************************/void    extended_to_double(char ps[10], double *pd){#ifdef  MACINTOSH   x80tox96((extended *) ps, pd);#elseregister unsigned long  top2bits;register IEEE_DBL       *p_dbl;register SANE_EXT       *p_ext;SANE_EXT ext_align;char *c_align;int i;#ifdef  __MSDOS__unsigned long  holder;void    swab();#endif	p_dbl = (IEEE_DBL *) pd;	p_ext = &ext_align;	c_align = (char *) p_ext;	for (i=0;i<10;i++)	   c_align[i] = ps[i];#ifdef  __MSDOS__	holder = p_ext->l1;	swab(&holder,&p_ext->l1,4);	holder = p_ext->l1&0xffff;	p_ext->l1 = (((p_ext->l1>>16)&0xffff)+(holder<<16))&0xffffffff;	holder = p_ext->l2;	swab(&holder,&p_ext->l2,4);	holder = p_ext->l2&0xffff;	p_ext->l2 = (((p_ext->l2>>16)&0xffff)+(holder<<16))&0xffffffff;	holder = p_ext->s1;	swab(&holder,&p_ext->s1,2);#endif	top2bits = p_ext->l1 & 0xc0000000L;	p_dbl->hi = ((p_ext->l1 << 4) & 0x3ff00000L) | top2bits;	p_dbl->hi |= (p_ext->l1 << 5) & 0xffff0L;	p_dbl->hi |= (p_ext->l2 >> 27) & 0x1f;	p_dbl->lo = (p_ext->l2 << 5) & 0xffffffe0L;	p_dbl->lo |= (unsigned long) ((p_ext->s1 >> 11) & 0x1f);#ifdef  __MSDOS__	holder = p_dbl->lo;	p_dbl->lo = p_dbl->hi;	p_dbl->hi = holder;#endif#endif};

⌨️ 快捷键说明

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