void CSteeringManager::Seek(XMFLOAT3 target, float slowDist) { XMVECTOR steering = XMLoadFloat3(&m_vSteering); XMVECTOR force = XMLoadFloat3(&DoSeek(target, slowDist)); steering += force; XMStoreFloat3(&m_vSteering, steering); }
bool Stream::Seek(Signal &sig, long offset, SeekMode seekMode) { size_t offsetPrev = _offsetCur; if (seekMode == SeekSet) { _offsetCur = static_cast<size_t>(offset); } else if (seekMode == SeekCur) { _offsetCur = _offsetCur + offset; } else if (seekMode == SeekEnd) { _offsetCur = DoGetSize(); if (offset < 0 && _offsetCur < static_cast<size_t>(-offset)) { sig.SetError(ERR_IOError, "seek error"); return false; } } else { // this must not happen because illegal value has to be rejected before. return false; } if (_peek.buff == nullptr) return DoSeek(sig, offset, offsetPrev, seekMode); if (_offsetCur < offsetPrev) { size_t bytesPeeked = _peek.bytes; if (_peek.offsetRead >= offsetPrev - _offsetCur) { _peek.offsetRead -= (offsetPrev - _offsetCur); return true; } delete[] _peek.buff; _peek.buff = nullptr; _peek.bytes = 0; _peek.offsetRead = 0; if (seekMode == SeekSet) return DoSeek(sig, offset, offsetPrev, SeekSet); offset -= static_cast<long>(bytesPeeked); return DoSeek(sig, offset, offsetPrev, SeekCur); } else { if (_peek.offsetRead + _offsetCur - offsetPrev <= _peek.bytes) { _peek.offsetRead += _offsetCur - offsetPrev; return true; } size_t bytesTrail = _peek.bytes - _peek.offsetRead; delete[] _peek.buff; _peek.buff = nullptr; _peek.bytes = 0; _peek.offsetRead = 0; if (seekMode == SeekSet) return DoSeek(sig, offset, offsetPrev, SeekSet); offset -= static_cast<long>(bytesTrail); return DoSeek(sig, offset, offsetPrev, SeekCur); } }
nsRefPtr<MediaDecoder::SeekPromise> AudioOffloadPlayer::Seek(SeekTarget aTarget) { MOZ_ASSERT(NS_IsMainThread()); android::Mutex::Autolock autoLock(mLock); mSeekPromise.RejectIfExists(true, __func__); mSeekTarget = aTarget; nsRefPtr<MediaDecoder::SeekPromise> p = mSeekPromise.Ensure(__func__); DoSeek(); return p; }
status_t AudioOffloadPlayer::Play() { MOZ_ASSERT(NS_IsMainThread()); if (mResetTimer) { mResetTimer->Cancel(); mResetTimer = nullptr; WakeLockRelease(); } status_t err = OK; if (!mStarted) { // Last pause timed out and offloaded audio sink was reset. Start it again err = Start(false); if (err != OK) { return err; } // Seek to last play position only when there was no seek during last pause android::Mutex::Autolock autoLock(mLock); if (!mSeekTarget.IsValid()) { mSeekTarget = SeekTarget(mPositionTimeMediaUs, SeekTarget::Accurate, MediaDecoderEventVisibility::Suppressed); DoSeek(); } } if (!mPlaying) { CHECK(mAudioSink.get()); err = mAudioSink->Start(); if (err == OK) { mPlaying = true; } } return err; }