1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2 
3 #ifndef SPECTMORPH_INSTENCCACHE_HH
4 #define SPECTMORPH_INSTENCCACHE_HH
5 
6 #include "smwavdata.hh"
7 #include "smencoder.hh"
8 #include "sminstrument.hh"
9 
10 #include <mutex>
11 #include <regex>
12 
13 namespace SpectMorph
14 {
15 
16 class InstEncCache
17 {
18   struct CacheData
19   {
20     std::string                version;
21     std::vector<unsigned char> data;
22     uint64                     read_stamp = 0;
23 
24     CacheData();
25     ~CacheData();
26   };
27 
28   std::map<std::string, CacheData> cache;
29   std::mutex                       cache_mutex;
30   const std::regex                 cache_file_re;
31   uint64                           cache_read_stamp = 0;
32 
33   void        cache_save_L (const std::string& key);
34   void        cache_try_load_L (const std::string& key, const std::string& need_version);
35   Audio      *cache_lookup (const std::string& cache_key, const std::string& version);
36   void        cache_add (const std::string& cache_key, const std::string& version, const Audio *audio);
37 
38   void        delete_old_files();
39   void        delete_old_memory_L();
40 
41 public:
42   class Group
43   {
44   public:
45     std::string id;
46   };
47 
48   Audio      *encode (Group *group, const WavData& wav_data, const std::string& wav_data_hash,
49                       int midi_note, int iclipstart, int iclipend, Instrument::EncoderConfig& cfg,
50                       const std::function<bool()>& kill_function);
51   void        clear();
52   Group      *create_group();
53 
54   InstEncCache();
55 
56   static InstEncCache *the(); // Singleton
57 };
58 
59 }
60 
61 #endif
62