BMediaIOWrapper: Refer on fallback buffer Position()
* Write the data into the fallback buffer when emulating pseudo seeked writes.
This commit is contained in:
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user