diff --git a/aegisub/src/audio_renderer.cpp b/aegisub/src/audio_renderer.cpp index 1cd6ee70a..614eb1736 100644 --- a/aegisub/src/audio_renderer.cpp +++ b/aegisub/src/audio_renderer.cpp @@ -159,6 +159,12 @@ void AudioRenderer::SetAudioProvider(AudioProvider *_provider) } +void AudioRenderer::SetCacheMaxSize(size_t max_size) +{ + cache_maxsize = max_size; +} + + void AudioRenderer::ResetBlockCount() { if (provider) @@ -255,9 +261,10 @@ void AudioRenderer::Render(wxDC &dc, wxPoint origin, int start, int length, bool } if (selected) - bitmaps_selected.Age(cache_maxsize); + bitmaps_selected.Age(cache_maxsize / 8); else - bitmaps_normal.Age(cache_maxsize); + bitmaps_normal.Age(cache_maxsize / 8); + renderer->AgeCache(3 * cache_maxsize / 4); } diff --git a/aegisub/src/audio_renderer.h b/aegisub/src/audio_renderer.h index e8687c5a1..6161a20d3 100644 --- a/aegisub/src/audio_renderer.h +++ b/aegisub/src/audio_renderer.h @@ -168,6 +168,16 @@ public: /// depends on the bitmap provider used.) void SetAmplitudeScale(float amplitude_scale); + /// @brief Set the maximum allowed cache size + /// @param max_size Size in bytes that may be used for caching + /// + /// The given max size is not a hard limit and does generally not include overhead + /// added by the cache management. The allowed size might be distributed among + /// several separate objects. + /// + /// Changing the max cache size does not trigger cache aging. + void SetCacheMaxSize(size_t max_size); + /// @brief Get horizontal zoom /// @return Audio samples per pixel rendering at int GetSamplesPerPixel() const { return pixel_samples; } @@ -292,4 +302,11 @@ public: /// @brief Change vertical zoom /// @param amplitude_scale Scaling factor to zoom to void SetAmplitudeScale(float amplitude_scale); + + /// @brief Age any caches the renderer might keep + /// @param max_size Maximum size in bytes the caches should be + /// + /// Deriving classes should override this method if they implement any + /// kind of caching. + virtual void AgeCache(size_t max_size) { } };