Chris@168: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@168: Chris@168: /* Chris@168: Sonic Visualiser Chris@168: An audio file viewer and annotation editor. Chris@168: Centre for Digital Music, Queen Mary, University of London. Chris@168: This file copyright 2006 Chris Cannam. Chris@168: Chris@168: This program is free software; you can redistribute it and/or Chris@168: modify it under the terms of the GNU General Public License as Chris@168: published by the Free Software Foundation; either version 2 of the Chris@168: License, or (at your option) any later version. See the file Chris@168: COPYING included with this distribution for more information. Chris@168: */ Chris@168: Chris@168: #include "StorageAdviser.h" Chris@168: Chris@168: #include "Exceptions.h" Chris@168: #include "TempDirectory.h" Chris@168: Chris@168: #include "system/System.h" Chris@168: Chris@168: #include Chris@168: Chris@168: StorageAdviser::Recommendation Chris@168: StorageAdviser::recommend(Criteria criteria, Chris@168: int minimumSize, Chris@168: int maximumSize) Chris@168: { Chris@170: std::cerr << "StorageAdviser::recommend: Criteria " << criteria Chris@170: << ", minimumSize " << minimumSize Chris@170: << ", maximumSize " << maximumSize << std::endl; Chris@170: Chris@168: QString path = TempDirectory::getInstance()->getPath(); Chris@170: int discFree = GetDiscSpaceMBAvailable(path.toLocal8Bit()); Chris@170: int memoryFree, memoryTotal; Chris@170: GetRealMemoryMBAvailable(memoryFree, memoryTotal); Chris@168: Chris@170: std::cerr << "Disc space: " << discFree << ", memory free: " << memoryFree << ", memory total: " << memoryTotal << std::endl; Chris@168: Chris@170: enum StorageStatus { Chris@170: Unknown, Chris@170: Insufficient, Chris@170: Marginal, Chris@170: Sufficient Chris@170: }; Chris@168: Chris@170: StorageStatus memoryStatus = Unknown; Chris@170: StorageStatus discStatus = Unknown; Chris@170: Chris@170: int minmb = minimumSize / 1024 + 1; Chris@170: int maxmb = maximumSize / 1024 + 1; Chris@170: Chris@170: if (memoryFree == -1) memoryStatus = Unknown; Chris@170: else if (minmb > (memoryFree * 3) / 4) memoryStatus = Insufficient; Chris@170: else if (maxmb > (memoryFree * 3) / 4) memoryStatus = Marginal; Chris@170: else if (minmb > (memoryFree / 3)) memoryStatus = Marginal; Chris@170: else if (memoryTotal == -1 || Chris@170: minmb > (memoryTotal / 10)) memoryStatus = Marginal; Chris@170: else memoryStatus = Sufficient; Chris@170: Chris@170: if (discFree == -1) discStatus = Unknown; Chris@170: else if (minmb > (discFree * 3) / 4) discStatus = Insufficient; Chris@170: else if (maxmb > (discFree * 3) / 4) discStatus = Marginal; Chris@170: else if (minmb > (discFree / 3)) discStatus = Marginal; Chris@170: else discStatus = Sufficient; Chris@170: Chris@170: std::cerr << "Memory status: " << memoryStatus << ", disc status " Chris@170: << discStatus << std::endl; Chris@170: Chris@170: int recommendation = NoRecommendation; Chris@170: Chris@170: if (memoryStatus == Insufficient || memoryStatus == Unknown) { Chris@170: Chris@170: recommendation |= UseDisc; Chris@170: Chris@170: if (discStatus == Insufficient && minmb > discFree) { Chris@170: throw InsufficientDiscSpace(path, minmb, discFree); Chris@170: } Chris@170: Chris@170: if (discStatus == Insufficient || discStatus == Marginal) { Chris@170: recommendation |= ConserveSpace; Chris@170: } else if (discStatus == Unknown && !(criteria & PrecisionCritical)) { Chris@170: recommendation |= ConserveSpace; Chris@170: } else { Chris@170: recommendation |= UseAsMuchAsYouLike; Chris@170: } Chris@170: Chris@170: } else if (memoryStatus == Marginal) { Chris@170: Chris@170: if (((criteria & SpeedCritical) || Chris@170: (criteria & FrequentLookupLikely)) && Chris@170: !(criteria & PrecisionCritical) && Chris@170: !(criteria & LongRetentionLikely)) { Chris@170: Chris@170: // requirements suggest a preference for memory Chris@170: Chris@170: if (discStatus != Insufficient) { Chris@170: recommendation |= PreferMemory; Chris@170: } else { Chris@170: recommendation |= UseMemory; Chris@170: } Chris@170: Chris@170: recommendation |= ConserveSpace; Chris@170: Chris@170: } else { Chris@170: Chris@170: if (discStatus == Insufficient) { Chris@170: recommendation |= (UseMemory | ConserveSpace); Chris@170: } else if (discStatus == Marginal) { Chris@170: recommendation |= (PreferMemory | ConserveSpace); Chris@170: } else if (discStatus == Unknown) { Chris@170: recommendation |= (PreferDisc | ConserveSpace); Chris@170: } else { Chris@170: recommendation |= (UseDisc | UseAsMuchAsYouLike); Chris@170: } Chris@170: } Chris@170: Chris@170: } else { Chris@170: Chris@170: if (discStatus == Insufficient) { Chris@170: recommendation |= (UseMemory | ConserveSpace); Chris@170: } else if (discStatus != Sufficient) { Chris@170: recommendation |= (PreferMemory | ConserveSpace); Chris@170: } else { Chris@170: Chris@170: if ((criteria & SpeedCritical) || Chris@170: (criteria & FrequentLookupLikely)) { Chris@170: recommendation |= PreferMemory; Chris@170: if (criteria & PrecisionCritical) { Chris@170: recommendation |= UseAsMuchAsYouLike; Chris@170: } else { Chris@170: recommendation |= ConserveSpace; Chris@170: } Chris@170: } else { Chris@170: recommendation |= PreferDisc; Chris@170: recommendation |= UseAsMuchAsYouLike; Chris@170: } Chris@170: } Chris@170: } Chris@170: Chris@170: return Recommendation(recommendation); Chris@168: } Chris@168: