summaryrefslogtreecommitdiffstats
path: root/Master/Modellbildung_und_Simulation/Aufgabenblatt1/Superposition/src/WavefileSuperposition.cpp
blob: 91e16a214ea646e9b95431be12a11766449037d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
 * WavefileSuperposition.cpp
 *
 *  Created on: 01.04.2011
 *      Author: sven
 */

#ifndef WAVEFILESUPERPOSITION_H_
	#include "WavefileSuperposition.h"
#endif
#ifndef _GLIBCXX_IOSTREAM
	#include <iostream>
#endif

#ifndef _GLIBCXX_FSTREAM
	#include <fstream>
#endif

#ifndef _GLIBCXX_NUMERIC_LIMITS
	#include <limits>
#endif

WavefileSuperposition::WavefileSuperposition(SuperpositionParameters& params)
{
	std::cout << "superposing " << params.getSourceFileOne() << " and " << params.getSourceFileTwo()
			<< " to " << params.getDestinationFile() << std::endl;
	std::ofstream supFile;
	std::ifstream srcFile1;
	std::ifstream srcFile2;
	srcFile1.open(params.getSourceFileOne().c_str(), std::ios::in | std::ios::binary);
	srcFile2.open(params.getSourceFileTwo().c_str(), std::ios::in | std::ios::binary);
	supFile.open(params.getDestinationFile().c_str(), std::ios::out | std::ios::binary);
	int dataStartOffset = 0x28;
	char header[dataStartOffset];
	srcFile1.read(&header[0],dataStartOffset);
	supFile.write(&header[0],dataStartOffset);
	int numSamples;
	srcFile1.read((char*) &numSamples,sizeof(numSamples));
	std::cout<<"Processing "<< numSamples << " samples" << std::endl;
	srcFile2.seekg(srcFile1.tellg());
	supFile.write((char*) &numSamples,sizeof(numSamples));
	if (!(srcFile1.tellg() == srcFile2.tellg()) || !(srcFile1.tellg() == supFile.tellp()) ) {
		std::cout << "file positions not in sync" << std::endl;
		return;
	}
	short data1;
	short data2;
	int result;
	short shortResult;
	for (int i=0;i<numSamples;)
	{
		srcFile1.read((char*) &data1,sizeof(data1));
		srcFile2.read((char*) &data2,sizeof(data2));
		result = data1 + data2;
		if (result > std::numeric_limits<short>::max())
		{
			shortResult = std::numeric_limits<short>::max();
		}
		else if (result < std::numeric_limits<short>::min())
		{
			shortResult = std::numeric_limits<short>::min();
		} else
		{
			shortResult = static_cast<short>(result);
		}
		supFile.write((char*) &shortResult,sizeof(shortResult));
		i += sizeof(short);
	}
	supFile.close();
	srcFile1.close();
	srcFile2.close();
	std::cout<<"done" << std::endl;
}

WavefileSuperposition::~WavefileSuperposition() {
	// TODO Auto-generated destructor stub
}