[haiku-commits] haiku: hrev50384 - src/kits/media src/add-ons/media/plugins/http_streamer headers/private/media

  • From: b.vitruvio@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 3 Jul 2016 15:30:36 +0200 (CEST)

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


Other related posts:

  • » [haiku-commits] haiku: hrev50384 - src/kits/media src/add-ons/media/plugins/http_streamer headers/private/media - b . vitruvio