-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathaudiocap.cpp
74 lines (62 loc) · 2.18 KB
/
audiocap.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
#include "audiocap.h"
#include <QAudioDeviceInfo>
#include <QDebug>
QStringList AudioCap::deviceList()
{
QStringList list;
QList<QAudioDeviceInfo> devices = QAudioDeviceInfo::availableDevices( QAudio::AudioInput );
foreach ( QAudioDeviceInfo device, devices )
{
list.append( device.deviceName() );
}
return list;
}
AudioCap::AudioCap(QString deviceName, QObject *parent)
: QObject(parent)
{
QList<QAudioDeviceInfo> devices = QAudioDeviceInfo::availableDevices( QAudio::AudioInput );
foreach ( QAudioDeviceInfo device, devices )
{
if ( device.deviceName() == deviceName )
{
QAudioFormat format;
format.setSampleRate(44100);
format.setChannelCount(2);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
format = device.nearestFormat( format );
m_audioInput = new QAudioInput(device, format);
goto config_sound_device;
}
}
qDebug() << "Unknown device:" << deviceName;
qDebug() << AudioCap::deviceList();
return;
config_sound_device:
// TODO validate AudioFormat
m_msPerFrame = 1000 / ( m_audioInput->format().sampleRate() / 1024.0 );
m_bytesPerFrame = m_audioInput->format().bytesPerFrame() * 1024;
// qDebug() << "ms per frame" << m_msPerFrame << "bytes per frame" << m_bytesPerFrame;
m_audioInput->setNotifyInterval( m_msPerFrame );
connect(m_audioInput,SIGNAL(notify()),this,SIGNAL(readyRead()));
// qDebug() << m_audioInput->format() << m_msPerFrame;
m_audioDevice.open( QIODevice::ReadWrite );
m_audioInput->start( &m_audioDevice );
}
//void AudioCap::readyRead()
//{
// while( m_bytesPerFrame <= m_audioDevice.bytesAvailable() )
// {
// QByteArray frame = m_audioDevice.read( m_bytesPerFrame );
// quint32 frameTime = m_frameCount * m_msPerFrame;
// ++m_frameCount;
// }
//}
QByteArray AudioCap::grabFrame()
{
if ( m_bytesPerFrame > m_audioDevice.bytesAvailable() )
return QByteArray();
return m_audioDevice.read( m_bytesPerFrame );
}