lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 QMUL. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #ifndef _STORAGE_ADVISER_H_ lbajardsilogic@0: #define _STORAGE_ADVISER_H_ lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * A utility class designed to help decide whether to store cache data lbajardsilogic@0: * (for example FFT outputs) in memory or on disk in the TempDirectory. lbajardsilogic@0: * This is basically a compendium of simple rules of thumb. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: class StorageAdviser lbajardsilogic@0: { lbajardsilogic@0: public: lbajardsilogic@0: // pass to recommend() zero or more of these OR'd together lbajardsilogic@0: enum Criteria { lbajardsilogic@0: NoCriteria = 0, lbajardsilogic@0: SpeedCritical = 1, lbajardsilogic@0: PrecisionCritical = 2, lbajardsilogic@0: LongRetentionLikely = 4, lbajardsilogic@0: FrequentLookupLikely = 8 lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: // recommend() returns one or two of these OR'd together lbajardsilogic@0: enum Recommendation { lbajardsilogic@0: NoRecommendation = 0, lbajardsilogic@0: UseMemory = 1, // Disc is strongly contraindicated lbajardsilogic@0: PreferMemory = 2, // Either would do; memory probably better lbajardsilogic@0: PreferDisc = 4, // Either would do; disc probably better lbajardsilogic@0: UseDisc = 8, // Probably won't fit in memory lbajardsilogic@0: ConserveSpace = 16,// Whatever you choose, keep it compact lbajardsilogic@0: UseAsMuchAsYouLike = 32 // Take my advice and there'll be space for all lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Recommend where to store some data, given certain storage and lbajardsilogic@0: * recall criteria. The minimum size is the approximate amount of lbajardsilogic@0: * data in kilobytes that will be stored if the recommendation is lbajardsilogic@0: * to ConserveSpace; the maximum size is approximately the amount lbajardsilogic@0: * that will be used if UseAsMuchAsYouLike is returned. lbajardsilogic@0: * lbajardsilogic@0: * May throw InsufficientDiscSpace exception if there appears to lbajardsilogic@0: * be nowhere the minimum amount of data can be stored. lbajardsilogic@0: */ lbajardsilogic@0: static Recommendation recommend(Criteria criteria, lbajardsilogic@0: int minimumSize, lbajardsilogic@0: int maximumSize); lbajardsilogic@0: lbajardsilogic@0: enum AllocationArea { lbajardsilogic@0: MemoryAllocation, lbajardsilogic@0: DiscAllocation lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Specify that we are planning to use a given amount of storage lbajardsilogic@0: * (in kilobytes), but haven't allocated it yet. lbajardsilogic@0: */ lbajardsilogic@0: static void notifyPlannedAllocation(AllocationArea area, int size); lbajardsilogic@0: lbajardsilogic@0: /** lbajardsilogic@0: * Specify that we have now allocated, or abandoned the allocation lbajardsilogic@0: * of, the given amount (in kilobytes) of a storage area that was lbajardsilogic@0: * previously notified using notifyPlannedAllocation. lbajardsilogic@0: */ lbajardsilogic@0: static void notifyDoneAllocation(AllocationArea area, int size); lbajardsilogic@0: lbajardsilogic@0: private: lbajardsilogic@0: static long m_discPlanned; lbajardsilogic@0: static long m_memoryPlanned; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: #endif lbajardsilogic@0: