Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

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

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

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

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 201 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation ([email protected])
     
    5353#include "qaudiooutput_win32_p.h"
    5454
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
     100
     101
    55102//#define DEBUG_AUDIO 1
    56103
     
    147194    for(int i = 0; i < count; i++) {
    148195        waveOutUnprepareHeader(hWaveOut,blocks, sizeof(WAVEHDR));
    149         blocks+=sizeof(WAVEHDR);
     196        blocks+;
    150197    }
    151198    HeapFree(GetProcessHeap(), 0, blockArray);
     
    205252    qDebug()<<now.second()<<"s "<<now.msec()<<"ms :open()";
    206253#endif
    207     if (!(settings.frequency() >= 8000 && settings.frequency() <= 48000)) {
     254
     255    period_size = 0;
     256
     257    if (!settings.isValid()) {
     258        qWarning("QAudioOutput: open error, invalid format.");
     259    } else if (settings.channels() <= 0) {
     260        qWarning("QAudioOutput: open error, invalid number of channels (%d).",
     261                 settings.channels());
     262    } else if (settings.sampleSize() <= 0) {
     263        qWarning("QAudioOutput: open error, invalid sample size (%d).",
     264                 settings.sampleSize());
     265    } else if (settings.frequency() < 8000 || settings.frequency() > 48000) {
     266        qWarning("QAudioOutput: open error, frequency out of range (%d).", settings.frequency());
     267    } else if (buffer_size == 0) {
     268        // Default buffer size, 200ms, default period size is 40ms
     269        buffer_size
     270                = (settings.frequency()
     271                * settings.channels()
     272                * settings.sampleSize()
     273                + 39) / 40;
     274        period_size = buffer_size / 5;
     275    } else {
     276        period_size = buffer_size / 5;
     277    }
     278
     279    if (period_size == 0) {
    208280        errorState = QAudio::OpenError;
    209281        deviceState = QAudio::StoppedState;
    210282        emit stateChanged(deviceState);
    211         qWarning("QAudioOutput: open error, frequency out of range.");
    212283        return false;
    213284    }
    214     if(buffer_size == 0) {
    215         // Default buffer size, 200ms, default period size is 40ms
    216         buffer_size = settings.frequency()*settings.channels()*(settings.sampleSize()/8)*0.2;
    217         period_size = buffer_size/5;
    218     } else {
    219         period_size = buffer_size/5;
    220     }
     285
    221286    waveBlocks = allocateBlocks(period_size, buffer_size/period_size);
    222287
     
    251316            == MMSYSERR_NOERROR) {
    252317            QString tmp;
    253             tmp = QString::fromUtf16((const unsigned short*)woc.szPname);
     318            tmp = QString*)woc.szPname);
    254319            if(tmp.compare(QLatin1String(m_device)) == 0) {
    255320                devId = ii;
     
    259324    }
    260325
    261     if(waveOutOpen(&hWaveOut, devId, &wfx,
    262                 (DWORD_PTR)&waveOutProc,
    263                 (DWORD_PTR) this,
    264                 CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
    265         errorState = QAudio::OpenError;
    266         deviceState = QAudio::StoppedState;
    267         emit stateChanged(deviceState);
    268         qWarning("QAudioOutput: open error");
    269         return false;
     326    if ( settings.channels() <= 2) {
     327        if(waveOutOpen(&hWaveOut, devId, &wfx,
     328                    (DWORD_PTR)&waveOutProc,
     329                    (DWORD_PTR) this,
     330                    CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
     331            errorState = QAudio::OpenError;
     332            deviceState = QAudio::StoppedState;
     333            emit stateChanged(deviceState);
     334            qWarning("QAudioOutput: open error");
     335            return false;
     336        }
     337    } else {
     338        WAVEFORMATEXTENSIBLE wfex;
     339        wfex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
     340        wfex.Format.nChannels = settings.channels();
     341        wfex.Format.wBitsPerSample = settings.sampleSize();
     342        wfex.Format.nSamplesPerSec = settings.frequency();
     343        wfex.Format.nBlockAlign = wfex.Format.nChannels*wfex.Format.wBitsPerSample/8;
     344        wfex.Format.nAvgBytesPerSec=wfex.Format.nSamplesPerSec*wfex.Format.nBlockAlign;
     345        wfex.Samples.wValidBitsPerSample=wfex.Format.wBitsPerSample;
     346        static const GUID _KSDATAFORMAT_SUBTYPE_PCM = {
     347             0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
     348        wfex.SubFormat=_KSDATAFORMAT_SUBTYPE_PCM;
     349        wfex.Format.cbSize=22;
     350
     351        wfex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT;
     352        if (settings.channels() >= 4)
     353            wfex.dwChannelMask |= SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT;
     354        if (settings.channels() >= 6)
     355            wfex.dwChannelMask |= SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY;
     356        if (settings.channels() == 8)
     357            wfex.dwChannelMask |= SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT;
     358
     359        if(waveOutOpen(&hWaveOut, devId, &wfex.Format,
     360                    (DWORD_PTR)&waveOutProc,
     361                    (DWORD_PTR) this,
     362                    CALLBACK_FUNCTION) != MMSYSERR_NOERROR) {
     363            errorState = QAudio::OpenError;
     364            deviceState = QAudio::StoppedState;
     365            emit stateChanged(deviceState);
     366            qWarning("QAudioOutput: open error");
     367            return false;
     368        }
    270369    }
    271370
     
    488587            }
    489588            if ( out < l) {
    490                 // Didnt write all data
     589                // Didnt write all data
    491590                audioSource->seek(audioSource->pos()-(l-out));
    492591            }
Note: See TracChangeset for help on using the changeset viewer.