AdapterIO: Seeking and flags access improvements

* Backend seeking is done only if explictly requested in
BAdapterIO Seek.
This commit is contained in:
Dario Casalinuovo
2016-07-03 15:28:06 +02:00
parent d3630cbaec
commit 9f2deec26f
2 changed files with 33 additions and 33 deletions
+4 -2
View File
@@ -37,7 +37,9 @@ private:
class BAdapterIO : public BMediaIO { class BAdapterIO : public BMediaIO {
public: public:
BAdapterIO(int32 flags, BAdapterIO(
int32 flags = B_MEDIA_STREAMING
| B_MEDIA_SEEKABLE,
bigtime_t timeout = B_INFINITE_TIMEOUT); bigtime_t timeout = B_INFINITE_TIMEOUT);
virtual ~BAdapterIO(); virtual ~BAdapterIO();
@@ -70,7 +72,7 @@ protected:
ssize_t BackWrite(const void* buffer, size_t size); ssize_t BackWrite(const void* buffer, size_t size);
private: private:
status_t _EvaluateWait(off_t position, off_t size); status_t _EvaluateWait(off_t pos, off_t size);
int32 fFlags; int32 fFlags;
+29 -31
View File
@@ -28,7 +28,6 @@ public:
fBuffer(buffer), fBuffer(buffer),
fTimeout(timeout) fTimeout(timeout)
{ {
fOwner->GetFlags(&fFlags);
} }
virtual ~RelativePositionIO() virtual ~RelativePositionIO()
@@ -55,7 +54,7 @@ public:
if (position < fStartOffset) if (position < fStartOffset)
return B_RESOURCE_UNAVAILABLE; return B_RESOURCE_UNAVAILABLE;
if (position > totalSize) { if (totalSize > 0 && position > totalSize) {
// This is an endless stream, we don't know // This is an endless stream, we don't know
// how much data will come and when, we could // how much data will come and when, we could
// block on that. // block on that.
@@ -157,17 +156,23 @@ public:
bool IsStreaming() const bool IsStreaming() const
{ {
return (fFlags & B_MEDIA_STREAMING) == true; int32 flags = 0;
fOwner->GetFlags(&flags);
return (flags & B_MEDIA_STREAMING) == true;
} }
bool IsMutable() const bool IsMutable() const
{ {
return (fFlags & B_MEDIA_MUTABLE_SIZE) == true; int32 flags = 0;
fOwner->GetFlags(&flags);
return (flags & B_MEDIA_MUTABLE_SIZE) == true;
} }
bool IsSeekable() const bool IsSeekable() const
{ {
return (fFlags & B_MEDIA_SEEKABLE) == true; int32 flags = 0;
fOwner->GetFlags(&flags);
return (flags & B_MEDIA_SEEKABLE) == true;
} }
private: private:
@@ -187,7 +192,6 @@ private:
off_t fStartOffset; off_t fStartOffset;
BPositionIO* fBuffer; BPositionIO* fBuffer;
int32 fFlags;
mutable RWLocker fLock; mutable RWLocker fLock;
@@ -245,12 +249,6 @@ BAdapterIO::ReadAt(off_t position, void* buffer, size_t size)
{ {
CALLED(); CALLED();
off_t totalSize = 0;
GetSize(&totalSize);
TRACE("BAdapterIO::ReadAt TS %" B_PRId64 " P %" B_PRId64
" S %" B_PRId32 "\n", totalSize, position, size);
status_t ret = _EvaluateWait(position, size); status_t ret = _EvaluateWait(position, size);
if (ret != B_OK) if (ret != B_OK)
return ret; return ret;
@@ -275,8 +273,18 @@ BAdapterIO::Seek(off_t position, uint32 seekMode)
// TODO: Support seekModes // TODO: Support seekModes
status_t ret = _EvaluateWait(position, 0); status_t ret = _EvaluateWait(position, 0);
if (ret != B_OK)
return ret; if (ret == B_RESOURCE_UNAVAILABLE && fBuffer->IsStreaming()
&& fBuffer->IsSeekable()) {
if (SeekRequested(position) != B_OK)
return B_NOT_SUPPORTED;
TRACE("BAdapterIO::Seek: Locking on backend seek\n");
acquire_sem(fSeekSem);
TRACE("BAdapterIO::Seek: Seek completed!\n");
fBuffer->ResetStartOffset(position);
} else if (ret != B_OK)
return B_NOT_SUPPORTED;
return fBuffer->Seek(position, seekMode); return fBuffer->Seek(position, seekMode);
} }
@@ -393,27 +401,17 @@ BAdapterIO::_EvaluateWait(off_t pos, off_t size)
off_t totalSize = 0; off_t totalSize = 0;
if (GetSize(&totalSize) != B_OK) if (GetSize(&totalSize) != B_OK)
TRACE("BAdapterIO::_EvaluateWait: Can't get our size!\n"); TRACE("BAdapterIO::ReadAt: Can't get our size!\n");
status_t err = fBuffer->EvaluatePosition(pos+size, totalSize); TRACE("BAdapterIO::_EvaluateWait TS %" B_PRId64 " P %" B_PRId64
" S %" B_PRId64 "\n", totalSize, pos, size);
status_t err = fBuffer->EvaluatePosition(pos, totalSize);
TRACE("BAdapterIO::_EvaluateWait: %s\n", strerror(err)); TRACE("BAdapterIO::_EvaluateWait: %s\n", strerror(err));
if (err != B_WOULD_BLOCK) { if (err != B_OK && err != B_WOULD_BLOCK)
if (err != B_RESOURCE_UNAVAILABLE && err != B_OK) return err;
return B_NOT_SUPPORTED;
if (err == B_RESOURCE_UNAVAILABLE && fBuffer->IsStreaming()
&& fBuffer->IsSeekable()) {
if (SeekRequested(pos) != B_OK)
return B_NOT_SUPPORTED;
TRACE("BAdapterIO::_EvaluateWait: Locking on seek\n");
acquire_sem(fSeekSem);
TRACE("BAdapterIO::_EvaluateWait: Seek completed\n");
fBuffer->ResetStartOffset(pos);
}
}
TRACE("BAdapterIO::_EvaluateWait: waiting for data\n"); TRACE("BAdapterIO::_EvaluateWait: waiting for data\n");