BMediaIOWrapper: Refer on fallback buffer Position()

* Write the data into the fallback buffer when emulating
pseudo seeked writes.
This commit is contained in:
Dario Casalinuovo
2016-03-25 22:04:53 +01:00
parent deb9166054
commit ef167f1150
+18 -15
View File
@@ -31,7 +31,6 @@ public:
fMedia(NULL), fMedia(NULL),
fFile(NULL), fFile(NULL),
fFallbackBuffer(NULL), fFallbackBuffer(NULL),
fFallbackPosition(0),
fErr(B_NO_ERROR) fErr(B_NO_ERROR)
{ {
fPosition = dynamic_cast<BPositionIO*>(source); fPosition = dynamic_cast<BPositionIO*>(source);
@@ -77,19 +76,20 @@ public:
return fPosition->ReadAt(position, buffer, size); return fPosition->ReadAt(position, buffer, size);
if (IsEndless()) { if (IsEndless()) {
off_t nextPos = position+size;
off_t bufSize = 0; off_t bufSize = 0;
ssize_t ret = 0;
fFallbackBuffer->GetSize(&bufSize); fFallbackBuffer->GetSize(&bufSize);
if (fFallbackPosition == position if (fFallbackBuffer->Position() == position
&& nextPos > bufSize) { && position+size > bufSize) {
fData->Read(buffer, size); ret = fData->Read(buffer, size);
fFallbackBuffer->WriteAt(fFallbackPosition, buffer, size); fFallbackBuffer->Write(buffer, ret);
fFallbackPosition = nextPos; return ret;
return size; }
} else if (nextPos <= bufSize) {
fFallbackPosition = nextPos; if (position+size <= bufSize) {
return fFallbackBuffer->ReadAt(position, buffer, size); ret = fFallbackBuffer->ReadAt(position, buffer, size);
return ret;
} }
} }
@@ -102,9 +102,13 @@ public:
if (IsSeekable()) if (IsSeekable())
return fPosition->WriteAt(position, buffer, size); return fPosition->WriteAt(position, buffer, size);
if (IsEndless() && position == fFallbackPosition) { if (IsEndless()) {
fData->Write(buffer, size); off_t bufSize = 0;
fFallbackPosition = position+size; fFallbackBuffer->GetSize(&bufSize);
if (position == bufSize) {
fData->Write(buffer, size);
fFallbackBuffer->WriteAt(bufSize, buffer, size);
}
} }
return B_NOT_SUPPORTED; return B_NOT_SUPPORTED;
@@ -202,7 +206,6 @@ private:
BFile* fFile; BFile* fFile;
BMallocIO* fFallbackBuffer; BMallocIO* fFallbackBuffer;
off_t fFallbackPosition;
status_t fErr; status_t fErr;
}; };