すべての wav ファイルのメタデータを読み取るプログラムがあります。次の解析済み構造体と fread 関数を使用しました。
このコードで発生する問題は、一部の .wav RIFF ヘッダー fmt ファイルで、以下に示すように構造体をペアリングした後でもメタ データの読み取りが正しくないことです。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
using std::string;
typedef struct RIFF_CHUNCK_DISCRIPTOR {
char RIFF[4]; // RIFF Header Magic header
unsigned long ChunkSize; // RIFF Chunk Size
char WAVE[4]; // WAVE Header
};
typedef struct FMT_CHUNCK_DISCRIPTOR {
char fmt[4]; // FMT header
unsigned long Subchunk1Size; // Size of the fmt chunk
unsigned short AudioFormat; // Audio format
unsigned short NumOfChan; // Number of channels
unsigned long SamplesPerSec; // Sampling Frequency in Hz
unsigned long bytesPerSec; // bytes per second
unsigned short blockAlign; // 2=16-bit mono, 4=16-bit stereo
unsigned short bitsPerSample; // Number of bits per sample
};
typedef struct DATA_SUB_CHUNCK {
char Subchunk2ID[4]; // "data" string
unsigned long Subchunk2Size; // Sampled data length
};
int main(int argc, char* argv[]) {
const char* fileName;
cout << "enter f name " << fileName;
RIFF_CHUNCK_DISCRIPTOR RCD;
FMT_CHUNCK_DISCRIPTOR FCD;
DATA_SUB_CHUNCK DSC;
FILE* InFile = fopen(fileName, "r");
fread(&RCD, 1, sizeof(RIFF_CHUNCK_DISCRIPTOR), InFile);
fread(&FCD, 1, sizeof(FMT_CHUNCK_DISCRIPTOR), InFile);
fread(&DSC, 1, sizeof(DATA_SUB_CHUNCK), InFile);
}
複数の構造体を使用した理由は、ヘッダー ファイルのすべてのデータが正しく読み取られるようにするためです。ほとんどの wav ファイル ヘッダー データは正しい順序であるにもかかわらず、正しくない場合があるためです。