2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
11 #include "threads/Event.h"
19 #define CACHE_RC_ERROR -1
20 #define CACHE_RC_WOULD_BLOCK -2
21 #define CACHE_RC_TIMEOUT -3
23 class IFile
; // forward declaration
27 virtual ~CCacheStrategy();
29 virtual int Open() = 0;
30 virtual void Close() = 0;
32 virtual size_t GetMaxWriteSize(const size_t& iRequestSize
) = 0;
33 virtual int WriteToCache(const char *pBuffer
, size_t iSize
) = 0;
34 virtual int ReadFromCache(char *pBuffer
, size_t iMaxSize
) = 0;
35 virtual int64_t WaitForData(uint32_t iMinAvail
, std::chrono::milliseconds timeout
) = 0;
37 virtual int64_t Seek(int64_t iFilePosition
) = 0;
40 \brief Reset cache position
41 \param iSourcePosition position to reset to
42 \return Whether a full reset was performed, or not (e.g. only cache swap)
45 virtual bool Reset(int64_t iSourcePosition
) = 0;
47 virtual void EndOfInput(); // mark the end of the input stream so that Read will know when to return EOF
48 virtual bool IsEndOfInput();
49 virtual void ClearEndOfInput();
51 virtual int64_t CachedDataEndPosIfSeekTo(int64_t iFilePosition
) = 0;
52 virtual int64_t CachedDataStartPos() = 0;
53 virtual int64_t CachedDataEndPos() = 0;
54 virtual bool IsCachedPosition(int64_t iFilePosition
) = 0;
56 virtual CCacheStrategy
*CreateNew() = 0;
60 bool m_bEndOfInput
= false;
65 class CSimpleFileCache
: public CCacheStrategy
{
68 ~CSimpleFileCache() override
;
71 void Close() override
;
73 size_t GetMaxWriteSize(const size_t& iRequestSize
) override
;
74 int WriteToCache(const char *pBuffer
, size_t iSize
) override
;
75 int ReadFromCache(char *pBuffer
, size_t iMaxSize
) override
;
76 int64_t WaitForData(uint32_t iMinAvail
, std::chrono::milliseconds timeout
) override
;
78 int64_t Seek(int64_t iFilePosition
) override
;
79 bool Reset(int64_t iSourcePosition
) override
;
80 void EndOfInput() override
;
82 int64_t CachedDataEndPosIfSeekTo(int64_t iFilePosition
) override
;
83 int64_t CachedDataStartPos() override
;
84 int64_t CachedDataEndPos() override
;
85 bool IsCachedPosition(int64_t iFilePosition
) override
;
87 CCacheStrategy
*CreateNew() override
;
89 int64_t GetAvailableRead();
92 std::string m_filename
;
93 IFile
* m_cacheFileRead
;
94 IFile
* m_cacheFileWrite
;
95 CEvent
* m_hDataAvailEvent
;
96 volatile int64_t m_nStartPosition
= 0;
97 volatile int64_t m_nWritePosition
= 0;
98 volatile int64_t m_nReadPosition
= 0;
101 class CDoubleCache
: public CCacheStrategy
{
103 explicit CDoubleCache(CCacheStrategy
*impl
);
104 ~CDoubleCache() override
;
107 void Close() override
;
109 size_t GetMaxWriteSize(const size_t& iRequestSize
) override
;
110 int WriteToCache(const char *pBuffer
, size_t iSize
) override
;
111 int ReadFromCache(char *pBuffer
, size_t iMaxSize
) override
;
112 int64_t WaitForData(uint32_t iMinAvail
, std::chrono::milliseconds timeout
) override
;
114 int64_t Seek(int64_t iFilePosition
) override
;
115 bool Reset(int64_t iSourcePosition
) override
;
116 void EndOfInput() override
;
117 bool IsEndOfInput() override
;
118 void ClearEndOfInput() override
;
120 int64_t CachedDataEndPosIfSeekTo(int64_t iFilePosition
) override
;
121 int64_t CachedDataStartPos() override
;
122 int64_t CachedDataEndPos() override
;
123 bool IsCachedPosition(int64_t iFilePosition
) override
;
125 CCacheStrategy
*CreateNew() override
;
128 CCacheStrategy
*m_pCache
;
129 CCacheStrategy
*m_pCacheOld
;