c言語初心者ですが、本を参考にWAVファイルの速度を変えるプログラムを書きました。
しかし、何度やっても
wavspeed.c:80:28: error: unknown type name ‘FILE’
extern long wavHeaderWrite(FILE fp, SpParam sp);
と出てしまいます。
対処法はなにかないでしょうか。
<プログラム>
#ifndef SPWAV_HEADER
#define SPWAV_HEADER
#ifndef _MAX_PATH
#define _MAX_PATH (255)
#endif
#pragma pack(push,1)
typedef struct tagSWaveFileHeader
{
char hdrRiff[4];
unsigned int sizeOfFile;
char hdrWave[4];
} SWaveFileHeader;
typedef struct tagChank
{
unsigned char hdrFmtData[4];
unsigned int sizeOfFmtData;
} tChank;
typedef struct tagWaveFormatPcm
{
unsigned short formatTag;
unsigned short channels;
unsigned int samplesPerSec;
unsigned int bytesPerSec;
unsigned short blockAlign;
unsigned short bitsPerSample;
} tWaveFormatPcm;
typedef struct tagWrSWaveFileHeader
{
unsigned char hdrRiff[4];
unsigned int sizeOfFile;
unsigned char hdrWave[4];
unsigned char hdrFmt[4];
unsigned int sizeOfFmt;
struct{
unsigned short formatTag;
unsigned short channels;
unsigned int samplesPerSec;
unsigned int bytesPerSec;
unsigned short blockAlign;
unsigned short bitsPerSamples;
} stWaveFormat;
unsigned char hdrData[4];
unsigned int sizeOfData;
} WrSWaveFileHeader;
#pragma pack(pop)
#define STR_RIFF "RIFF"
#define STR_WAVE "WAVE"
#define STR_fmt "fmt"
#define STR_data "data"
#define WAV_MONAURAL 1
#define WAV_STEREO 2
typedef struct tagParam
{
unsigned int samplesPerSec;
unsigned short bitsPerSamples;
unsigned int sizeOfData;
unsigned short channels;
unsigned int bytesPerSec;
long posOfData;
int start;
int end;
} SpParam;
int wavHdrRead(char wavefile, SpParam sp);
extern long wavHeaderWrite(FILE fp, SpParam sp);
#endif
#include <stdio.h>
#include <stdlib.h>
int wavDataWrite(FILE fpIn, FILE fpOut, SpParam sp)
{
int rVal=0;
void pMem=NULL;
fseek(fpIn, sp->posOfData, SEEK_SET);
if((pMem=malloc(sp->sizeOfData))==NULL)
{
printf("メモリが確保出来ません。\n");
return -1;
}
if(fread(pMem, sp->sizeOfData, 1, fpIn) != 1)
{
printf("読み込みに失敗しました。\n");
free(pMem);
return -1;
}
if(fwrite(pMem, sp->sizeOfData, 1, fpOut) != 1)
{
printf("書き込みに失敗しました。\n");
free(pMem);
return -1;
}
free(pMem);
return rVal;
}
int wavWrite(char *inFile, char outFile, SpParam sp)
{
FILE *fpIn, *fpOut;
if((fpOut = fopen(outFile, "wb")) == NULL)
{
printf("%s をオープン出来ません。\n", outFile);
return -1;
}
if(wavHeaderWrite(fpOut, sp)!=44)
{
printf("ヘッダを書き込めません: %s\n", outFile);
fclose(fpOut);
return -1;
}
if((fpIn=fopen(inFile, "rb")) == NULL)
{
fprintf(stderr, "%s をオープンできません。\n", inFile);
fclose(fpOut);
return -1;
}
if(wavDataWrite(fpIn, fpOut, sp )!=0)
{
printf("wavDataWriteでエラー発生。\n");
fclose(fpIn);
fclose(fpOut);
return -1;
}
fclose(fpIn);
fclose(fpOut);
return 0;
}
void usage(void)
{
fprintf(stderr,
"サンプリング周波数を変更します(ヘッダのみ)。\n"
"引数に<入力ファイル名><出力ファイル名><速度の倍率>\n"
"を指定してください。\n\n"
"例 : pgm in.wav out.wav 1.2\n");
}
int main(int argc, char *argv[])
{
SpParam sp;
if(argc != 4)
{
usage();
return -1;
}
if( wavHdrRead(argv[1], &sp)!=0)
return -1;
sp.samplesPerSec=(int)(atof(argv[3])*sp.samplesPerSec);
printf("\n%d [Hz]へ変換しました。\n", sp.samplesPerSec);
if( wavWrite(argv[1],argv[2], &sp)!=0)
return -1;
printf("\n%s を %sへ変換しました。\n", argv[1],argv[2]);
return 0;
}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/26 08:07
2016/07/26 08:07
2016/07/26 08:11
2016/07/26 08:12