Mercurial > hg > svcore
comparison base/MatrixFileCache.h @ 95:040a151d0897
* Add file reader thread, and make the matrix file code use it to preload
fft cache data without glitching
| author | Chris Cannam |
|---|---|
| date | Thu, 04 May 2006 13:59:57 +0000 |
| parents | 27d726916ab3 |
| children |
comparison
equal
deleted
inserted
replaced
| 94:5b8392e80ed6 | 95:040a151d0897 |
|---|---|
| 19 #include <sys/types.h> | 19 #include <sys/types.h> |
| 20 #include <QString> | 20 #include <QString> |
| 21 #include <QMutex> | 21 #include <QMutex> |
| 22 #include <map> | 22 #include <map> |
| 23 | 23 |
| 24 // This class is _not_ thread safe. Each instance must only be used | 24 #include "FileReadThread.h" |
| 25 // within a single thread. You may however have as many instances as | |
| 26 // you like referring to the same file in separate threads. | |
| 27 | 25 |
| 28 class MatrixFileCache | 26 class MatrixFileCache : public QObject |
| 29 { | 27 { |
| 28 Q_OBJECT | |
| 29 | |
| 30 public: | 30 public: |
| 31 enum Mode { ReadOnly, ReadWrite }; | 31 enum Mode { ReadOnly, ReadWrite }; |
| 32 | 32 |
| 33 MatrixFileCache(QString fileBase, Mode mode); | 33 MatrixFileCache(QString fileBase, Mode mode); |
| 34 virtual ~MatrixFileCache(); | 34 virtual ~MatrixFileCache(); |
| 37 size_t getHeight() const; | 37 size_t getHeight() const; |
| 38 | 38 |
| 39 void resize(size_t width, size_t height); | 39 void resize(size_t width, size_t height); |
| 40 void reset(); | 40 void reset(); |
| 41 | 41 |
| 42 void setRegionOfInterest(size_t x, size_t width); | 42 float getValueAt(size_t x, size_t y); |
| 43 void clearRegionOfInterest(); | 43 void getColumnAt(size_t x, float *values); |
| 44 | |
| 45 float getValueAt(size_t x, size_t y) const; | |
| 46 void getColumnAt(size_t x, float *values) const; | |
| 47 | 44 |
| 48 void setValueAt(size_t x, size_t y, float value); | 45 void setValueAt(size_t x, size_t y, float value); |
| 49 void setColumnAt(size_t x, float *values); | 46 void setColumnAt(size_t x, float *values); |
| 50 | 47 |
| 48 protected slots: | |
| 49 void requestCancelled(int token); | |
| 50 | |
| 51 protected: | 51 protected: |
| 52 int m_fd; | 52 int m_fd; |
| 53 Mode m_mode; | 53 Mode m_mode; |
| 54 size_t m_width; | 54 size_t m_width; |
| 55 size_t m_height; | 55 size_t m_height; |
| 56 size_t m_headerSize; | 56 size_t m_headerSize; |
| 57 size_t m_autoRegionWidth; | |
| 58 QString m_fileName; | 57 QString m_fileName; |
| 58 size_t m_defaultCacheWidth; | |
| 59 size_t m_prevX; | |
| 59 | 60 |
| 60 mutable off_t m_off; | 61 struct Cache { |
| 61 mutable size_t m_rx; | 62 size_t x; |
| 62 mutable size_t m_rw; | 63 size_t width; |
| 63 mutable bool m_userRegion; | 64 float *data; |
| 64 mutable float *m_region; | 65 }; |
| 65 float *getRegionPtr(size_t x, size_t y) const; | |
| 66 | 66 |
| 67 bool autoSetRegion(size_t x) const; | 67 Cache m_cache; |
| 68 bool setRegion(size_t x, size_t width, bool user) const; | |
| 69 | 68 |
| 70 bool seekTo(size_t x, size_t y) const; | 69 bool getValuesFromCache(size_t x, size_t ystart, size_t ycount, |
| 70 float *values); | |
| 71 | |
| 72 void primeCache(size_t x, bool left); | |
| 73 | |
| 74 bool seekTo(size_t x, size_t y); | |
| 75 | |
| 76 FileReadThread m_readThread; | |
| 77 int m_requestToken; | |
| 78 size_t m_requestingX; | |
| 79 size_t m_requestingWidth; | |
| 71 | 80 |
| 72 static std::map<QString, int> m_refcount; | 81 static std::map<QString, int> m_refcount; |
| 73 static QMutex m_refcountMutex; | 82 static QMutex m_refcountMutex; |
| 83 QMutex m_fdMutex; | |
| 84 QMutex m_cacheMutex; | |
| 74 }; | 85 }; |
| 75 | 86 |
| 76 #endif | 87 #endif |
| 77 | 88 |
