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

📄 wave.c

📁 mp3文件格式与wav文件格式的音频文件转换工具
💻 C
字号:
#include <stdio.h>#include "portableio.h"#include "types.h"#include "error.h"#include "wave.h"static bool checkString(FILE *file,char *string){    char temp[1024];    int  length = strlen(string);    if(fread(temp,1,length,file)!=length) ERROR("Premature EOF in input !?!");    temp[length] = (char)0;    return !strcmp(temp,string);}void wave_close(){    fclose(config.wave.file);}bool wave_open(){    static char    *channel_mappings[] = {NULL,"mono","stereo"};    unsigned short  wFormatTag;    unsigned long   dAvgBytesPerSec;    unsigned short  wBlockAlign;    long            filesize;    long            header_size;    if((config.wave.file = fopen(config.infile,"rb")) == NULL) ERROR("Unable to open file");    if(!checkString(config.wave.file,"RIFF")) ERROR("Input not a MS-RIFF file");    filesize = Read32BitsLowHigh(config.wave.file); /* complete wave chunk size */    printf("Microsoft RIFF, ");    if(!checkString(config.wave.file,"WAVE")) ERROR("Input not WAVE audio");    printf("WAVE audio, ");/* WAVE FMT format chunk */    if(!checkString(config.wave.file,"fmt "))  ERROR("Can't find format chunk");/* my total header size calculations don't work, so this is bogus... */    header_size = Read32BitsLowHigh(config.wave.file); /* chunk size */    wFormatTag = Read16BitsLowHigh(config.wave.file);    if(wFormatTag!=0x0001) ERROR("Unknown WAVE format");    config.wave.type = WAVE_RIFF_PCM;    config.wave.channels   = Read16BitsLowHigh(config.wave.file);    config.wave.samplerate = Read32BitsLowHigh(config.wave.file);    dAvgBytesPerSec        = Read32BitsLowHigh(config.wave.file);    wBlockAlign            = Read16BitsLowHigh(config.wave.file);/* PCM specific */    if(config.wave.channels>2) ERROR("More than 2 channels\n");    printf("PCM, %s %ldHz ",            channel_mappings[config.wave.channels], config.wave.samplerate);    config.wave.bits       = Read16BitsLowHigh(config.wave.file);    if(config.wave.bits!=16) ERROR("NOT 16 Bit !!!\n");    printf("%dbit, ", config.wave.bits);   // if(!checkString(config.wave.file,"data")) ERROR("Can't find data chunk");    header_size = ftell(config.wave.file);    fseek(config.wave.file, 0, SEEK_END);    filesize = ftell(config.wave.file);    fseek(config.wave.file, header_size, SEEK_SET);    config.wave.total_samples = (filesize-header_size)/(2*config.wave.channels);    config.wave.length = config.wave.total_samples/config.wave.samplerate;    printf("Length: %2ld:%2ld:%2ld\n", (config.wave.length/3600),                                        (config.wave.length/60)%60,                                       (config.wave.length%60));     return true;}static int read_samples(short *sample_buffer,                        int    frame_size){    int samples_read;    switch(config.wave.type)    {        default          :            ERROR("[read_samples], wave filetype not supported");        case WAVE_RIFF_PCM :            samples_read = fread(sample_buffer,sizeof(short),frame_size, config.wave.file);                /* Microsoft PCM Samples are little-endian, */            /* we must swap if this is a big-endian machine */           if(config.byte_order==order_bigEndian)                SwapBytesInWords(sample_buffer,samples_read);           if(samples_read<frame_size && samples_read>0)            { /* Pad sample with zero's */               while(samples_read<frame_size) sample_buffer[samples_read++] = 0;           }           break;    }    return samples_read;}int wave_get(short buffer[2][1152])/* expects an interleaved 16bit pcm stream from read_samples, which it *//* de-interleaves into buffer                                          */{    static short temp_buf[2304];    int          samples_read;    int          j;    switch(config.mpeg.mode)    {        case MODE_MONO  :            samples_read = read_samples(temp_buf,config.mpeg.samples_per_frame);            for(j=0;j<1152;j++)            {                buffer[0][j] = temp_buf[j];                buffer[1][j] = 0;            }            break;        case MODE_STEREO :         case MODE_JSTEREO:        case MODE_DUAL   :            samples_read = read_samples(temp_buf,config.mpeg.samples_per_frame*2);            for(j=0;j<1152;j++)            {                buffer[0][j] = temp_buf[2*j];                buffer[1][j] = temp_buf[2*j+1];            }            break;        default          :            ERROR("[wav_get], channel mode not supported");    }    return samples_read;} 

⌨️ 快捷键说明

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