#include <iostream>
#include <vector>
#include <CLAM/Audio.hxx>
#include <CLAM/AudioFile.hxx>
#include <CLAM/MultiChannelAudioFileReader.hxx>
#include <CLAM/MultiChannelAudioFileWriter.hxx>

using namespace std;
using namespace CLAM;

int
main(int argc, char** argv)
{
    if (argc != 3) {
        cerr << "Usage: clam_test <in file name> <out file name>" << endl;
        exit(-1);
    }

    try {
        AudioFileSource infile;
        infile.OpenExisting(argv[1]);
        if (!infile.IsReadable()) {
            cerr << "Error: file " << infile.GetLocation()
                << " cannot be opened or its format is not supported" << endl;
            exit(-1);
        }
        MultiChannelAudioFileReaderConfig incfg;
        incfg.SetSourceFile(infile);
        MultiChannelAudioFileReader reader(incfg);

        AudioFileHeader outheader = infile.GetHeader();
        outheader.SetFormat(EAudioFileFormat::FormatFromFilename(argv[2]));
        AudioFileTarget outfile;
        outfile.CreateNew(argv[2], outheader);
        if (!outfile.IsWritable()) {
            cerr << "The desired format " << outheader.GetFormat()
                << "does not support current header parameters" << endl;
            exit(-1);
        }
        MultiChannelAudioFileWriterConfig outcfg;
        outcfg.AddTargetFile();
        outcfg.UpdateData();
        outcfg.SetTargetFile(outfile);
        MultiChannelAudioFileWriter writer(outcfg);

        vector<Audio> channels(outheader.GetChannels());
        for (size_t i = 0; i < channels.size(); ++i) channels[i].SetSize(2048);

        writer.Start();
        reader.Start();
        while (reader.Do(channels)) writer.Do(channels);
        reader.Stop();
        writer.Stop();
    } catch (const Err& e) {
        e.Print();
        exit(-1);
    } catch (const exception& e) {
        cerr << e.what() << endl;
        exit(-1);
    }

    return 0;
}