|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /*
- Copyright (C) 2006 Nasca Octavian Paul
- Author: Nasca Octavian Paul
- Mark McCurry
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of version 2 of the GNU General Public License
- as published by the Free Software Foundation.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License (version 2 or later) for more details.
-
- You should have received a copy of the GNU General Public License (version 2)
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
- #include <cstdio>
- #include <cstring>
- #include <cstdlib>
- #include <iostream>
- #include "WavFile.h"
- using namespace std;
-
- WavFile::WavFile(string filename, int samplerate, int channels)
- :sampleswritten(0), samplerate(samplerate), channels(channels),
- file(fopen(filename.c_str(), "w"))
-
- {
- if(file) {
- cout << "INFO: Making space for wave file header" << endl;
- //making space for the header written at destruction
- char tmp[44];
- memset(tmp, 0, 44 * sizeof(char));
- fwrite(tmp, 1, 44, file);
- }
- }
-
- WavFile::~WavFile()
- {
- if(file) {
- cout << "INFO: Writing wave file header" << endl;
-
- unsigned int chunksize;
- rewind(file);
-
- fwrite("RIFF", 4, 1, file);
- chunksize = sampleswritten * 4 + 36;
- fwrite(&chunksize, 4, 1, file);
-
- fwrite("WAVEfmt ", 8, 1, file);
- chunksize = 16;
- fwrite(&chunksize, 4, 1, file);
- unsigned short int formattag = 1; //uncompresed wave
- fwrite(&formattag, 2, 1, file);
- unsigned short int nchannels = channels; //stereo
- fwrite(&nchannels, 2, 1, file);
- unsigned int samplerate_ = samplerate; //samplerate
- fwrite(&samplerate_, 4, 1, file);
- unsigned int bytespersec = samplerate * 2 * channels; //bytes/sec
- fwrite(&bytespersec, 4, 1, file);
- unsigned short int blockalign = 2 * channels; //2 channels * 16 bits/8
- fwrite(&blockalign, 2, 1, file);
- unsigned short int bitspersample = 16;
- fwrite(&bitspersample, 2, 1, file);
-
- fwrite("data", 4, 1, file);
- chunksize = sampleswritten * blockalign;
- fwrite(&chunksize, 4, 1, file);
-
- fclose(file);
- file = NULL;
- }
- }
-
- bool WavFile::good() const
- {
- return file;
- }
-
- void WavFile::writeStereoSamples(int nsmps, short int *smps)
- {
- if(file) {
- fwrite(smps, nsmps, 4, file);
- sampleswritten += nsmps;
- }
- }
-
- void WavFile::writeMonoSamples(int nsmps, short int *smps)
- {
- if(file) {
- fwrite(smps, nsmps, 2, file);
- sampleswritten += nsmps;
- }
- }
|