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
}
|