bool StreamReader::read(quint64 pos, int *length, char *buffer) { QMutexLocker lock(&m_mutex); DEBUG_BLOCK; bool ret = true; if (m_unlocked) { return ret; } if (currentPos() != pos) { if (!streamSeekable()) { return false; } setCurrentPos(pos); } if (m_buffer.capacity() < *length) { m_buffer.reserve(*length); } while (currentBufferSize() < static_cast<unsigned int>(*length)) { quint64 oldSize = currentBufferSize(); needData(); m_waitingForData.wait(&m_mutex); if (oldSize == currentBufferSize()) { if (m_eos && m_buffer.isEmpty()) { return false; } // We didn't get any more data *length = static_cast<int>(oldSize); // If we have some data to return, why tell to reader that we failed? // Remember that length argument is more like maxSize not requiredSize ret = true; } } if (m_mediaObject->state() != Phonon::BufferingState && m_mediaObject->state() != Phonon::LoadingState) { enoughData(); } memcpy(buffer, m_buffer.data(), *length); m_pos += *length; // trim the buffer by the amount read m_buffer = m_buffer.mid(*length); return ret; }
void StreamingPlayer::processBuffer( const cross::AudioSystem::BufferID id ) { readMore(); switchCurrentBuffer(); if (currentBufferSize() == 0) { // もう読み込みバッファが無い return; } cross::AudioSystem::setBufferData( id, cross::AudioSystem::format(wav_.channel(), wav_.bitPerSample()), currentBufferStorage(), currentBufferSize(), wav_.samplingRate() ); }
HRESULT read(LONGLONG pos, LONG length, BYTE *buffer, LONG *actual) { QMutexLocker locker(&m_mutexRead); if (m_mediaGraph->isStopping()) { return VFW_E_WRONG_STATE; } if(streamSize() != 1 && pos + length > streamSize()) { //it tries to read outside of the boundaries return E_FAIL; } if (currentPos() - currentBufferSize() != pos) { if (!streamSeekable()) { return S_FALSE; } setCurrentPos(pos); } int oldSize = currentBufferSize(); while (currentBufferSize() < int(length)) { needData(); if (m_mediaGraph->isStopping()) { return VFW_E_WRONG_STATE; } if (oldSize == currentBufferSize()) { break; //we didn't get any data } oldSize = currentBufferSize(); } DWORD bytesRead = qMin(currentBufferSize(), int(length)); { QWriteLocker locker(&m_lock); qMemCopy(buffer, m_buffer.data(), bytesRead); //truncate the buffer m_buffer = m_buffer.mid(bytesRead); } if (actual) { *actual = bytesRead; //initialization } return bytesRead == length ? S_OK : S_FALSE; }