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

📄 pcm2aiff.c

📁 MPEG 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);
#else
register 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);
#else
register 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 + -