view base/MatrixFile.h @ 97:22494cc28c9f

* Reduce number of allocations and deallocations by keeping a spare buffer around (we were generally deallocating and then immediately allocating again, so it's much better not to have to bother as very large allocations can tie up the system)
author Chris Cannam
date Thu, 04 May 2006 20:17:28 +0000
parents 1aebdc68ec6d
children
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*
    Sonic Visualiser
    An audio file viewer and annotation editor.
    Centre for Digital Music, Queen Mary, University of London.
    This file copyright 2006 Chris Cannam.
    
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of the
    License, or (at your option) any later version.  See the file
    COPYING included with this distribution for more information.
*/

#ifndef _MATRIX_FILE_CACHE_H_
#define _MATRIX_FILE_CACHE_H_

#include <sys/types.h>
#include <QString>
#include <QMutex>
#include <map>

#include "FileReadThread.h"

class MatrixFile : public QObject
{
    Q_OBJECT

public:
    enum Mode { ReadOnly, ReadWrite };

    MatrixFile(QString fileBase, Mode mode);
    virtual ~MatrixFile();

    size_t getWidth() const;
    size_t getHeight() const;
    
    void resize(size_t width, size_t height);
    void reset();

    float getValueAt(size_t x, size_t y);
    void getColumnAt(size_t x, float *values);

    void setValueAt(size_t x, size_t y, float value);
    void setColumnAt(size_t x, float *values);

protected:
    int     m_fd;
    Mode    m_mode;
    size_t  m_width;
    size_t  m_height;
    size_t  m_headerSize;
    QString m_fileName;
    size_t  m_defaultCacheWidth;
    size_t  m_prevX;

    struct Cache {
        size_t  x;
        size_t  width;
        float  *data;
    };

    Cache m_cache;

    bool getValuesFromCache(size_t x, size_t ystart, size_t ycount,
                            float *values);

    void primeCache(size_t x, bool left);

    bool seekTo(size_t x, size_t y);

    FileReadThread m_readThread;
    int m_requestToken;

    size_t m_requestingX;
    size_t m_requestingWidth;
    char *m_spareData;

    static std::map<QString, int> m_refcount;
    static QMutex m_refcountMutex;
    QMutex m_fdMutex;
    QMutex m_cacheMutex;
};

#endif