Ignore:
Timestamp:
Aug 2, 2010, 9:27:30 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.3 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/multimedia/audio/qaudiodeviceinfo.cpp

    r651 r769  
    4444#include <QtMultimedia/qaudiodeviceinfo.h>
    4545
     46#include <QtCore/qmap.h>
    4647
    4748QT_BEGIN_NAMESPACE
     
    239240QAudioFormat QAudioDeviceInfo::nearestFormat(const QAudioFormat &settings) const
    240241{
    241     return isNull() ? QAudioFormat() : d->info->nearestFormat(settings);
     242    if (isFormatSupported(settings))
     243        return settings;
     244
     245    QAudioFormat nearest = settings;
     246
     247    nearest.setCodec(QLatin1String("audio/pcm"));
     248
     249    if (nearest.sampleType() == QAudioFormat::Unknown) {
     250        QAudioFormat preferred = preferredFormat();
     251        nearest.setSampleType(preferred.sampleType());
     252    }
     253
     254    QMap<int,int> testFrequencies;
     255    QList<int> frequenciesAvailable = supportedFrequencies();
     256    QMap<int,int> testSampleSizes;
     257    QList<int> sampleSizesAvailable = supportedSampleSizes();
     258
     259    // Get sorted sampleSizes (equal to and ascending values only)
     260    if (sampleSizesAvailable.contains(settings.sampleSize()))
     261        testSampleSizes.insert(0,settings.sampleSize());
     262    sampleSizesAvailable.removeAll(settings.sampleSize());
     263    foreach (int size, sampleSizesAvailable) {
     264        int larger  = (size > settings.sampleSize()) ? size : settings.sampleSize();
     265        int smaller = (size > settings.sampleSize()) ? settings.sampleSize() : size;
     266        if (size >= settings.sampleSize()) {
     267            int diff = larger - smaller;
     268            testSampleSizes.insert(diff, size);
     269        }
     270    }
     271
     272    // Get sorted frequencies (equal to and ascending values only)
     273    if (frequenciesAvailable.contains(settings.frequency()))
     274        testFrequencies.insert(0,settings.frequency());
     275    frequenciesAvailable.removeAll(settings.frequency());
     276    foreach (int frequency, frequenciesAvailable) {
     277        int larger  = (frequency > settings.frequency()) ? frequency : settings.frequency();
     278        int smaller = (frequency > settings.frequency()) ? settings.frequency() : frequency;
     279        if (frequency >= settings.frequency()) {
     280            int diff = larger - smaller;
     281            testFrequencies.insert(diff, frequency);
     282        }
     283    }
     284
     285    // Try to find nearest
     286    // Check ascending frequencies, ascending sampleSizes
     287    QMapIterator<int, int> sz(testSampleSizes);
     288    while (sz.hasNext()) {
     289        sz.next();
     290        nearest.setSampleSize(sz.value());
     291        QMapIterator<int, int> i(testFrequencies);
     292        while (i.hasNext()) {
     293            i.next();
     294            nearest.setFrequency(i.value());
     295            if (isFormatSupported(nearest))
     296                return nearest;
     297        }
     298    }
     299
     300    //Fallback
     301    return preferredFormat();
    242302}
    243303
Note: See TracChangeset for help on using the changeset viewer.