25
25
#include " Components.h"
26
26
#include < QAudioRecorder>
27
27
#include " WAVFormat.h"
28
+ #include " LoopableBuffer.h"
28
29
29
30
Signal::Signal (QObject *parent)
30
31
: QObject(parent),
@@ -78,12 +79,14 @@ Signal::Signal(QObject *parent)
78
79
connect (m_audio, SIGNAL (stateChanged (QAudio::State)), this , SLOT (handleStateChanged (QAudio::State)));
79
80
m_audio->setVolume (0.2 );
80
81
81
- // start audio with buffer
82
- m_buffer = new QBuffer (m_samples);
82
+ // create the buffer with the audio samples
83
+ m_buffer = new LoopableBuffer (m_samples);
84
+ m_buffer->open (QIODevice::ReadOnly);
83
85
}
84
86
85
87
Signal::~Signal ()
86
88
{
89
+ stop ();
87
90
m_buffer->close ();
88
91
delete m_audio;
89
92
delete m_buffer;
@@ -123,26 +126,14 @@ qint32 Signal::getSample(int index)
123
126
{
124
127
if (m_samples != nullptr && index * 4 >= 0 && index * 4 <= m_samples->size () - 4 )
125
128
{
126
- // qint32 convertedValue =
127
129
return qFromLittleEndian<qint32>(m_samples->constData () + (index * 4 ));
128
- // m_samples->append(convertedValue, 4);
129
130
}
130
131
return 0 ;
131
132
}
132
133
133
134
void Signal::generate ()
134
135
{
135
- // if(m_samples != nullptr)
136
- // {
137
- // delete m_samples;
138
- // }
139
-
140
-
141
-
142
-
143
136
int totalSample = qRound (m_duration * m_sampleRate);
144
- // m_samples = new QByteArray(totalSample, NULL);
145
- // output.init();
146
137
147
138
m_samples->clear ();
148
139
@@ -154,17 +145,14 @@ void Signal::generate()
154
145
for (int i = 0 ; i < totalSample; i++)
155
146
{
156
147
qreal x = qreal (i) / m_sampleRate;
157
- // qDebug() << "time: " << x;
158
- // qreal sample = Utils::Clamp(sin(400.0 * x), -1.0, 1.0);
159
- // qreal sample = qSin(400.0 * x * 2 * M_PI);
160
148
qreal sample = m_component != nullptr ? Utils::Clamp (m_component->getOutput (x), -1 ., 1 .) : 0.0 ;
161
149
162
150
// qDebug() << "time: " << x << " | value: " << sample;
163
151
qint32 value = qint32 (qRound (INT32_MAX * sample));
164
152
165
153
char convertedValue[4 ] = {0 };
166
154
qToLittleEndian (value, convertedValue);
167
- m_samples->append (convertedValue, 4 );// QByteArray::number(convertedValue));
155
+ m_samples->append (convertedValue, 4 );
168
156
}
169
157
170
158
qDebug () << " Generated!" ;
@@ -178,21 +166,49 @@ void Signal::exportWAV(QString fileName)
178
166
wav.writeToFile (fileName, m_samples);
179
167
}
180
168
169
+ void Signal::loop (bool enable)
170
+ {
171
+ m_buffer->setLoop (enable);
172
+ }
173
+
181
174
void Signal::play ()
182
175
{
183
- if (m_buffer-> isOpen () )
176
+ if (m_audio-> state () == QAudio::SuspendedState )
184
177
{
185
- m_audio->stop ();
186
- m_buffer->close ();
178
+ m_audio->resume ();
187
179
}
180
+ else
181
+ {
182
+ stop ();
183
+ toStart ();
184
+ m_audio->start (m_buffer);
185
+ }
186
+ }
188
187
189
- m_buffer->open (QIODevice::ReadOnly);
190
- m_audio->start (m_buffer);
188
+ void Signal::stop ()
189
+ {
190
+ if (m_audio->state () == QAudio::ActiveState)
191
+ {
192
+ m_audio->stop ();
193
+ }
191
194
}
192
195
193
196
void Signal::pause ()
194
197
{
198
+ if (m_audio->state () == QAudio::ActiveState)
199
+ {
200
+ m_audio->suspend ();
201
+ }
202
+ }
203
+
204
+ void Signal::toStart ()
205
+ {
206
+ m_buffer->reset ();
207
+ }
195
208
209
+ void Signal::toEnd ()
210
+ {
211
+ m_buffer->seek (qMax (qint64 (0 ), m_buffer->size () - 1 ));
196
212
}
197
213
198
214
0 commit comments