hrev50384 adds 2 changesets to branch 'master'
old head: d3630cbaecc65a75b841479655699294b24c99a9
new head: b4e751b890320dec0f64237a10a4d8f7e61a340f
overview:
http://cgit.haiku-os.org/haiku/log/?qt=range&q=b4e751b89032+%5Ed3630cbaecc6
----------------------------------------------------------------------------
9f2deec26f8e: AdapterIO: Seeking and flags access improvements
* Backend seeking is done only if explictly requested in
BAdapterIO Seek.
b4e751b89032: http_streamer: Mutable flag is chosen at runtime
* BeOS Radio now works.
[ Dario Casalinuovo <b.vitruvio@xxxxxxxxx> ]
----------------------------------------------------------------------------
4 files changed, 55 insertions(+), 48 deletions(-)
headers/private/media/AdapterIO.h | 6 +-
.../media/plugins/http_streamer/HTTPMediaIO.cpp | 33 ++++++-----
.../media/plugins/http_streamer/HTTPMediaIO.h | 4 +-
src/kits/media/AdapterIO.cpp | 60 ++++++++++----------
############################################################################
Commit: 9f2deec26f8e71897a806c5c4965172322c8d496
URL: http://cgit.haiku-os.org/haiku/commit/?id=9f2deec26f8e
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Sun Jul 3 13:24:19 2016 UTC
AdapterIO: Seeking and flags access improvements
* Backend seeking is done only if explictly requested in
BAdapterIO Seek.
----------------------------------------------------------------------------
diff --git a/headers/private/media/AdapterIO.h
b/headers/private/media/AdapterIO.h
index 0dd9c41..f13b256 100644
--- a/headers/private/media/AdapterIO.h
+++ b/headers/private/media/AdapterIO.h
@@ -37,7 +37,9 @@ private:
class BAdapterIO : public BMediaIO {
public:
-
BAdapterIO(int32 flags,
+
BAdapterIO(
+
int32 flags = B_MEDIA_STREAMING
+
| B_MEDIA_SEEKABLE,
bigtime_t timeout = B_INFINITE_TIMEOUT);
virtual ~BAdapterIO();
@@ -70,7 +72,7 @@ protected:
ssize_t BackWrite(const
void* buffer, size_t size);
private:
- status_t
_EvaluateWait(off_t position, off_t size);
+ status_t
_EvaluateWait(off_t pos, off_t size);
int32 fFlags;
diff --git a/src/kits/media/AdapterIO.cpp b/src/kits/media/AdapterIO.cpp
index 751dead..1c38ca2 100644
--- a/src/kits/media/AdapterIO.cpp
+++ b/src/kits/media/AdapterIO.cpp
@@ -28,7 +28,6 @@ public:
fBuffer(buffer),
fTimeout(timeout)
{
- fOwner->GetFlags(&fFlags);
}
virtual ~RelativePositionIO()
@@ -55,7 +54,7 @@ public:
if (position < fStartOffset)
return B_RESOURCE_UNAVAILABLE;
- if (position > totalSize) {
+ if (totalSize > 0 && position > totalSize) {
// This is an endless stream, we don't know
// how much data will come and when, we could
// block on that.
@@ -157,17 +156,23 @@ public:
bool IsStreaming() const
{
- return (fFlags & B_MEDIA_STREAMING) == true;
+ int32 flags = 0;
+ fOwner->GetFlags(&flags);
+ return (flags & B_MEDIA_STREAMING) == true;
}
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
{
- return (fFlags & B_MEDIA_SEEKABLE) == true;
+ int32 flags = 0;
+ fOwner->GetFlags(&flags);
+ return (flags & B_MEDIA_SEEKABLE) == true;
}
private:
@@ -187,7 +192,6 @@ private:
off_t fStartOffset;
BPositionIO* fBuffer;
- int32 fFlags;
mutable RWLocker fLock;
@@ -245,12 +249,6 @@ BAdapterIO::ReadAt(off_t position, void* buffer, size_t
size)
{
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);
if (ret != B_OK)
return ret;
@@ -275,8 +273,18 @@ BAdapterIO::Seek(off_t position, uint32 seekMode)
// TODO: Support seekModes
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);
}
@@ -393,27 +401,17 @@ BAdapterIO::_EvaluateWait(off_t pos, off_t size)
off_t totalSize = 0;
if (GetSize(&totalSize) != B_OK)
- TRACE("BAdapterIO::_EvaluateWait: Can't get our size!\n");
-
- status_t err = fBuffer->EvaluatePosition(pos+size, totalSize);
+ TRACE("BAdapterIO::ReadAt: Can't get our size!\n");
- TRACE("BAdapterIO::_EvaluateWait: %s\n", strerror(err));
+ TRACE("BAdapterIO::_EvaluateWait TS %" B_PRId64 " P %" B_PRId64
+ " S %" B_PRId64 "\n", totalSize, pos, size);
- if (err != B_WOULD_BLOCK) {
- if (err != B_RESOURCE_UNAVAILABLE && err != B_OK)
- return B_NOT_SUPPORTED;
+ status_t err = fBuffer->EvaluatePosition(pos, totalSize);
- if (err == B_RESOURCE_UNAVAILABLE && fBuffer->IsStreaming()
- && fBuffer->IsSeekable()) {
- if (SeekRequested(pos) != B_OK)
- return B_NOT_SUPPORTED;
+ TRACE("BAdapterIO::_EvaluateWait: %s\n", strerror(err));
- TRACE("BAdapterIO::_EvaluateWait: Locking on seek\n");
- acquire_sem(fSeekSem);
- TRACE("BAdapterIO::_EvaluateWait: Seek completed\n");
- fBuffer->ResetStartOffset(pos);
- }
- }
+ if (err != B_OK && err != B_WOULD_BLOCK)
+ return err;
TRACE("BAdapterIO::_EvaluateWait: waiting for data\n");
############################################################################
Revision: hrev50384
Commit: b4e751b890320dec0f64237a10a4d8f7e61a340f
URL: http://cgit.haiku-os.org/haiku/commit/?id=b4e751b89032
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Sun Jul 3 13:25:42 2016 UTC
http_streamer: Mutable flag is chosen at runtime
* BeOS Radio now works.
----------------------------------------------------------------------------
diff --git a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp
b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp
index 98ddecd..ae32db0 100644
--- a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp
+++ b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp
@@ -81,12 +81,12 @@ private:
HTTPMediaIO::HTTPMediaIO(BUrl url)
:
- BAdapterIO(B_MEDIA_STREAMING | B_MEDIA_SEEK_BACKWARD, HTTP_TIMEOUT),
+ BAdapterIO(HTTP_TIMEOUT),
fContext(NULL),
fReq(NULL),
fListener(NULL),
fUrl(url),
- fTotalSize(0)
+ fIsMutable(false)
{
}
@@ -96,28 +96,26 @@ HTTPMediaIO::~HTTPMediaIO()
}
-ssize_t
-HTTPMediaIO::WriteAt(off_t position, const void* buffer, size_t size)
+void
+HTTPMediaIO::GetFlags(int32* flags) const
{
- return B_NOT_SUPPORTED;
+ *flags = B_MEDIA_STREAMING | B_MEDIA_SEEK_BACKWARD;
+ if (fIsMutable)
+ *flags = *flags | B_MEDIA_MUTABLE_SIZE;
}
-status_t
-HTTPMediaIO::SetSize(off_t size)
+ssize_t
+HTTPMediaIO::WriteAt(off_t position, const void* buffer, size_t size)
{
return B_NOT_SUPPORTED;
}
status_t
-HTTPMediaIO::GetSize(off_t* size) const
+HTTPMediaIO::SetSize(off_t size)
{
- if (fReq == NULL)
- return B_ERROR;
-
- *size = fTotalSize;
- return B_OK;
+ return B_NOT_SUPPORTED;
}
@@ -142,7 +140,14 @@ HTTPMediaIO::Open()
if (ret != B_OK)
return ret;
- fTotalSize = fReq->Result().Length();
+ off_t totalSize = fReq->Result().Length();
+
+ // At this point we decide if our size is fixed or mutable,
+ // this will change the behavior of our parent.
+ if (totalSize > 0)
+ BAdapterIO::SetSize(totalSize);
+ else
+ fIsMutable = true;
return BAdapterIO::Open();
}
diff --git a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h
b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h
index 1367e69..fa5f0b1 100644
--- a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h
+++ b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h
@@ -20,11 +20,12 @@ public:
HTTPMediaIO(BUrl url);
virtual
~HTTPMediaIO();
+ virtual void GetFlags(int32*
flags) const;
+
virtual ssize_t WriteAt(off_t
position,
const void* buffer, size_t size);
virtual status_t SetSize(off_t
size);
- virtual status_t GetSize(off_t*
size) const;
virtual status_t Open();
virtual void Close();
@@ -39,6 +40,7 @@ private:
BUrl fUrl;
off_t
fTotalSize;
+ bool
fIsMutable;
};
#endif