-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTapeCoder.cpp
More file actions
83 lines (71 loc) · 2.58 KB
/
TapeCoder.cpp
File metadata and controls
83 lines (71 loc) · 2.58 KB
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
78
79
80
81
82
83
#include "TapeCoder.h"
#include <iostream>
static const string WAV_EXTENSION = ".wav";
TapeCoder::TapeCoder(string destName, int sampleRate, int maxPauseInSeconds, int splitOutputWavesOverMB):
destName(destName),
sampleRate(sampleRate),
maxPauseInSeconds(maxPauseInSeconds),
splitOutputWavesOverMB(splitOutputWavesOverMB) {
dest = new WaveFile();
openNewOutputDest();
}
TapeCoder::~TapeCoder() {
dest->Close();
delete(dest);
}
void TapeCoder::writeBit(int lastSignalCount, int signalType, int fullSignal) {
if (lastSignalCount==0) {
if (signalType==1) {
for(int k = 0; k < fullSignal / 2; k++) writeSample(-0.1);
for(int k = 0; k < fullSignal - fullSignal / 2; k++) writeSample(0.1);
} else {
for(int k = 0; k < fullSignal / 2; k++) writeSample(0.1);
for(int k = 0; k < fullSignal - fullSignal / 2; k++) writeSample(-0.1);
}
} else {
if (signalType==-1) {
for(int k = 0; k < fullSignal / 2; k++) writeSample(-0.1);
for(int k = 0; k < fullSignal - fullSignal / 2; k++) writeSample(0.1);
} else {
for(int k = 0; k < fullSignal / 2; k++) writeSample(0.1);
for(int k = 0; k < fullSignal - fullSignal / 2; k++) writeSample(-0.1);
}
}
}
void TapeCoder::writeSample(double value) {
zerosCount = 0;
dest->WriteSample(value);
}
void TapeCoder::writeZero() {
if (maxPauseInSeconds && zerosCount >= maxPauseInSeconds * sampleRate) {
currentAbsoluteStartOffset++;
return;
}
zerosCount++;
dest->WriteSample(0.0);
}
string TapeCoder::getDestOffset(unsigned int sourceOffset) {
return (splitOutputWavesOverMB?"(" + getCurrentNameInfix() + ") ":"") + to_string(sourceOffset - currentAbsoluteStartOffset);
}
void TapeCoder::possibleSplit(unsigned int sourceOffset) {
if (splitOutputWavesOverMB && sourceOffset - currentAbsoluteStartOffset > splitOutputWavesOverMB * 1000000) {
currentAbsoluteStartOffset = sourceOffset;
dest->Close();
openNewOutputDest();
}
}
string TapeCoder::generateNextNameInfix() {
++nrOrder;
return getCurrentNameInfix();
}
string TapeCoder::getCurrentNameInfix() {
return splitOutputWavesOverMB?(nrOrder < 10?"0":"") + to_string(nrOrder):"";
}
void TapeCoder::openNewOutputDest() {
string fileName = destName + generateNextNameInfix() + WAV_EXTENSION;
if(!dest->OpenWrite(fileName.c_str())) {
cerr << "Cannot open an output file: " << fileName << "\n";
exit(EXIT_FAILURE);
}
dest->SetupFormat(sampleRate,8,1);
}