/************************************************************* wave.c wave.h 31July2002 T.KOSAKA waveファイルの読み込み,書き込み用の関数群を与えます。 ただし一度に開けるwaveファイルは読み込み用1,書き出し用1のみです。 waveファイルのheaderは複雑で冗長ですが,通常のプログラミングでは, 1)サンプリング周波数 2)1サンプルデータを構成するビット数   (2チャンネルの場合は片チャンネル1サンプル分のビット数) 3)ファイル中のサンプル数   (2チャンネルの場合の実データ数はサンプル数の2倍になる) 4)ファイル中のチャンネル数 の4つしか意味がありません。ですからファイル名を与えてファイルをオ ープンしたら,headerの各要素からこの4つのみ受け取ることにします。 またファイル名を与えてファイルに保存する場合もこの4つのみ与えて, headerの各要素を自動生成してくれる。 またwaveファイルは8ビット/サンプルデータの場合と16ビット/サンプルデ ータの場合がありますが,ユーザのプログラムはデータを操作する際にはす べて16ビットと仮定してshort int で操作できるようになっている。 そしてファイルが8ビット形式の場合は読み出し,書き込み時に自動変換さ れるものとする。 【1】使い方(waveファイルの読み込み) (1)関数openInputWaveFile(ファイル名)でファイルをオープンします この時,FILEポインタはwave.c内部でのみ参照可能です ユーザ側〜.cではFILEポインタは使いません また,関数は構造体WaveConstant_tで必要な定数を関数の戻り値とします ファイル読み込みに失敗した場合は,戻値構造体WaveConstant_t中の NumberOfSamplesが0になります (2)関数getSingleCHSampleData(void)をNumberOfSamples回呼び出して サンプルを得ます この時,1サンプルを構成するビット数にかかわりなく-32768〜32767の値 の範囲にして読み出します 読み出しファイルが8ビットデータの場合でも-32768〜32767の値を読み出 します (3)関数closeInputWaveFile()を呼び出してファイルをクローズします 【2】使い方(waveファイルの書き込み) (1)関数openOutputWaveFile(ファイル名,Wave定数構造体)でファイル をオープンします この時,FILEポインタはwave.c内部でのみ参照可能です また,構造体WaveConstant_tで書き込みに必要な定数を与えるとあとは自 動的にheaderを生成します。 (2)関数putSingleCHSampleData()をNumberOfSamples回呼び出してサン プルを書き込みます この時,1サンプルを構成するビット数にかかわりなく呼び出し側の変数 はshort intです 8ビットデータ書き込みの場合でも-32768〜32767の値を引数で与えます (3)関数closeOutputWaveFile()を呼び出してファイルをクローズします 【3】補足 (1)waveファイルの読み込み(以下の関数は読み込みwaveファイルが開かれている時に使うことが出来る) (1.1)関数void getSingleCHSampleDataBlock(short int x[], int number) ファイルからのサンプルデータ入力をブロック単位で行なう関数 関数getSingleCHSampleData(void)をnumber回呼び出したのと同じです。 (1.2)関数getDualCHSampleData(short int data[2]) ファイルからのステレオサンプルデータを1サンプルを読み込む関数 (1.3)関数getDualCHSampleDataBlock(short int data[][2], int number) ファイルからのステレオサンプルデータをnumberサンプルを読み込む関数 関数getDualCHSampleData()をnumber回呼び出したのと同じです。 (1.4)関数checkEOFInputWaveFile(void) ファイルの終端にたどり着いたかどうか検査する関数。 ファイルの終端にたどり着いたらEOF,そうでなかったら0を返す。 (2)waveファイルの書き出し(以下の関数は書き出しwaveファイルが開かれている時に使うことが出来る) (2.1)関数void putSingleCHSampleDataBlock(short int SampleData[], int number); ファイルへのサンプルデータ出力をブロック単位で行なう関数 関数putSingleCHSampleData()をnumber回呼び出したのと同じです。 (2.2)関数putDualCHSampleData(short int data[2]) ファイルへステレオサンプルデータを1サンプルを書き出す関数 (2.3)関数putDualCHSampleDataBlock(short int data[][2], int number) ファイルへステレオサンプルデータをnumberサンプルを書き出す関数 関数putDualCHSampleData()をnumber回呼び出したのと同じです。 *************************************************************/ typedef struct { unsigned long int SamplingFrequency; /*サンプリング周波数*/ unsigned short int BitsPerSample; /*1サンプルを構成するビット数*/ unsigned long int NumberOfSamples; /*ファイル中のサンプル数*/ unsigned short int NumberOfChannels; /*ファイル中のチャンネル数*/ } WaveConstant_t; /*waveファイルの読み込み関連*/ WaveConstant_t openInputWaveFile(char *fname); /*NumberOfSamples==0:fault*/ short int getSingleCHSampleData(void); void getSingleCHSampleDataBlock(short int x[], int number); void getDualCHSampleData(short int data[2]); void getDualCHSampleDataBlock(short int data[][2], int number); int checkEOFInputWaveFile(void); /*ファイルの終端チェック*/ void closeInputWaveFile(void); /*waveファイルの書き出し関連*/ int openOutputWaveFile(char *fname,WaveConstant_t *WaveConstant); /*戻り値==0:fault*/ void putSingleCHSampleData(short int SampleData); void putSingleCHSampleDataBlock(short int SampleData[], int number); void putDualCHSampleData(short int data[2]); void putDualCHSampleDataBlock(short int data[][2], int number); void closeOutputWaveFile(void);