📄 pcm2aiff.c
字号:
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 + -