42#include <unordered_map>
57 float min() const noexcept {
return static_cast<float>(
min_q7) / 127.0f; }
58 float max() const noexcept {
return static_cast<float>(
max_q7) / 127.0f; }
62 if (lo < -1.0f) lo = -1.0f;
63 if (lo > 1.0f) lo = 1.0f;
64 if (hi < -1.0f) hi = -1.0f;
65 if (hi > 1.0f) hi = 1.0f;
66 p.min_q7 =
static_cast<int8_t
>(lo * 127.0f);
67 p.max_q7 =
static_cast<int8_t
>(hi * 127.0f);
77 std::vector<std::vector<AudioPeak>>
peaks;
101 const std::string& path,
102 uint32_t samples_per_peak = 256);
108 uint32_t samples_per_peak = 256);
114 uint32_t sample_rate,
115 uint32_t samples_per_peak = 256);
120 std::size_t
num_levels() const noexcept {
return levels_.size(); }
135 uint32_t target_peaks,
136 float* dst_min_max_interleaved)
const noexcept;
138 bool empty() const noexcept {
return levels_.empty(); }
146 uint32_t num_channels,
147 uint64_t num_source_frames,
148 uint32_t sample_rate,
155 std::vector<OverviewLevel> levels_;
156 uint32_t num_channels_ = 0;
157 uint64_t num_source_frames_ = 0;
158 uint32_t sample_rate_ = 0;
199 const std::string& path,
200 uint32_t samples_per_peak = 256);
204 std::shared_ptr<const WaveformOverview>
get(
205 const std::string& path,
206 uint32_t samples_per_peak = 256);
213 void put(
const std::string& path,
214 std::shared_ptr<const WaveformOverview> thumbnail,
221 bool erase(
const std::string& path);
246 std::shared_ptr<const WaveformOverview> value;
250 using List = std::list<Entry>;
251 using Map = std::unordered_map<std::string, List::iterator>;
253 void touch_locked(Map::iterator it);
254 void evict_to_capacity_locked();
258 std::shared_ptr<const WaveformOverview> load_from_disk(
const std::string& path,
259 uint32_t samples_per_peak)
const;
260 bool write_to_disk(
const std::string& path,
261 uint32_t samples_per_peak,
263 std::string disk_path_for(
const std::string& source_path,
264 uint32_t samples_per_peak)
const;
266 mutable std::mutex mtx_;
269 std::size_t capacity_;
270 std::string disk_dir_;
273 std::atomic<std::size_t> hits_{0};
274 std::atomic<std::size_t> misses_{0};
275 std::atomic<std::size_t> evictions_{0};
276 std::atomic<std::size_t> disk_hits_{0};
277 std::atomic<std::size_t> disk_writes_{0};
Non-owning view over multi-channel audio sample data.
Definition buffer.hpp:30
Definition analyzer_provider.hpp:12
std::optional< WaveformOverview > deserialize_overview(const uint8_t *data, std::size_t size)
std::vector< uint8_t > serialize_overview(const WaveformOverview &t)
Definition audio_file.hpp:24
Definition waveform_overview.hpp:53
static AudioPeak from_range(float lo, float hi) noexcept
Definition waveform_overview.hpp:60
int8_t max_q7
Definition waveform_overview.hpp:55
int8_t min_q7
Definition waveform_overview.hpp:54
float max() const noexcept
Definition waveform_overview.hpp:58
float min() const noexcept
Definition waveform_overview.hpp:57
Definition waveform_overview.hpp:74
std::vector< std::vector< AudioPeak > > peaks
Definition waveform_overview.hpp:77
uint32_t samples_per_peak
Definition waveform_overview.hpp:75
uint32_t peaks_per_channel
Definition waveform_overview.hpp:76