diff options
author | Kurt Korbatits <kurt.korbatits@nokia.com> | 2010-05-19 03:36:07 (GMT) |
---|---|---|
committer | Kurt Korbatits <kurt.korbatits@nokia.com> | 2010-05-19 03:36:07 (GMT) |
commit | 3464049590db1c8198fcee7d369690a7c18756cc (patch) | |
tree | fa8655dabe291882386bd9445ce09ba9345270d1 | |
parent | 93c1117b7c9d3a0142dc3d48223d27883b61cbef (diff) | |
download | Qt-3464049590db1c8198fcee7d369690a7c18756cc.zip Qt-3464049590db1c8198fcee7d369690a7c18756cc.tar.gz Qt-3464049590db1c8198fcee7d369690a7c18756cc.tar.bz2 |
QAudioDeviceInfo::nearestFormat() consistent across all platforms
Task-number:QTBUG-10760
Reviewed-by:Justin McPherson
-rw-r--r-- | src/multimedia/audio/qaudiodeviceinfo.cpp | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/src/multimedia/audio/qaudiodeviceinfo.cpp b/src/multimedia/audio/qaudiodeviceinfo.cpp index 092efc5..ae65b02 100644 --- a/src/multimedia/audio/qaudiodeviceinfo.cpp +++ b/src/multimedia/audio/qaudiodeviceinfo.cpp @@ -43,6 +43,7 @@ #include <QtMultimedia/qaudioengine.h> #include <QtMultimedia/qaudiodeviceinfo.h> +#include <QtCore/qmap.h> QT_BEGIN_NAMESPACE @@ -238,7 +239,66 @@ QAudioFormat QAudioDeviceInfo::preferredFormat() const QAudioFormat QAudioDeviceInfo::nearestFormat(const QAudioFormat &settings) const { - return isNull() ? QAudioFormat() : d->info->nearestFormat(settings); + if (isFormatSupported(settings)) + return settings; + + QAudioFormat nearest = settings; + + nearest.setCodec(QLatin1String("audio/pcm")); + + if (nearest.sampleType() == QAudioFormat::Unknown) { + QAudioFormat preferred = preferredFormat(); + nearest.setSampleType(preferred.sampleType()); + } + + QMap<int,int> testFrequencies; + QList<int> frequenciesAvailable = supportedFrequencies(); + QMap<int,int> testSampleSizes; + QList<int> sampleSizesAvailable = supportedSampleSizes(); + + // Get sorted sampleSizes (equal to and ascending values only) + if (sampleSizesAvailable.contains(settings.sampleSize())) + testSampleSizes.insert(0,settings.sampleSize()); + sampleSizesAvailable.removeAll(settings.sampleSize()); + foreach (int size, sampleSizesAvailable) { + int larger = (size > settings.sampleSize()) ? size : settings.sampleSize(); + int smaller = (size > settings.sampleSize()) ? settings.sampleSize() : size; + if (size >= settings.sampleSize()) { + int diff = larger - smaller; + testSampleSizes.insert(diff, size); + } + } + + // Get sorted frequencies (equal to and ascending values only) + if (frequenciesAvailable.contains(settings.frequency())) + testFrequencies.insert(0,settings.frequency()); + frequenciesAvailable.removeAll(settings.frequency()); + foreach (int frequency, frequenciesAvailable) { + int larger = (frequency > settings.frequency()) ? frequency : settings.frequency(); + int smaller = (frequency > settings.frequency()) ? settings.frequency() : frequency; + if (frequency >= settings.frequency()) { + int diff = larger - smaller; + testFrequencies.insert(diff, frequency); + } + } + + // Try to find nearest + // Check ascending frequencies, ascending sampleSizes + QMapIterator<int, int> sz(testSampleSizes); + while (sz.hasNext()) { + sz.next(); + nearest.setSampleSize(sz.value()); + QMapIterator<int, int> i(testFrequencies); + while (i.hasNext()) { + i.next(); + nearest.setFrequency(i.value()); + if (isFormatSupported(nearest)) + return nearest; + } + } + + //Fallback + return preferredFormat(); } /*! |