annotate data/fileio/MatrixFile.h @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 Chris Cannam.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #ifndef _MATRIX_FILE_CACHE_H_
lbajardsilogic@0 17 #define _MATRIX_FILE_CACHE_H_
lbajardsilogic@0 18
lbajardsilogic@0 19 #include "base/ResizeableBitset.h"
lbajardsilogic@0 20
lbajardsilogic@0 21 #include "FileReadThread.h"
lbajardsilogic@0 22
lbajardsilogic@0 23 #include <sys/types.h>
lbajardsilogic@0 24 #include <QString>
lbajardsilogic@0 25 #include <QMutex>
lbajardsilogic@0 26 #include <map>
lbajardsilogic@0 27
lbajardsilogic@0 28 class MatrixFile : public QObject
lbajardsilogic@0 29 {
lbajardsilogic@0 30 Q_OBJECT
lbajardsilogic@0 31
lbajardsilogic@0 32 public:
lbajardsilogic@0 33 enum Mode { ReadOnly, ReadWrite };
lbajardsilogic@0 34
lbajardsilogic@0 35 /**
lbajardsilogic@0 36 * Construct a MatrixFile object reading from and/or writing to
lbajardsilogic@0 37 * the matrix file with the given base name in the application's
lbajardsilogic@0 38 * temporary directory.
lbajardsilogic@0 39 *
lbajardsilogic@0 40 * If mode is ReadOnly, the file must exist and be readable.
lbajardsilogic@0 41 *
lbajardsilogic@0 42 * If mode is ReadWrite and the file does not exist, it will be
lbajardsilogic@0 43 * created. If mode is ReadWrite and the file does exist, the
lbajardsilogic@0 44 * existing file will be used and the mode will be reset to
lbajardsilogic@0 45 * ReadOnly. Call getMode() to check whether this has occurred
lbajardsilogic@0 46 * after construction.
lbajardsilogic@0 47 *
lbajardsilogic@0 48 * cellSize specifies the size in bytes of the object type stored
lbajardsilogic@0 49 * in the matrix. For example, use cellSize = sizeof(float) for a
lbajardsilogic@0 50 * matrix of floats. The MatrixFile object doesn't care about the
lbajardsilogic@0 51 * objects themselves, it just deals with raw data of a given size.
lbajardsilogic@0 52 *
lbajardsilogic@0 53 * If eagerCache is true, blocks from the file will be cached for
lbajardsilogic@0 54 * read. If eagerCache is false, only columns that have been set
lbajardsilogic@0 55 * by calling setColumnAt on this MatrixFile (i.e. columns for
lbajardsilogic@0 56 * which haveSetColumnAt returns true) will be cached.
lbajardsilogic@0 57 */
lbajardsilogic@0 58 MatrixFile(QString fileBase, Mode mode, size_t cellSize, bool eagerCache);
lbajardsilogic@0 59 virtual ~MatrixFile();
lbajardsilogic@0 60
lbajardsilogic@0 61 Mode getMode() const { return m_mode; }
lbajardsilogic@0 62
lbajardsilogic@0 63 size_t getWidth() const { return m_width; }
lbajardsilogic@0 64 size_t getHeight() const { return m_height; }
lbajardsilogic@0 65 size_t getCellSize() const { return m_cellSize; }
lbajardsilogic@0 66
lbajardsilogic@0 67 void resize(size_t width, size_t height);
lbajardsilogic@0 68 void reset();
lbajardsilogic@0 69
lbajardsilogic@0 70 bool haveSetColumnAt(size_t x) const { return m_columnBitset->get(x); }
lbajardsilogic@0 71 void getColumnAt(size_t x, void *data);
lbajardsilogic@0 72 void setColumnAt(size_t x, const void *data);
lbajardsilogic@0 73
lbajardsilogic@0 74 void suspend();
lbajardsilogic@0 75
lbajardsilogic@0 76 protected:
lbajardsilogic@0 77 int m_fd;
lbajardsilogic@0 78 Mode m_mode;
lbajardsilogic@0 79 int m_flags;
lbajardsilogic@0 80 mode_t m_fmode;
lbajardsilogic@0 81 size_t m_cellSize;
lbajardsilogic@0 82 size_t m_width;
lbajardsilogic@0 83 size_t m_height;
lbajardsilogic@0 84 size_t m_headerSize;
lbajardsilogic@0 85 QString m_fileName;
lbajardsilogic@0 86 size_t m_defaultCacheWidth;
lbajardsilogic@0 87 size_t m_prevX;
lbajardsilogic@0 88
lbajardsilogic@0 89 struct Cache {
lbajardsilogic@0 90 size_t x;
lbajardsilogic@0 91 size_t width;
lbajardsilogic@0 92 char *data;
lbajardsilogic@0 93 };
lbajardsilogic@0 94
lbajardsilogic@0 95 Cache m_cache;
lbajardsilogic@0 96 bool m_eagerCache;
lbajardsilogic@0 97
lbajardsilogic@0 98 bool getFromCache(size_t x, size_t ystart, size_t ycount, void *data);
lbajardsilogic@0 99 void primeCache(size_t x, bool left);
lbajardsilogic@0 100
lbajardsilogic@0 101 void resume();
lbajardsilogic@0 102
lbajardsilogic@0 103 bool seekTo(size_t x, size_t y);
lbajardsilogic@0 104
lbajardsilogic@0 105 static FileReadThread *m_readThread;
lbajardsilogic@0 106 int m_requestToken;
lbajardsilogic@0 107
lbajardsilogic@0 108 size_t m_requestingX;
lbajardsilogic@0 109 size_t m_requestingWidth;
lbajardsilogic@0 110 char *m_spareData;
lbajardsilogic@0 111
lbajardsilogic@0 112 static std::map<QString, int> m_refcount;
lbajardsilogic@0 113 static QMutex m_refcountMutex;
lbajardsilogic@0 114 QMutex m_fdMutex;
lbajardsilogic@0 115 QMutex m_cacheMutex;
lbajardsilogic@0 116
lbajardsilogic@0 117 typedef std::map<QString, ResizeableBitset *> ResizeableBitsetMap;
lbajardsilogic@0 118 static ResizeableBitsetMap m_columnBitsets;
lbajardsilogic@0 119 static QMutex m_columnBitsetWriteMutex;
lbajardsilogic@0 120 ResizeableBitset *m_columnBitset;
lbajardsilogic@0 121 };
lbajardsilogic@0 122
lbajardsilogic@0 123 #endif
lbajardsilogic@0 124