@@ -23,9 +23,8 @@ public static class FsbLoader
2323 { 10 , 96_000 } ,
2424 } ;
2525
26- private static FmodSoundBank ? LoadInternal ( byte [ ] bankBytes , bool throwIfError )
26+ private static FmodSoundBank ? LoadInternal ( Stream stream , bool throwIfError )
2727 {
28- using MemoryStream stream = new ( bankBytes ) ;
2928 using BinaryReader reader = new ( stream ) ;
3029
3130 FmodAudioHeader header = new ( reader ) ;
@@ -38,24 +37,26 @@ public static class FsbLoader
3837 return null ;
3938 }
4039
41- List < FmodSample > samples = new ( ) ;
42-
43- //Remove header from data block.
44- var bankData = bankBytes . AsSpan ( ( int ) ( header . SizeOfThisHeader + header . SizeOfNameTable + header . SizeOfSampleHeaders ) ) ;
40+ long dataStartOffset = header . SizeOfThisHeader + header . SizeOfNameTable + header . SizeOfSampleHeaders ;
4541
42+ List < FmodSample > samples = new ( header . Samples . Count ) ;
4643 for ( var i = 0 ; i < header . Samples . Count ; i ++ )
4744 {
4845 var sampleMetadata = header . Samples [ i ] ;
4946
50- var firstByteOfSample = ( int ) sampleMetadata . DataOffset ;
51- var lastByteOfSample = ( int ) header . SizeOfData ;
47+ var firstByteOfSample = ( long ) sampleMetadata . DataOffset ;
48+ var lastByteOfSample = ( long ) header . SizeOfData ;
5249
5350 if ( i < header . Samples . Count - 1 )
5451 {
55- lastByteOfSample = ( int ) header . Samples [ i + 1 ] . DataOffset ;
52+ lastByteOfSample = ( long ) header . Samples [ i + 1 ] . DataOffset ;
5653 }
5754
58- var sample = new FmodSample ( sampleMetadata , bankData [ firstByteOfSample ..lastByteOfSample ] . ToArray ( ) ) ;
55+ byte [ ] sampleData = new byte [ lastByteOfSample - firstByteOfSample ] ;
56+ stream . Position = dataStartOffset + firstByteOfSample ;
57+ stream . Read ( sampleData , 0 , sampleData . Length ) ;
58+
59+ var sample = new FmodSample ( sampleMetadata , sampleData ) ;
5960
6061 if ( header . SizeOfNameTable > 0 )
6162 {
@@ -65,7 +66,8 @@ public static class FsbLoader
6566
6667 nameOffset += header . SizeOfThisHeader + header . SizeOfSampleHeaders ;
6768
68- sample . Name = bankBytes . ReadNullTerminatedString ( ( int ) nameOffset ) ;
69+ stream . Position = nameOffset ;
70+ sample . Name = stream . ReadNullTerminatedString ( ) ;
6971 }
7072
7173 samples . Add ( sample ) ;
@@ -74,13 +76,26 @@ public static class FsbLoader
7476 return new FmodSoundBank ( header , samples ) ;
7577 }
7678
79+ public static bool TryLoadFsbFromStream ( Stream stream , out FmodSoundBank ? bank )
80+ {
81+ bank = LoadInternal ( stream , false ) ;
82+ return bank != null ;
83+ }
84+
85+ public static FmodSoundBank LoadFsbFromStream ( Stream stream )
86+ => LoadInternal ( stream , true ) ! ;
87+
7788 public static bool TryLoadFsbFromByteArray ( byte [ ] bankBytes , out FmodSoundBank ? bank )
7889 {
79- bank = LoadInternal ( bankBytes , false ) ;
90+ using var stream = new MemoryStream ( bankBytes ) ;
91+ bank = LoadInternal ( stream , false ) ;
8092 return bank != null ;
8193 }
8294
8395 public static FmodSoundBank LoadFsbFromByteArray ( byte [ ] bankBytes )
84- => LoadInternal ( bankBytes , true ) ! ;
96+ {
97+ using var stream = new MemoryStream ( bankBytes ) ;
98+ return LoadInternal ( stream , true ) ! ;
99+ }
85100 }
86101}
0 commit comments