Skip to content

Commit 519121f

Browse files
committed
General cleanup:
- Use Json serialization context/code gen - Allow trimming - Fix LoadFsbFromByteArray not being thread-safe
1 parent d9aec6f commit 519121f

9 files changed

Lines changed: 66 additions & 29 deletions

File tree

Fmod5Sharp.Tests/Fmod5Sharp.Tests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
<None Remove="TestResources\broken_imaad.fsb" />
4949
<None Remove="TestResources\previously_unrecoverable_vorbis.fsb" />
5050
<EmbeddedResource Include="TestResources\previously_unrecoverable_vorbis.fsb" />
51+
<None Remove="TestResources\xbox_imaad.fsb" />
52+
<EmbeddedResource Include="TestResources\xbox_imaad.fsb" />
5153
</ItemGroup>
5254

5355
</Project>

Fmod5Sharp/Fmod5Sharp.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1515
<TargetFrameworks>net6.0;netstandard2.0</TargetFrameworks>
1616
<LangVersion>10</LangVersion>
17+
<IsTrimmable>true</IsTrimmable>
1718
</PropertyGroup>
1819

1920
<ItemGroup>

Fmod5Sharp/FmodAudioHeader.cs

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ namespace Fmod5Sharp
77
{
88
public class FmodAudioHeader
99
{
10+
private static readonly object ChunkReadingLock = new();
11+
1012
public FmodAudioType AudioType;
1113
public uint Version;
1214
public uint NumSamples;
@@ -46,28 +48,37 @@ public FmodAudioHeader(BinaryReader reader)
4648
var sampleHeadersStart = reader.Position();
4749
for (var i = 0; i < NumSamples; i++)
4850
{
49-
FmodSampleMetadata sampleMetadata = reader.ReadEndian<FmodSampleMetadata>();
51+
var sampleMetadata = reader.ReadEndian<FmodSampleMetadata>();
5052

51-
FmodSampleChunk.CurrentSample = sampleMetadata;
52-
var continueReadingChunks = sampleMetadata.HasAnyChunks;
53-
List<FmodSampleChunk> chunks = new();
54-
while (continueReadingChunks)
53+
if (!sampleMetadata.HasAnyChunks)
5554
{
56-
FmodSampleChunk nextChunk = reader.ReadEndian<FmodSampleChunk>();
57-
continueReadingChunks = nextChunk.MoreChunks;
58-
chunks.Add(nextChunk);
55+
Samples.Add(sampleMetadata);
56+
continue;
5957
}
60-
61-
FmodSampleChunk.CurrentSample = null;
6258

63-
if (chunks.FirstOrDefault(c => c.ChunkType == FmodSampleChunkType.FREQUENCY) is { ChunkData: FrequencyChunkData fcd })
59+
lock (ChunkReadingLock)
6460
{
65-
sampleMetadata.FrequencyId = fcd.ActualFrequencyId;
66-
}
61+
List<FmodSampleChunk> chunks = new();
62+
FmodSampleChunk.CurrentSample = sampleMetadata;
63+
64+
FmodSampleChunk nextChunk;
65+
do
66+
{
67+
nextChunk = reader.ReadEndian<FmodSampleChunk>();
68+
chunks.Add(nextChunk);
69+
} while (nextChunk.MoreChunks);
6770

68-
sampleMetadata.Chunks = chunks;
71+
FmodSampleChunk.CurrentSample = null;
72+
73+
if (chunks.FirstOrDefault(c => c.ChunkType == FmodSampleChunkType.FREQUENCY) is { ChunkData: FrequencyChunkData fcd })
74+
{
75+
sampleMetadata.FrequencyId = fcd.ActualFrequencyId;
76+
}
77+
78+
sampleMetadata.Chunks = chunks;
6979

70-
Samples.Add(sampleMetadata);
80+
Samples.Add(sampleMetadata);
81+
}
7182
}
7283

7384
var actualSampleHeadersLength = reader.Position() - sampleHeadersStart;

Fmod5Sharp/FmodGcadPcmRebuilder.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.IO;
33
using System.Linq;
44
using Fmod5Sharp.ChunkData;
5+
using Fmod5Sharp.Util;
56
using NAudio.Wave;
67

78
namespace Fmod5Sharp

Fmod5Sharp/FmodImaAdPcmRebuilder.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.IO;
4+
using Fmod5Sharp.Util;
45
using NAudio.Wave;
56

67
namespace Fmod5Sharp

Fmod5Sharp/FmodVorbis/FmodVorbisData.cs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,22 @@
55

66
namespace Fmod5Sharp.FmodVorbis;
77

8-
public class FmodVorbisData
8+
internal class FmodVorbisData
99
{
10-
public byte[] headerBytes { get; set; }
11-
public int seekBit { get; set; }
10+
[JsonPropertyName("headerBytes")]
11+
public byte[] HeaderBytes { get; set; }
12+
13+
[JsonPropertyName("seekBit")]
14+
public int SeekBit { get; set; }
15+
16+
[JsonConstructor]
17+
public FmodVorbisData(byte[] headerBytes, int seekBit)
18+
{
19+
HeaderBytes = headerBytes;
20+
SeekBit = seekBit;
21+
}
1222

13-
[JsonIgnore] public byte[] blockFlags { get; private set; } = Array.Empty<byte>();
23+
[JsonIgnore] public byte[] BlockFlags { get; private set; } = Array.Empty<byte>();
1424

1525
private bool _initialized;
1626

@@ -21,7 +31,7 @@ internal void InitBlockFlags()
2131

2232
_initialized = true;
2333

24-
var bitStream = new BitStream(headerBytes);
34+
var bitStream = new BitStream(HeaderBytes);
2535

2636
if (bitStream.ReadByte() != 5) //packing type 5 == books
2737
return;
@@ -30,13 +40,13 @@ internal void InitBlockFlags()
3040
return;
3141

3242
//Whole bytes, bit remainder
33-
bitStream.Seek(seekBit / 8, seekBit % 8);
43+
bitStream.Seek(SeekBit / 8, SeekBit % 8);
3444

3545
//Read 6 bits and add one
3646
var numModes = bitStream.ReadByte(6) + 1;
3747

3848
//Read the first bit of each mode and skip the rest of the mode data. These are our flags.
39-
blockFlags = Enumerable.Range(0, numModes).Select(_ =>
49+
BlockFlags = Enumerable.Range(0, numModes).Select(_ =>
4050
{
4151
var flag = (byte)bitStream.ReadBit();
4252

@@ -58,10 +68,10 @@ public int GetPacketBlockSize(byte[] packetBytes)
5868

5969
var mode = 0;
6070

61-
if (blockFlags.Length > 0)
62-
mode = bitStream.ReadByte(blockFlags.Length - 1);
71+
if (BlockFlags.Length > 0)
72+
mode = bitStream.ReadByte(BlockFlags.Length - 1);
6373

64-
if (blockFlags[mode] == 1)
74+
if (BlockFlags[mode] == 1)
6575
return 2048;
6676

6777
return 256;

Fmod5Sharp/FmodVorbis/FmodVorbisRebuilder.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Reflection;
66
using System.Text.Json;
77
using Fmod5Sharp.ChunkData;
8+
using Fmod5Sharp.Util;
89
using OggVorbisEncoder;
910

1011
namespace Fmod5Sharp.FmodVorbis
@@ -20,7 +21,7 @@ private static void LoadVorbisHeaders()
2021
using StreamReader reader = new(stream);
2122

2223
var jsonString = reader.ReadToEnd();
23-
headers = JsonSerializer.Deserialize<Dictionary<uint, FmodVorbisData>>(jsonString);
24+
headers = JsonSerializer.Deserialize(jsonString, Fmod5SharpJsonContext.Default.DictionaryUInt32FmodVorbisData);
2425
}
2526

2627
public static byte[] RebuildOggFile(FmodSample sample)
@@ -46,13 +47,12 @@ public static byte[] RebuildOggFile(FmodSample sample)
4647

4748
var infoPacket = BuildInfoPacket((byte)sample.Metadata.Channels, sample.Metadata.Frequency);
4849
var commentPacket = BuildCommentPacket("Fmod5Sharp (Samboy063)");
49-
var setupPacket = new OggPacket(vorbisData.headerBytes, false, 0, 2);
50+
var setupPacket = new OggPacket(vorbisData.HeaderBytes, false, 0, 2);
5051

5152
//Begin building the final stream
5253
var oggStream = new OggStream(1);
5354
using var outputStream = new MemoryStream();
5455

55-
//TODO Do we need to flush pages between these packets?
5656
oggStream.PacketIn(infoPacket);
5757
oggStream.PacketIn(commentPacket);
5858
oggStream.PacketIn(setupPacket);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System.Collections.Generic;
2+
using System.Text.Json.Serialization;
3+
using Fmod5Sharp.FmodVorbis;
4+
5+
namespace Fmod5Sharp.Util;
6+
7+
[JsonSerializable(typeof(Dictionary<uint, FmodVorbisData>))]
8+
internal partial class Fmod5SharpJsonContext : JsonSerializerContext
9+
{
10+
11+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System;
22

3-
namespace Fmod5Sharp
3+
namespace Fmod5Sharp.Util
44
{
55
internal static class Utils
66
{

0 commit comments

Comments
 (0)