|
|
@@ -141,7 +141,6 @@ QtAudioCapturer::QtAudioCapturer(QObject* parent)
|
|
|
: QObject(parent)
|
|
|
, m_deviceType(Microphone)
|
|
|
, m_isRunning(false)
|
|
|
- , m_audioDevice(nullptr)
|
|
|
{
|
|
|
// 初始化缓冲区
|
|
|
m_buffer.open(QIODevice::ReadWrite);
|
|
|
@@ -181,14 +180,20 @@ bool QtAudioCapturer::Start()
|
|
|
<< (m_deviceType == Microphone ? "麦克风" : "扬声器");
|
|
|
|
|
|
if (m_deviceType == Microphone && m_audioInput) {
|
|
|
- m_audioDevice = m_audioInput->start();
|
|
|
- if (!m_audioDevice) {
|
|
|
- qWarning() << "QtAudioCapturer::Start - 启动音频输入失败";
|
|
|
- return false;
|
|
|
- }
|
|
|
+ m_buffer.buffer().clear();
|
|
|
+ m_buffer.seek(0);
|
|
|
+ m_audioInput->start(&m_buffer); // 使用push模式,将数据写入m_buffer
|
|
|
+
|
|
|
qDebug() << "QtAudioCapturer::Start - QAudioInput state:" << m_audioInput->state();
|
|
|
qDebug() << "QtAudioCapturer::Start - QAudioInput error:" << m_audioInput->error();
|
|
|
- connect(m_audioDevice, &QIODevice::readyRead, this, &QtAudioCapturer::handleReadyRead);
|
|
|
+
|
|
|
+ if (m_audioInput->error() != QAudio::NoError) {
|
|
|
+ qWarning() << "QtAudioCapturer::Start - 启动音频输入失败, error:"
|
|
|
+ << m_audioInput->error();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ m_processTimer.start(20); // 启动定时器来处理m_buffer中的数据
|
|
|
}
|
|
|
m_isRunning = true;
|
|
|
return true;
|
|
|
@@ -202,17 +207,15 @@ void QtAudioCapturer::Stop()
|
|
|
|
|
|
m_processTimer.stop();
|
|
|
|
|
|
- if (m_audioDevice) {
|
|
|
- disconnect(m_audioDevice, &QIODevice::readyRead, this, &QtAudioCapturer::handleReadyRead);
|
|
|
- m_audioDevice = nullptr;
|
|
|
- }
|
|
|
-
|
|
|
if (m_audioInput) {
|
|
|
- m_audioInput->stop();
|
|
|
+ if (m_audioInput->state() != QAudio::StoppedState) {
|
|
|
+ m_audioInput->stop();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
m_buffer.buffer().clear();
|
|
|
m_buffer.seek(0);
|
|
|
+ m_dataBuffer.clear();
|
|
|
m_isRunning = false;
|
|
|
}
|
|
|
|
|
|
@@ -221,25 +224,11 @@ const AudioFormat& QtAudioCapturer::GetFormat() const
|
|
|
return m_audioFormat;
|
|
|
}
|
|
|
|
|
|
-void QtAudioCapturer::handleReadyRead()
|
|
|
-{
|
|
|
- //qDebug() << "handleReadyRead called, m_audioDevice:" << m_audioDevice;
|
|
|
- if (m_audioDevice) {
|
|
|
- QByteArray data = m_audioDevice->readAll();
|
|
|
- //qDebug() << "handleReadyRead: read data size:" << data.size();
|
|
|
- if (data.size() > 0) {
|
|
|
- QMutexLocker locker(&m_mutex);
|
|
|
- m_dataBuffer.append(data);
|
|
|
- //qDebug() << "Audio data appended, buffer size now:" << m_dataBuffer.size();
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
int QtAudioCapturer::readAudioData(char* buf, int maxLen)
|
|
|
{
|
|
|
QMutexLocker locker(&m_mutex);
|
|
|
int toRead = qMin(maxLen, m_dataBuffer.size());
|
|
|
- // qDebug() << "readAudioData called, buffer size:" << m_dataBuffer.size() << ", toRead:" << toRead;
|
|
|
+ qDebug() << "[readAudioData] toRead=" << toRead << ", m_dataBuffer.size()=" << m_dataBuffer.size();
|
|
|
if (toRead > 0) {
|
|
|
memcpy(buf, m_dataBuffer.constData(), toRead);
|
|
|
m_dataBuffer.remove(0, toRead);
|
|
|
@@ -249,38 +238,17 @@ int QtAudioCapturer::readAudioData(char* buf, int maxLen)
|
|
|
|
|
|
void QtAudioCapturer::processAudioData()
|
|
|
{
|
|
|
- QByteArray data = m_buffer.buffer();
|
|
|
- if (data.size() > 0) {
|
|
|
- // qDebug() << "QtAudioCapturer::processAudioData - 处理缓冲区数据,大小:" << data.size()
|
|
|
- // << "字节";
|
|
|
-
|
|
|
- // 清空缓冲区
|
|
|
+ int bufSize = m_buffer.size();
|
|
|
+ qDebug() << "[processAudioData] m_buffer.size()=" << bufSize << ", m_dataBuffer.size()=" << m_dataBuffer.size();
|
|
|
+ // 定时器触发,将m_buffer中的数据转移到m_dataBuffer,以供readAudioData消费
|
|
|
+ if (bufSize > 0) {
|
|
|
+ QMutexLocker locker(&m_mutex);
|
|
|
+ m_dataBuffer.append(m_buffer.buffer());
|
|
|
m_buffer.buffer().clear();
|
|
|
m_buffer.seek(0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void QtAudioCapturer::onAudioNotify()
|
|
|
-{
|
|
|
- if (m_audioDevice && m_audioDevice->bytesAvailable() > 0) {
|
|
|
- handleReadyRead();
|
|
|
- } else {
|
|
|
- // 尝试直接从 QAudioInput 读取数据
|
|
|
- QByteArray buffer(m_audioInput->bufferSize() / 4, 0);
|
|
|
- qint64 len = buffer.size();
|
|
|
-
|
|
|
- if (len > 0) {
|
|
|
- qDebug() << "QtAudioCapturer::onAudioNotify - 直接读取到数据,大小:" << len << "字节";
|
|
|
- buffer.resize(len);
|
|
|
-
|
|
|
- // 调用回调函数
|
|
|
- // if (m_callback) {
|
|
|
- // m_callback(buffer.data(), buffer.size(), m_userInfo);
|
|
|
- // }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
bool QtAudioCapturer::initMicrophone()
|
|
|
{
|
|
|
qDebug() << "QtAudioCapturer::initMicrophone - 默认输入设备: "
|