#include "DataSource.h"
#include <QtQuick/QQuickItem>
#include <QtCore/QDebug>
#include <QtCore/QtMath>
#include <QTime>
DataSource::DataSource( QObject *parent) :
QIODevice(parent), m_readPos(0)
{
}
qint64 DataSource::readData(char * data, qint64 maxSize)
{
qint64 total = 0;
auto chunk = qMin(((qint64)m_audioData.size() - m_readPos), maxSize);
memcpy(data + total, m_audioData.data() + m_readPos, chunk);
m_readPos = m_readPos + chunk;
total += chunk;
return total;
}
qint64 DataSource::writeData(const char * data, qint64 maxSize)
{
m_audioData.append(data, maxSize);
return maxSize;
}
void DataSource::startRecord()
{
int sampleRate = 16000;
int channels = 2;
int sampleSize = 16;
QAudioFormat formatAudio;
formatAudio.setSampleRate(sampleRate);
formatAudio.setChannelCount(channels);
formatAudio.setSampleSize(sampleSize);
formatAudio.setCodec("audio/pcm");
formatAudio.setByteOrder(QAudioFormat::LittleEndian);
formatAudio.setSampleType(QAudioFormat::UnSignedInt);
QAudioDeviceInfo inputDevices = QAudioDeviceInfo::defaultInputDevice();
memcpy(m_wavFileHead.RIFFNAME, "RIFF", 4);
memcpy(m_wavFileHead.WAVNAME, "WAVE", 4);
memcpy(m_wavFileHead.FMTNAME, "fmt ", 4);
memcpy(m_wavFileHead.DATANAME, "data", 4);
m_wavFileHead.nRIFFLength = 36;
m_wavFileHead.nFMTLength = sampleSize;
m_wavFileHead.nAudioFormat = 0x01;
m_wavFileHead.nChannleNumber = channels;
m_wavFileHead.nSampleRate = sampleRate;
m_wavFileHead.nBytesPerSecond = (sampleSize / 8) * channels * sampleRate;
m_wavFileHead.nBytesPerSample = (sampleSize / 8) * channels;
m_wavFileHead.nBitsPerSample = sampleSize;
m_wavFileHead.nDataLength = 0;
m_audioInput.reset(new QAudioInput(inputDevices, formatAudio));
m_audioInput->start(this);
}
void DataSource::stopRecord()
{
m_audioInput->stop();
}
void DataSource::saveAsWavFile()
{
QFile f("test.wav");
bool bisOk = f.open(QIODevice::WriteOnly);
if(bisOk == true)
{
m_wavFileHead.nDataLength = m_audioData.size() / 2;
f.write((char *)&m_wavFileHead, sizeof(WavFileHead));
f.write(m_audioData.data(), m_audioData.size());
f.close();
}else{
}
}
void DataSource::startPlay()
{
QAudioFormat format;
format.setSampleRate(16000);
format.setChannelCount(2);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
auto device = QAudioDeviceInfo::defaultOutputDevice();
m_audioOutput.reset(new QAudioOutput(device, format));
m_audioOutput->start(this);
}
void DataSource::stopPlay()
{
m_audioOutput->stop();
}