// Waveファイル 読み込み 書き込み
// 16bit形式のみ対応
// たぶん標準C++
// 読み込んだデータはstd::vector<short>に格納されます
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <cmath>

typedef struct {
char riffID[4]; // "riff"
unsigned int size; // ファイルサイズ-8
char wavID[4]; // "WAVE"
char fmtID[4]; // "fmt "
unsigned int fmtSize; // fmtチャンクのバイト数
unsigned short format; // フォーマット
unsigned short channels; // チャンネル数
unsigned int sampleRate; // サンプリングレート
unsigned int bytePerSec; // データ速度
unsigned short blockSize; // ブロックサイズ
unsigned short bit; // 量子化ビット数
char dataID[4]; // "data"
unsigned int dataSize; // 波形データのバイト数
} wavHeader;

int main(int argc, char *argv[])
{
wavHeader header;

std::ifstream ifs;
ifs.open(argv[1]);
if (!ifs) {
std::cout << "入力ファイルを開けませんn";
exit(1);
}
std::cout << argv[1] << "をオープンしました。n";

ifs.read((char*)&header, sizeof(header));

std::vector<short> lData;
std::vector<short> rData;

do {
short buf[2];
ifs.read((char*)buf, sizeof(buf[0])*2);
lData.push_back(buf[0]);
rData.push_back(buf[1]);
} while (!ifs.eof());

ifs.close();

/*加工する(今は素通り)*/
std::vector<short> lNewData = lData;
std::vector<short> rNewData = rData;

std::ofstream ofs;
ofs.open(argv[2], std::ios::out|std::ios::binary|std::ios::trunc);
if (!ofs) {
std::cout << "出力ファイルを開けませんn";
exit(1);
}

std::vector<short>::iterator lit = lNewData.begin();
std::vector<short>::iterator rit = rNewData.begin();
while (lit != lNewData.end() & rit != rNewData.end()){
short buf[2];
if (lit != lNewData.end()){
buf[0] = *lit;
lit++;
}
else{
buf[0] = 0;
}

if (rit != rNewData.end()){
buf[1] = *rit;
rit++;
}
else{
buf[1] = 0;
}
ofs.write((char*)buf, sizeof(buf[0])*2);
}

ofs.close();

return 0;
}