From ddf481c1bb251f8c4d2fe5e9ad6394c985f94f34 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Wed, 26 May 2021 10:29:53 +0200 Subject: Code cleanup in qwindowsaudiooutput.* Use categorized logging and clean up the code. Change-Id: I5ff4efda9814567b4e042cb81977350ba1f90781 Reviewed-by: Lars Knoll --- .../platform/windows/audio/qwindowsaudiooutput.cpp | 101 +++++++++++---------- .../platform/windows/audio/qwindowsaudiooutput_p.h | 9 +- 2 files changed, 55 insertions(+), 55 deletions(-) (limited to 'src/multimedia') diff --git a/src/multimedia/platform/windows/audio/qwindowsaudiooutput.cpp b/src/multimedia/platform/windows/audio/qwindowsaudiooutput.cpp index c35586d8e..00dcb7210 100644 --- a/src/multimedia/platform/windows/audio/qwindowsaudiooutput.cpp +++ b/src/multimedia/platform/windows/audio/qwindowsaudiooutput.cpp @@ -56,10 +56,12 @@ #include #include -//#define DEBUG_AUDIO 1 +#include QT_BEGIN_NAMESPACE +Q_LOGGING_CATEGORY(qLcAudioOutput, "qt.multimedia.audiooutput") + QWindowsAudioOutput::QWindowsAudioOutput(int deviceId) { bytesAvailable = 0; @@ -67,22 +69,16 @@ QWindowsAudioOutput::QWindowsAudioOutput(int deviceId) period_size = 0; m_deviceId = deviceId; totalTimeValue = 0; - audioBuffer = 0; errorState = QAudio::NoError; deviceState = QAudio::StoppedState; audioSource = 0; pullMode = true; - finished = false; volumeCache = qreal(1.0); blocks_count = 5; } QWindowsAudioOutput::~QWindowsAudioOutput() { - mutex.lock(); - finished = true; - mutex.unlock(); - close(); } @@ -107,7 +103,7 @@ void CALLBACK QWindowsAudioOutput::waveOutProc( HWAVEOUT hWaveOut, UINT uMsg, case WOM_CLOSE: return; case WOM_DONE: - if(qAudio->finished || qAudio->buffer_size == 0 || qAudio->period_size == 0) { + if(qAudio->buffer_size == 0 || qAudio->period_size == 0) { return; } qAudio->waveFreeBlockCount++; @@ -166,6 +162,7 @@ void QWindowsAudioOutput::setFormat(const QAudioFormat& fmt) void QWindowsAudioOutput::start(QIODevice* device) { + qCDebug(qLcAudioOutput) << "start(ioDevice)"; if(deviceState != QAudio::StoppedState) close(); @@ -185,6 +182,7 @@ void QWindowsAudioOutput::start(QIODevice* device) QIODevice* QWindowsAudioOutput::start() { + qCDebug(qLcAudioOutput) << "start()"; if(deviceState != QAudio::StoppedState) close(); @@ -207,6 +205,7 @@ QIODevice* QWindowsAudioOutput::start() void QWindowsAudioOutput::stop() { + qCDebug(qLcAudioOutput) << "stop()"; if(deviceState == QAudio::StoppedState) return; close(); @@ -219,10 +218,7 @@ void QWindowsAudioOutput::stop() bool QWindowsAudioOutput::open() { -#ifdef DEBUG_AUDIO - QTime now(QTime::currentTime()); - qDebug()< 0) { + while(len > 0) { mutex.lock(); if(waveFreeBlockCount==0) { mutex.unlock(); @@ -376,28 +377,27 @@ qint64 QWindowsAudioOutput::write( const char *data, qint64 len ) if(current->dwFlags & WHDR_PREPARED) waveOutUnprepareHeader(hWaveOut, current, sizeof(WAVEHDR)); - if(l < period_size) - remain = l; + qint64 remain; + if(len < period_size) + remain = len; else remain = period_size; if (volumeCache < qreal(1.0)) - QAudioHelperInternal::qMultiplySamples(volumeCache, settings, p, current->lpData, remain); + QAudioHelperInternal::qMultiplySamples(volumeCache, settings, data, current->lpData, remain); else - memcpy(current->lpData, p, remain); + memcpy(current->lpData, data, remain); - l -= remain; - p += remain; + len -= remain; + data += remain; current->dwBufferLength = remain; + written += remain; waveOutPrepareHeader(hWaveOut, current, sizeof(WAVEHDR)); waveOutWrite(hWaveOut, current, sizeof(WAVEHDR)); mutex.lock(); waveFreeBlockCount--; -#ifdef DEBUG_AUDIO - qDebug("write out l=%d, waveFreeBlockCount=%d", - current->dwBufferLength,waveFreeBlockCount); -#endif + qCDebug(qLcAudioOutput) << "write out" << current->dwBufferLength << "waveFreeBlockCount" << waveFreeBlockCount; mutex.unlock(); totalTimeValue += current->dwBufferLength; @@ -411,11 +411,12 @@ qint64 QWindowsAudioOutput::write( const char *data, qint64 len ) emit stateChanged(deviceState); } } - return (len-l); + return written; } void QWindowsAudioOutput::resume() { + qCDebug(qLcAudioOutput) << "resume()"; if(deviceState == QAudio::SuspendedState) { deviceState = pullMode ? QAudio::ActiveState : QAudio::IdleState; errorState = QAudio::NoError; @@ -427,6 +428,7 @@ void QWindowsAudioOutput::resume() void QWindowsAudioOutput::suspend() { + qCDebug(qLcAudioOutput) << "suspend()"; if(deviceState == QAudio::ActiveState || deviceState == QAudio::IdleState) { pauseAndSleep(); deviceState = QAudio::SuspendedState; @@ -437,29 +439,26 @@ void QWindowsAudioOutput::suspend() void QWindowsAudioOutput::feedback() { -#ifdef DEBUG_AUDIO - QTime now(QTime::currentTime()); - qDebug()<= period_size) + qCDebug(qLcAudioOutput) << "feedback()"; + bytesAvailable = waveFreeBlockCount * period_size; + + if (deviceState != QAudio::StoppedState && deviceState != QAudio::SuspendedState) { + if (bytesAvailable >= period_size) { + qCDebug(qLcAudioOutput) << " ->invoke()"; QMetaObject::invokeMethod(this, "deviceReady", Qt::QueuedConnection); + } } } bool QWindowsAudioOutput::deviceReady() { + qCDebug(qLcAudioOutput) << ">>>> deviceReady() state=" << deviceState << pullMode; + if(deviceState == QAudio::StoppedState || deviceState == QAudio::SuspendedState) return false; if(pullMode) { - int chunks = bytesAvailable/period_size; -#ifdef DEBUG_AUDIO - qDebug()<<"deviceReady() avail="<read(audioBuffer,input); if(l > 0) { - int out= write(audioBuffer,l); + int out = write(audioBuffer, l); if(out > 0) { if (deviceState != QAudio::ActiveState) { deviceState = QAudio::ActiveState; @@ -493,6 +491,8 @@ bool QWindowsAudioOutput::deviceReady() // Didn't write all data audioSource->seek(audioSource->pos()-(l-out)); } + qCDebug(qLcAudioOutput) << "wrote" << out << "bytes out of" << l << "read"; + if (startup) waveOutRestart(hWaveOut); } else if(l == 0) { @@ -532,6 +532,7 @@ bool QWindowsAudioOutput::deviceReady() } } } + qCDebug(qLcAudioOutput) << "<<<< end deviceReady() state=" << deviceState; return true; } diff --git a/src/multimedia/platform/windows/audio/qwindowsaudiooutput_p.h b/src/multimedia/platform/windows/audio/qwindowsaudiooutput_p.h index 388deab73..2219bca54 100644 --- a/src/multimedia/platform/windows/audio/qwindowsaudiooutput_p.h +++ b/src/multimedia/platform/windows/audio/qwindowsaudiooutput_p.h @@ -125,7 +125,7 @@ private: static void QT_WIN_CALLBACK waveOutProc( HWAVEOUT hWaveOut, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2 ); - QMutex mutex; + mutable QMutex mutex; WAVEHDR* allocateBlocks(int size, int count); void freeBlocks(WAVEHDR* blockArray); @@ -135,10 +135,9 @@ private: WAVEFORMATEXTENSIBLE wfx; HWAVEOUT hWaveOut; WAVEHDR* waveBlocks; - volatile bool finished; - volatile int waveFreeBlockCount; - int waveCurrentBlock; - char* audioBuffer; + int waveFreeBlockCount = 0; + int waveCurrentBlock = 0; + char *audioBuffer = nullptr; }; class OutputPrivate : public QIODevice -- cgit v1.2.3