-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathAudioBufferDevice.cpp
87 lines (73 loc) · 1.98 KB
/
AudioBufferDevice.cpp
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
#include "AudioBufferDevice.h"
#include <QByteArray>
AudioBufferDevice::AudioBufferDevice(QAudioDecoder *decoder, QObject *parent):
QIODevice(parent),
_decoder(decoder),
_isFinished(false)
{
connect(_decoder, SIGNAL(bufferReady()), this, SLOT(onBufferReady()));
connect(_decoder, SIGNAL(finished()), this, SLOT(onFinished()));
connect(_decoder, SIGNAL(error(QAudioDecoder::Error)), this, SLOT(onErroe(QAudioDecoder::Error)));
_filter = new EQFilterGroup();
_decoder->start();
}
bool AudioBufferDevice::atEnd() const
{
return _isFinished && _queue.empty();
}
qint64 AudioBufferDevice::readData(char *data, qint64 size)
{
if (_queue.empty() && _abuffer_queue.empty()) {
return 0;
}
if (_queue.empty()) {
QAudioBuffer *buffer = _abuffer_queue.first();
QBuffer *qb = _filter->filter(*buffer);
_queue.push_back(qb);
_abuffer_queue.removeFirst();
delete buffer;
}
QBuffer *buffer = _queue.first();
if (!buffer->isOpen()) {
buffer->open(QIODevice::ReadOnly);
}
qint64 n = buffer->read(data, size);
qDebug() << "-----------------------------------------------------------------------------data" << strlen(data);
if (buffer->atEnd()) {
_queue.removeFirst();
delete buffer;
}
return n;
}
qint64 AudioBufferDevice::writeData(const char *data, qint64 maxSize)
{
return 0;
}
qint64 AudioBufferDevice::bytesAvailable() const
{
if (_queue.empty()) {
return 0;
} else {
return _queue.first()->bytesAvailable();
}
}
void AudioBufferDevice::onBufferReady()
{
QAudioBuffer buffer = _decoder->read();
if (buffer.isValid()) {
_abuffer_queue.push_back(new QAudioBuffer(buffer));
}
}
void AudioBufferDevice::onFinished()
{
_isFinished = true;
}
void AudioBufferDevice::clearQAbuffer()
{
_queue.clear();
_abuffer_queue.clear();
}
void AudioBufferDevice::onErroe(QAudioDecoder::Error error)
{
qDebug() << error;
}