📄 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);
#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 + -