OpenCores
URL https://opencores.org/ocsvn/sqmusic/sqmusic/trunk

Subversion Repositories sqmusic

[/] [sqmusic/] [trunk/] [1942/] [log2wav.cc] - Diff between revs 3 and 4

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 3 Rev 4
/*
/*
        Converts output from 1942.v to .wav file
        Converts output from 1942.v to .wav file
 
 
  (c) Jose Tejada Gomez, 9th May 2013
  (c) Jose Tejada Gomez, 9th May 2013
  You can use this file following the GNU GENERAL PUBLIC LICENSE version 3
  You can use this file following the GNU GENERAL PUBLIC LICENSE version 3
  Read the details of the license in:
  Read the details of the license in:
  http://www.gnu.org/licenses/gpl.txt
  http://www.gnu.org/licenses/gpl.txt
 
 
  Send comments to: jose.tejada@ieee.org
  Send comments to: jose.tejada@ieee.org
 
 
*/
*/
 
 
// Compile with  g++ log2wav.cc -o log2wav
// Compile with  g++ log2wav.cc -o log2wav
 
 
#include <iostream>
#include <iostream>
#include <fstream>
#include <fstream>
#include <vector>
#include <vector>
#include <string.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>
#include <assert.h>
#include <assert.h>
 
#include <string.h>
 
#include <string>
 
 
using namespace std;
using namespace std;
 
 
 
class Args {
 
public:
 
  int skip;
 
  string filename;
 
  string outputfile;
 
  Args( int argc, char *argv[]) : skip(0), outputfile("out.wav") {
 
    int k=1;
 
    bool filename_known=false;
 
    while( k < argc ) {
 
      if( strcmp(argv[k],"-l")==0 ) {
 
        k++;
 
        if( k >= argc ) throw "Expected number of lines to skip after -l";
 
        skip = atoi( argv[k] );
 
        cout << skip << " lines will be skipped\n";
 
        k++;
 
        continue;
 
      }
 
      if( strcmp(argv[k],"-o")==0 ) {
 
        k++;
 
        if( k >= argc ) throw "Expected output file name after -o";
 
        outputfile = argv[k];
 
        k++;
 
        continue;
 
      }
 
      if( filename_known ) {
 
        cout << "Unknown parameter " << argv[k] << "\n";
 
        throw "Incorrect command line";
 
      }
 
      filename = argv[k];
 
      filename_known = true;
 
      k++;
 
    }
 
    if( filename=="-" ) filename=string("/dev/stdin");
 
  }
 
};
 
 
int main(int argc, char *argv[]) {
int main(int argc, char *argv[]) {
        try {
        try {
                ifstream fin;
                ifstream fin;
                if( argc == 2)
                Args ar( argc, argv );
                        fin.open(argv[1]);
                cout << "Input file " << ar.filename << "\n";
                else
                fin.open(ar.filename.c_str());
                        fin.open("/dev/stdin");
                ofstream fout(ar.outputfile.c_str());
                ofstream fout("out.wav");
                if( fin.bad() || fin.fail() ) throw "Cannot open input file";
                if( fin.bad() ) throw "Cannot open input file";
                if( fout.bad() || fout.fail() ) throw "Cannot open output file";
                if( fout.bad() ) throw "Cannot open output file";
 
                assert( sizeof(short int)==2 );
                assert( sizeof(short int)==2 );
                char buffer[1024];
                char buffer[1024];
                int data=0;
                int data=0;
 
 
                // depending on the simulator the following "while"
                // depending on the simulator the following "while"
                // section might no be needed or modified
                // section might no be needed or modified
                // It just skips simulator output until the real data
                // It just skips simulator output until the real data
                // starts to come out
                // starts to come out
                while( !fin.eof() ) {
                for( int k=0; k<ar.skip && !fin.eof(); k++ ) {
                        fin.getline( buffer, sizeof(buffer) );
                        fin.getline( buffer, sizeof(buffer) );
                        if( strcmp(buffer,"ncsim> run" )==0) break;
                        //if( strcmp(buffer,"ncsim> run" )==0) break;
                }
                }
 
 
                if( fin.eof() ) throw "Data not found";
                if( fin.eof() ) throw "Data not found";
                fout.seekp(44);
                fout.seekp(44);
                while( !fin.eof() ) {
                while( !fin.eof() && !fin.bad() && !fin.fail() ) {
                        short int value;
                        short int value;
                        fin.getline( buffer, sizeof(buffer) );
                        fin.getline( buffer, sizeof(buffer) );
 
 
                        if( buffer[0]=='S' ) break; // reached line "Simulation complete"
                        if( buffer[0]=='S' ) break; // reached line "Simulation complete"
                        value = atoi( buffer );
                        value = atoi( buffer );
                        fout.write( (char*) &value, sizeof(value) );
                        fout.write( (char*) &value, sizeof(value) );
                        data++;
                        data++;
                }
                }
                cout << data << " samples written\n";
                cout << data << " samples written\n";
                // Write the header
                // Write the header
                const char *RIFF = "RIFF";
                const char *RIFF = "RIFF";
                fout.seekp(0);
                fout.seekp(0);
                fout.write( RIFF, 4 );
                fout.write( RIFF, 4 );
                int aux=36+2*data;
                int aux=36+2*data;
                fout.write( (char*)&aux, 4 );
                fout.write( (char*)&aux, 4 );
                const char *WAVE = "WAVE";
                const char *WAVE = "WAVE";
                fout.write( WAVE, 4 );
                fout.write( WAVE, 4 );
                const char *fmt = "fmt ";
                const char *fmt = "fmt ";
                fout.write( fmt, 4 );
                fout.write( fmt, 4 );
                aux=16;
                aux=16;
                fout.write( (char*)&aux, 4 );// suubchunk 1 size
                fout.write( (char*)&aux, 4 );// suubchunk 1 size
                short int aux_short = 1;
                short int aux_short = 1;
                fout.write( (char*)&aux_short, 2 ); // audio format (1)
                fout.write( (char*)&aux_short, 2 ); // audio format (1)
                fout.write( (char*)&aux_short, 2 ); // num channels (1)
                fout.write( (char*)&aux_short, 2 ); // num channels (1)
                aux=44100;
                aux=44100;
                fout.write( (char*)&aux, 4 );
                fout.write( (char*)&aux, 4 );
                aux=44100*1*2;
                aux=44100*1*2;
                fout.write( (char*)&aux, 4 ); // byte rate
                fout.write( (char*)&aux, 4 ); // byte rate
                aux_short=2;
                aux_short=2;
                fout.write( (char*)&aux_short, 2 ); // block align              
                fout.write( (char*)&aux_short, 2 ); // block align              
                aux_short=16;
                aux_short=16;
                fout.write( (char*)&aux_short, 2 ); // bits per sample
                fout.write( (char*)&aux_short, 2 ); // bits per sample
                RIFF="data";
                RIFF="data";
                fout.write( RIFF, 4 );
                fout.write( RIFF, 4 );
                aux = data*2;
                aux = data*2;
                fout.write( (char*)&aux, 4 ); // data size              
                fout.write( (char*)&aux, 4 ); // data size              
                return 0;
                return 0;
        }
        }
        catch( const char *msg ) {
        catch( const char *msg ) {
    cout << msg << "\n";
    cout << msg << "\n";
    return -1;
    return -1;
  }
  }
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.