-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathbuffers.h
executable file
·159 lines (135 loc) · 4.47 KB
/
buffers.h
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/***************************************************************************
* *
* This code is distribuited under LGPL v2.1 *
* *
* QAudioLib by Andrea993 *
* *
***************************************************************************/
#ifndef BUFFERS_H
#define BUFFERS_H
#include <QAudioBuffer>
#include <QVector>
#include <complex>
typedef QAudioBuffer::S16S S16S;
typedef std::complex<double> qcomplex;
class QAudioLibBuffer : public QAudioBuffer
{
private:
class DefaultAudioFormat : public QAudioFormat
{
public:
DefaultAudioFormat()
{
setByteOrder(QAudioFormat::LittleEndian);
setChannelCount(2);
setCodec("audio/pcm");
setSampleRate(44100);
setSampleSize(16);
setSampleType(QAudioFormat::SignedInt);
}
};
static const DefaultAudioFormat DEFAULT_FORMAT;
public:
QAudioLibBuffer() : QAudioBuffer(0,DEFAULT_FORMAT) {}
QAudioLibBuffer(const QAudioBuffer & other) : QAudioBuffer(other) {}
QAudioLibBuffer(const QByteArray & data) : QAudioBuffer(data,DEFAULT_FORMAT,-1) {}
QAudioLibBuffer(int numFrames) : QAudioBuffer(numFrames,DEFAULT_FORMAT,-1)
{
memset(this->data(),0,this->byteCount());
}
QAudioLibBuffer(qreal sec) : QAudioBuffer(static_cast<int>(sec*DEFAULT_FORMAT.sampleRate()),DEFAULT_FORMAT,-1)
{
memset(this->data(),0,this->byteCount());
}
static const QAudioFormat & getDefaultFormat()
{
return DEFAULT_FORMAT;
}
const S16S* constData() const
{
return QAudioBuffer::constData<QAudioLibBuffer::S16S>();
}
S16S* data()
{
return QAudioBuffer::data<QAudioLibBuffer::S16S>();
}
QAudioLibBuffer operator<<(const QAudioLibBuffer &x) const;
QAudioLibBuffer operator*(const QAudioLibBuffer &x) const;
QAudioLibBuffer operator*(const qreal x) const;
QAudioLibBuffer operator+(const QAudioLibBuffer &x) const;
QAudioLibBuffer subBuffer(int k0, int k1) const; //return a subBuffer
};
class QAudioLibFreqBuffer
{
public:
//This is a modified version of StereoFrame from qaudiobuffer.h that works with complex
typedef struct ComplexStereoFrame {
ComplexStereoFrame(): left(qcomplex(0)), right(qcomplex(0)) {}
ComplexStereoFrame(qcomplex leftSample, qcomplex rightSample): left(leftSample), right(rightSample) {}
ComplexStereoFrame& operator=(const ComplexStereoFrame &other)
{
left = other.left;
right = other.right;
return *this;
}
qcomplex left;
qcomplex right;
qcomplex average() const
{
return left/qcomplex(2)+right/qcomplex(2);
}
void clear() {left = right = qcomplex(0);}
}S64CD;
private:
QVector<S64CD> _zdata; //S32F manages left and right
public:
QAudioLibFreqBuffer(int numFrames)
{
_zdata.resize(numFrames);
}
QAudioLibFreqBuffer(const QAudioLibFreqBuffer & other)
{
_zdata.resize(other.frameCount());
memcpy(_zdata.data(),other.constData(),other.byteCount());
}
static QAudioLibFreqBuffer newByRealBuffer(const QAudioLibBuffer & x);
S64CD* data()
{
return _zdata.data();
}
const S64CD* constData() const
{
return _zdata.constData();
}
int frameCount() const
{
return _zdata.size();
}
int byteCount() const
{
return _zdata.count()*sizeof(S64CD);
}
qreal deltaf() //Interval between frequncies
{
return QAudioLibBuffer::getDefaultFormat().sampleRate()/static_cast<qreal>(frameCount());
}
qreal nyquistfreq()
{
return QAudioLibBuffer::getDefaultFormat().sampleRate()/2.0;
}
void appendZeros(int n) //used by fft
{
_zdata.resize(_zdata.size()+n);
}
void clear()
{
_zdata.clear();
}
QAudioLibFreqBuffer operator*(const QAudioLibFreqBuffer &x);
QAudioLibFreqBuffer operator*(const qreal x);
void operator=(const QAudioLibFreqBuffer &x);
QAudioLibFreqBuffer mod() const;
QAudioLibFreqBuffer phase() const;
QAudioLibFreqBuffer conj() const;
};
#endif // BUFFERS_H