diff --git a/Fmod5Sharp/CodecRebuilders/FmodVorbisRebuilder.cs b/Fmod5Sharp/CodecRebuilders/FmodVorbisRebuilder.cs index 4237c86..fb2477d 100644 --- a/Fmod5Sharp/CodecRebuilders/FmodVorbisRebuilder.cs +++ b/Fmod5Sharp/CodecRebuilders/FmodVorbisRebuilder.cs @@ -176,7 +176,7 @@ private static void ReadSamplePackets(BinaryReader inputReader, out List pa { var packetSize = inputReader.ReadUInt16(); - if (packetSize == 0) + if (packetSize == 0 || packetSize == 0xFFFF) break; //EOS packetLengths.Add(packetSize); diff --git a/Fmod5Sharp/FmodTypes/FmodSampleMetadata.cs b/Fmod5Sharp/FmodTypes/FmodSampleMetadata.cs index fb10120..f2e1ddd 100644 --- a/Fmod5Sharp/FmodTypes/FmodSampleMetadata.cs +++ b/Fmod5Sharp/FmodTypes/FmodSampleMetadata.cs @@ -4,7 +4,8 @@ namespace Fmod5Sharp.FmodTypes { - public class FmodSampleMetadata : IBinaryReadable + //Can be verified against "FMOD::CodecFSB5::decodeSubSoundHeader" in fmod.dll + public class FmodSampleMetadata : IBinaryReadable { internal bool HasAnyChunks; internal uint FrequencyId; @@ -24,10 +25,16 @@ void IBinaryReadable.Read(BinaryReader reader) HasAnyChunks = (encoded & 1) == 1; //Bit 0 FrequencyId = (uint) encoded.Bits( 1, 4); //Bits 1-4 - var pow2 = (int) encoded.Bits(5, 2); //Bits 5-6 - NumChannels = 1 << pow2; - if (NumChannels > 2) - throw new("> 2 channels not supported"); + + int channelBits = (int)encoded.Bits(5, 2); //Bits 5-6 + NumChannels = channelBits switch + { + 0 => 1, + 1 => 2, + 2 => 6, + 3 => 8, + _ => 0 + }; IsStereo = NumChannels == 2; diff --git a/Fmod5Sharp/FsbLoader.cs b/Fmod5Sharp/FsbLoader.cs index ac8a149..b7f924c 100644 --- a/Fmod5Sharp/FsbLoader.cs +++ b/Fmod5Sharp/FsbLoader.cs @@ -10,9 +10,10 @@ public static class FsbLoader { internal static readonly Dictionary Frequencies = new() { - { 1, 8000 }, + { 0, 4_000 }, + { 1, 8_000 }, { 2, 11_000 }, - { 3, 11_025 }, + { 3, 12_000 }, { 4, 16_000 }, { 5, 22_050 }, { 6, 24_000 },