haiku/headers/private/media/AdapterIO.h
Dario Casalinuovo 3faf39eb5d BAdapterIO: Add initial seeking support
* This is by default provided using a relative buffer. When the
client request a seek over the range we currently have, we will
ask the backend with a SeekRequested. When the backend operation
ended successfully, the client is required to call SeekCompleted
before to return. This will cause the offset to change and the
buffer is cleaned as result. Next data received will be considered
to be at a position equal to the offset plus the relative position.
2016-06-07 16:12:39 +02:00

95 lines
2.0 KiB
C++

/*
* Copyright 2016 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _ADAPTER_IO_H
#define _ADAPTER_IO_H
#include <MediaIO.h>
#include <OS.h>
#include <RWLocker.h>
#include <SupportDefs.h>
class BAdapterIO;
class RelativePositionIO;
class BInputAdapter {
public:
virtual ssize_t Write(const void* buffer, size_t size);
private:
friend class BAdapterIO;
BInputAdapter(BAdapterIO* io);
virtual ~BInputAdapter();
BAdapterIO* fIO;
virtual void _ReservedInputAdapter1();
virtual void _ReservedInputAdapter2();
uint32 _reserved[2];
};
class BAdapterIO : public BMediaIO {
public:
BAdapterIO(int32 flags,
bigtime_t timeout = B_INFINITE_TIMEOUT);
virtual ~BAdapterIO();
virtual void GetFlags(int32* flags) const;
virtual ssize_t ReadAt(off_t position, void* buffer,
size_t size);
virtual ssize_t WriteAt(off_t position,
const void* buffer, size_t size);
virtual off_t Seek(off_t position, uint32 seekMode);
virtual off_t Position() const;
virtual status_t SetSize(off_t size);
virtual status_t GetSize(off_t* size) const;
BInputAdapter* BuildInputAdapter();
protected:
friend class BInputAdapter;
void SetBuffer(BPositionIO* io);
ssize_t BackWrite(const void* buffer, size_t size);
status_t SeekRequested(off_t position);
status_t SeekCompleted(off_t position);
private:
status_t _EvaluateWait(off_t position);
int32 fFlags;
bigtime_t fTimeout;
off_t fBackPosition;
mutable RWLocker fLock;
RelativePositionIO* fBuffer;
BInputAdapter* fInputAdapter;
BAdapterIO(const BAdapterIO&);
BAdapterIO& operator=(const BAdapterIO&);
virtual void _ReservedAdapterIO1();
virtual void _ReservedAdapterIO2();
virtual void _ReservedAdapterIO3();
virtual void _ReservedAdapterIO4();
virtual void _ReservedAdapterIO5();
uint32 _reserved[5];
};
#endif // _ADAPTER_IO_H