Changeset 561 for trunk/src/3rdparty/phonon/ds9/qasyncreader.cpp
- Timestamp:
- Feb 11, 2010, 11:19:06 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
Property svn:mergeinfo
set to (toggle deleted branches)
/branches/vendor/nokia/qt/4.6.1 merged eligible /branches/vendor/nokia/qt/current merged eligible /branches/vendor/trolltech/qt/current 3-149
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
trunk/src/3rdparty/phonon/ds9/qasyncreader.cpp
r2 r561 15 15 along with this library. If not, see <http://www.gnu.org/licenses/>. 16 16 */ 17 18 #include <QtCore/QFile>19 17 20 18 #include "qasyncreader.h" … … 81 79 STDMETHODIMP QAsyncReader::Request(IMediaSample *sample,DWORD_PTR user) 82 80 { 83 QMutexLocker mutexLocker(&m_mutexWait); 84 QWriteLocker locker(&m_lock); 81 QMutexLocker locker(&m_mutex); 85 82 if (m_flushing) { 86 83 return VFW_E_WRONG_STATE; … … 94 91 STDMETHODIMP QAsyncReader::WaitForNext(DWORD timeout, IMediaSample **sample, DWORD_PTR *user) 95 92 { 96 QMutexLocker locker(&m_mutex Wait);93 QMutexLocker locker(&m_mutex); 97 94 if (!sample ||!user) { 98 95 return E_POINTER; 99 96 } 100 97 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 101 101 *sample = 0; 102 102 *user = 0; 103 103 104 AsyncRequest r = getNextRequest();105 106 if (r.sample == 0) {107 //there is no request in the queue108 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()) { 109 109 return VFW_E_WRONG_STATE; 110 } else {111 //First we need to lock the mutex112 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();120 110 } 121 111 } 112 113 AsyncRequest r = m_requestQueue.dequeue(); 122 114 123 115 //at this point we're sure to have a request to proceed … … 128 120 *sample = r.sample; 129 121 *user = r.user; 130 131 return SyncReadAligned(r.sample); 122 return syncReadAlignedUnlocked(r.sample); 132 123 } 133 124 134 125 STDMETHODIMP QAsyncReader::BeginFlush() 135 126 { 136 QMutexLocker mutexLocker(&m_mutexWait); 137 QWriteLocker locker(&m_lock); 127 QMutexLocker locker(&m_mutex); 138 128 m_flushing = true; 139 129 m_requestWait.wakeOne(); … … 143 133 STDMETHODIMP QAsyncReader::EndFlush() 144 134 { 145 Q WriteLocker locker(&m_lock);135 QMutexLocker locker(&m_mutex); 146 136 m_flushing = false; 147 137 return S_OK; … … 150 140 STDMETHODIMP QAsyncReader::SyncReadAligned(IMediaSample *sample) 151 141 { 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 152 157 if (!sample) { 153 158 return E_POINTER; … … 176 181 } 177 182 178 STDMETHODIMP QAsyncReader::SyncRead(LONGLONG pos, LONG length, BYTE *buffer)179 {180 return read(pos, length, buffer, 0);181 }182 183 184 //addition185 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 }195 183 } 196 184 }
Note:
See TracChangeset
for help on using the changeset viewer.