summaryrefslogtreecommitdiffstats
path: root/examples/multimedia/spectrum/app/engine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/multimedia/spectrum/app/engine.cpp')
-rw-r--r--examples/multimedia/spectrum/app/engine.cpp79
1 files changed, 23 insertions, 56 deletions
diff --git a/examples/multimedia/spectrum/app/engine.cpp b/examples/multimedia/spectrum/app/engine.cpp
index 8977f85cd..7c678333d 100644
--- a/examples/multimedia/spectrum/app/engine.cpp
+++ b/examples/multimedia/spectrum/app/engine.cpp
@@ -155,7 +155,7 @@ bool Engine::loadFile(const QString &fileName)
Q_ASSERT(!fileName.isEmpty());
m_file = new WavFile(this);
if (m_file->open(fileName)) {
- if (isPCMS16LE(m_file->fileFormat())) {
+ if (m_file->fileFormat().sampleFormat() == QAudioFormat::Int16) {
result = initialize();
} else {
emit errorMessage(tr("Audio format not supported"),
@@ -333,7 +333,7 @@ void Engine::audioNotify()
{
switch (m_mode) {
case QAudio::AudioInput: {
- const qint64 recordPosition = qMin(m_bufferLength, audioLength(m_format, m_audioInput->processedUSecs()));
+ const qint64 recordPosition = qMin(m_bufferLength, m_format.bytesForDuration(m_audioInput->processedUSecs()));
setRecordPosition(recordPosition);
const qint64 levelPosition = m_dataLength - m_levelBufferLength;
if (levelPosition >= 0)
@@ -346,7 +346,7 @@ void Engine::audioNotify()
}
break;
case QAudio::AudioOutput: {
- const qint64 playPosition = audioLength(m_format, m_audioOutput->processedUSecs());
+ const qint64 playPosition = m_format.bytesForDuration(m_audioOutput->processedUSecs());
setPlayPosition(qMin(bufferLength(), playPosition));
const qint64 levelPosition = playPosition - m_levelBufferLength;
const qint64 spectrumPosition = playPosition - m_spectrumBufferLength;
@@ -359,7 +359,7 @@ void Engine::audioNotify()
// Data needs to be read into m_buffer in order to be analysed
const qint64 readPos = qMax(qint64(0), qMin(levelPosition, spectrumPosition));
const qint64 readEnd = qMin(m_analysisFile->size(), qMax(levelPosition + m_levelBufferLength, spectrumPosition + m_spectrumBufferLength));
- const qint64 readLen = readEnd - readPos + audioLength(m_format, WaveformWindowDuration);
+ const qint64 readLen = readEnd - readPos + m_format.bytesForDuration(WaveformWindowDuration);
qDebug() << "Engine::audioNotify [1]"
<< "analysisFileSize" << m_analysisFile->size()
<< "readPos" << readPos
@@ -494,7 +494,7 @@ bool Engine::initialize()
setRecordPosition(bufferLength());
result = true;
} else {
- m_bufferLength = audioLength(m_format, BufferDurationUs);
+ m_bufferLength = m_format.bytesForDuration(BufferDurationUs);
m_buffer.resize(m_bufferLength);
m_buffer.fill(0);
emit bufferLengthChanged(bufferLength());
@@ -555,56 +555,24 @@ bool Engine::selectFormat()
}
} else {
- QList<int> sampleRatesList;
- #ifdef Q_OS_WIN
- // The Windows audio backend does not correctly report format support
- // (see QTBUG-9100). Furthermore, although the audio subsystem captures
- // at 11025Hz, the resulting audio is corrupted.
- sampleRatesList += 8000;
- #endif
-
- if (!m_generateTone)
- sampleRatesList += m_audioInputDevice.supportedSampleRates();
-
- sampleRatesList += m_audioOutputDevice.supportedSampleRates();
- std::sort(sampleRatesList.begin(), sampleRatesList.end());
- const auto uniqueRatesEnd = std::unique(sampleRatesList.begin(), sampleRatesList.end());
- sampleRatesList.erase(uniqueRatesEnd, sampleRatesList.end());
- ENGINE_DEBUG << "Engine::initialize frequenciesList" << sampleRatesList;
-
- QList<int> channelsList;
- channelsList += m_audioInputDevice.supportedChannelCounts();
- channelsList += m_audioOutputDevice.supportedChannelCounts();
- std::sort(channelsList.begin(), channelsList.end());
- const auto uniqueChannelsEnd = std::unique(channelsList.begin(), channelsList.end());
- channelsList.erase(uniqueChannelsEnd, channelsList.end());
- ENGINE_DEBUG << "Engine::initialize channelsList" << channelsList;
+ QAudioDeviceInfo::Range sampleRange = m_audioInputDevice.supportedSampleRates();
+ QAudioDeviceInfo::Range outputSampleRange = m_audioOutputDevice.supportedSampleRates();
+ if (sampleRange.minimum < outputSampleRange.minimum)
+ sampleRange.minimum = outputSampleRange.minimum;
+ if (sampleRange.maximum > outputSampleRange.maximum)
+ sampleRange.maximum = outputSampleRange.maximum;
- QAudioFormat format;
- format.setByteOrder(QAudioFormat::LittleEndian);
- format.setSampleSize(16);
- format.setSampleType(QAudioFormat::SignedInt);
- for (int sampleRate : qAsConst(sampleRatesList)) {
- if (foundSupportedFormat)
- break;
- format.setSampleRate(sampleRate);
- for (int channels : qAsConst(channelsList)) {
- format.setChannelCount(channels);
- const bool inputSupport = m_generateTone ||
- m_audioInputDevice.isFormatSupported(format);
- const bool outputSupport = m_audioOutputDevice.isFormatSupported(format);
- ENGINE_DEBUG << "Engine::initialize checking " << format
- << "input" << inputSupport
- << "output" << outputSupport;
- if (inputSupport && outputSupport) {
- foundSupportedFormat = true;
- break;
- }
- }
- }
+ QAudioDeviceInfo::Range channelRange = m_audioInputDevice.supportedChannelCounts();
+ QAudioDeviceInfo::Range outputChannelRange = m_audioOutputDevice.supportedChannelCounts();
+ if (channelRange.minimum < outputChannelRange.minimum)
+ channelRange.minimum = outputChannelRange.minimum;
+ if (channelRange.maximum > outputChannelRange.maximum)
+ channelRange.maximum = outputChannelRange.maximum;
- if (!foundSupportedFormat)
- format = QAudioFormat();
+ QAudioFormat format;
+ format.setSampleFormat(QAudioFormat::Int16);
+ format.setSampleRate(qBound(sampleRange.minimum, 48000, sampleRange.maximum));
+ format.setChannelCount(qBound(channelRange.minimum, 2, channelRange.maximum));
setFormat(format);
}
@@ -728,9 +696,8 @@ void Engine::setFormat(const QAudioFormat &format)
{
const bool changed = (format != m_format);
m_format = format;
- m_levelBufferLength = audioLength(m_format, LevelWindowUs);
- m_spectrumBufferLength = SpectrumLengthSamples *
- (m_format.sampleSize() / 8) * m_format.channelCount();
+ m_levelBufferLength = m_format.bytesForDuration(LevelWindowUs);
+ m_spectrumBufferLength = SpectrumLengthSamples * format.bytesPerFrame();
if (changed)
emit formatChanged(m_format);
}