24,855
社区成员
发帖
与我相关
我的任务
分享
QAudioOutput *m_audioOutput;
RepletQIODevice *m_audioListenFile;
这是我重新实现的readData函数。
qint64 RepletQIODevice::readData(char *data, qint64 maxlen)
{
memset(data, 0, maxlen);
m_mutex.lock();
if (listenArray.size() < maxlen) {
maxlen = listenArray.size();
}
if (maxlen > 0) {
memcpy(data, listenArray.left(maxlen).data(), maxlen);
listenArray.remove(0, maxlen);
}
m_mutex.unlock();
return maxlen;
}
下面是我自己的音频数据的回调,会不断的有音频数据过来。
int Widget::AudioDataCallBack(char *pDataBuf, int nSize)
{
if (m_audioOutput != NULL && m_audioOutput->state() != QAudio::StoppedState) {
m_audioListenFile->listenWriteData(pDataBuf, nSize);
}
}
每次过来的数据,我都追加到listenArray
int RepletQIODevice::listenWriteData(const char *data, qint64 maxlen)
{
m_mutex.lock();
listenArray.append(data, maxlen);
m_mutex.unlock();
}
void Widget::startListen()
{
QAudioFormat format;
format.setSampleRate(8000);
format.setChannels(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::BigEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(format)) {
format = info.nearestFormat(format);
}
if (m_audioOutput == NULL) {
m_audioOutput = new QAudioOutput(format, this);
m_audioOutput->setBufferSize(640);
}
if (m_audioListenFile == NULL) {
m_audioListenFile = new RepletQIODevice( "mylisten");
m_audioListenFile->open(QIODevice::ReadOnly);
}
m_audioOutput->start(m_audioListenFile);
}
void Widget::stopListen()
{
if (m_audioOutput != NULL) {
if (m_audioOutput->state() != QAudio::StoppedState) {
m_audioOutput->stop();//若这时候回调是没有数据过来的话,即listenArray的数据长度为0时,程序就会死掉。。。
}
delete m_audioOutput;
m_audioOutput = NULL;
}
if (m_audioListenFile != NULL) {
listenArray.clear();
m_audioListenFile->close();
delete m_audioListenFile;
m_audioListenFile = NULL;
}
}