Ignore:
Timestamp:
Feb 11, 2010, 11:19:06 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.1 sources.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/3rdparty/phonon/ds9/qasyncreader.cpp

    r2 r561  
    1515along with this library.  If not, see <http://www.gnu.org/licenses/>.
    1616*/
    17 
    18 #include <QtCore/QFile>
    1917
    2018#include "qasyncreader.h"
     
    8179        STDMETHODIMP QAsyncReader::Request(IMediaSample *sample,DWORD_PTR user)
    8280        {
    83             QMutexLocker mutexLocker(&m_mutexWait);
    84             QWriteLocker locker(&m_lock);
     81            QMutexLocker locker(&m_mutex);
    8582            if (m_flushing) {
    8683                return VFW_E_WRONG_STATE;
     
    9491        STDMETHODIMP QAsyncReader::WaitForNext(DWORD timeout, IMediaSample **sample, DWORD_PTR *user)
    9592        {
    96             QMutexLocker locker(&m_mutexWait);
     93            QMutexLocker locker(&m_mutex);
    9794            if (!sample ||!user) {
    9895                return E_POINTER;
    9996            }
    10097
     98            //msdn says to return immediately if we're flushing but that doesn't seem to be true
     99            //since it triggers a dead-lock somewhere inside directshow (see task 258830)
     100
    101101            *sample = 0;
    102102            *user = 0;
    103103
    104             AsyncRequest r = getNextRequest();
    105 
    106             if (r.sample == 0) {
    107                 //there is no request in the queue
    108                 if (isFlushing()) {
     104            if (m_requestQueue.isEmpty()) {
     105                if (m_requestWait.wait(&m_mutex, timeout) == false) {
     106                    return VFW_E_TIMEOUT;
     107                }
     108                if (m_requestQueue.isEmpty()) {
    109109                    return VFW_E_WRONG_STATE;
    110                 } else {
    111                     //First we need to lock the mutex
    112                     if (m_requestWait.wait(&m_mutexWait, timeout) == false) {
    113                         return VFW_E_TIMEOUT;
    114                     }
    115                     if (isFlushing()) {
    116                         return VFW_E_WRONG_STATE;
    117                     }
    118 
    119                     r = getNextRequest();
    120110                }
    121111            }
     112
     113            AsyncRequest r = m_requestQueue.dequeue();
    122114
    123115            //at this point we're sure to have a request to proceed
     
    128120            *sample = r.sample;
    129121            *user = r.user;
    130 
    131             return SyncReadAligned(r.sample);
     122            return syncReadAlignedUnlocked(r.sample);
    132123        }
    133124
    134125        STDMETHODIMP QAsyncReader::BeginFlush()
    135126        {
    136             QMutexLocker mutexLocker(&m_mutexWait);
    137             QWriteLocker locker(&m_lock);
     127            QMutexLocker locker(&m_mutex);
    138128            m_flushing = true;
    139129            m_requestWait.wakeOne();
     
    143133        STDMETHODIMP QAsyncReader::EndFlush()
    144134        {
    145             QWriteLocker locker(&m_lock);
     135            QMutexLocker locker(&m_mutex);
    146136            m_flushing = false;
    147137            return S_OK;
     
    150140        STDMETHODIMP QAsyncReader::SyncReadAligned(IMediaSample *sample)
    151141        {
     142            QMutexLocker locker(&m_mutex);
     143            return syncReadAlignedUnlocked(sample);
     144        }
     145
     146        STDMETHODIMP QAsyncReader::SyncRead(LONGLONG pos, LONG length, BYTE *buffer)
     147        {
     148            QMutexLocker locker(&m_mutex);
     149            return read(pos, length, buffer, 0);
     150        }
     151
     152
     153        STDMETHODIMP QAsyncReader::syncReadAlignedUnlocked(IMediaSample *sample)
     154        {
     155            Q_ASSERT(!m_mutex.tryLock());
     156
    152157            if (!sample) {
    153158                return E_POINTER;
     
    176181        }
    177182
    178         STDMETHODIMP QAsyncReader::SyncRead(LONGLONG pos, LONG length, BYTE *buffer)
    179         {
    180             return read(pos, length, buffer, 0);
    181         }
    182 
    183 
    184         //addition
    185         QAsyncReader::AsyncRequest QAsyncReader::getNextRequest()
    186         {
    187             QWriteLocker locker(&m_lock);
    188             AsyncRequest ret;
    189             if (!m_requestQueue.isEmpty()) {
    190                 ret = m_requestQueue.dequeue();
    191             }
    192 
    193             return ret;
    194         }
    195183    }
    196184}
Note: See TracChangeset for help on using the changeset viewer.