Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/base
diff options
context:
space:
mode:
authorbmdhacks <bmd@bmdhacks.com>2025-02-13 16:01:47 -0800
committerbmdhacks <bmd@bmdhacks.com>2025-02-15 14:37:57 -0800
commit4ece0d79210c0f0351c16a0611f40308ceb8efb0 (patch)
tree7f27a77ccc27cdf0486d45feb6aa5ca484474e84 /source/base
parenteedd20da00e873ae188634f5e9af4a2e9efe8607 (diff)
Streaming Audio
Problem: The current implementation reads the entire sound file in to memory in order to play it. For OGG background music, this uses 91 Megs of RAM by injesting all ogg songs as well as all wav assets. Solution: Change StarAudio to play the asset from a file handle and stream it off the disk. This results in a massive savings of RAM and doesn't really affect audio quality unless you're doing massive disk operations such as compiling Starbound.
Diffstat (limited to 'source/base')
-rw-r--r--source/base/StarMemoryAssetSource.cpp6
-rw-r--r--source/base/StarPackedAssetSource.cpp6
2 files changed, 12 insertions, 0 deletions
diff --git a/source/base/StarMemoryAssetSource.cpp b/source/base/StarMemoryAssetSource.cpp
index a7554b6..5dec123 100644
--- a/source/base/StarMemoryAssetSource.cpp
+++ b/source/base/StarMemoryAssetSource.cpp
@@ -57,6 +57,12 @@ IODevicePtr MemoryAssetSource::open(String const& path) {
assetPos = clamp<StreamOffset>(assetPos - p, 0, assetSize);
}
+ IODevicePtr clone() override {
+ auto cloned = make_shared<AssetReader>(assetData, assetSize, name);
+ cloned->assetPos = assetPos;
+ return cloned;
+ }
+
char* assetData;
size_t assetSize;
StreamOffset assetPos = 0;
diff --git a/source/base/StarPackedAssetSource.cpp b/source/base/StarPackedAssetSource.cpp
index 59e64cc..8979978 100644
--- a/source/base/StarPackedAssetSource.cpp
+++ b/source/base/StarPackedAssetSource.cpp
@@ -136,6 +136,12 @@ IODevicePtr PackedAssetSource::open(String const& path) {
assetPos = clamp<StreamOffset>(assetSize - p, 0, assetSize);
}
+ IODevicePtr clone() override {
+ auto cloned = make_shared<AssetReader>(file, path, fileOffset, assetSize);
+ cloned->assetPos = assetPos;
+ return cloned;
+ }
+
FilePtr file;
String path;
StreamOffset fileOffset;