Skip to content

Commit

Permalink
Add generic Struct serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
julianxhokaxhiu committed Sep 26, 2020
1 parent d33b013 commit 4525c0d
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 72 deletions.
71 changes: 11 additions & 60 deletions src/Core/DataStructures.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,6 @@ struct ADPCMCOEFSET
{
public ushort Coef1;
public ushort Coef2;

public void Serialize(BinaryWriter writer)
{
writer.Write(BitConverter.GetBytes(Coef1));
writer.Write(BitConverter.GetBytes(Coef2));
}
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
Expand All @@ -39,17 +33,6 @@ struct WAVEFORMATEX
public ushort BlockAlign;
public ushort BitsPerSample;
public ushort cbSize;

public void Serialize(BinaryWriter writer)
{
writer.Write(BitConverter.GetBytes(FormatTag));
writer.Write(BitConverter.GetBytes(Channels));
writer.Write(BitConverter.GetBytes(SamplesPerSec));
writer.Write(BitConverter.GetBytes(AvgBytesPerSec));
writer.Write(BitConverter.GetBytes(BlockAlign));
writer.Write(BitConverter.GetBytes(BitsPerSample));
writer.Write(BitConverter.GetBytes(cbSize));
}
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
Expand All @@ -60,76 +43,43 @@ struct ADPCMWAVEFORMAT
public ushort NumCoef;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public ADPCMCOEFSET[] Coef;

public void Serialize(BinaryWriter writer)
{
waveFormatEx.Serialize(writer);
writer.Write(BitConverter.GetBytes(SamplesPerBlock));
writer.Write(BitConverter.GetBytes(NumCoef));
for (ushort idx = 0; idx < 7; idx++) Coef[idx].Serialize(writer);
}
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct RiffChunk
{
public string Id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public char[] Id;
public uint Size;
public string Format;

public void Serialize(BinaryWriter writer)
{
writer.Write(Encoding.ASCII.GetBytes(Id));
writer.Write(BitConverter.GetBytes(Size));
writer.Write(Encoding.ASCII.GetBytes(Format));
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public char[] Format;
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct FormatChunk
{
public string Id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public char[] Id;
public uint Size;
public ADPCMWAVEFORMAT ADPCM;

public void Serialize(BinaryWriter writer)
{
writer.Write(Encoding.ASCII.GetBytes(Id));
writer.Write(BitConverter.GetBytes(Size));
ADPCM.Serialize(writer);
}
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct DataChunk
{
public string Id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public char[] Id;
public uint Size;
public byte[] Data;

public void Serialize(BinaryWriter writer)
{
writer.Write(Encoding.ASCII.GetBytes(Id));
writer.Write(BitConverter.GetBytes(Size));
writer.Write(Data, 0, Data.Length);
}
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct LoopChunk
{
public string Id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public char[] Id;
public uint Size;
public uint Start;
public uint End;

public void Serialize(BinaryWriter writer)
{
writer.Write(Encoding.ASCII.GetBytes(Id));
writer.Write(BitConverter.GetBytes(Size));
writer.Write(BitConverter.GetBytes(Start));
writer.Write(BitConverter.GetBytes(End));
}
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
Expand All @@ -140,5 +90,6 @@ struct AudioFile
public FormatChunk formatChunk;
public LoopChunk loopChunk;
public DataChunk dataChunk;
public byte[] Data;
}
}
24 changes: 12 additions & 12 deletions src/Entry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,26 +46,26 @@ private void parseAudioFile(string audioDat, string audioFmt)
audioList[idx].fmtHeader = fmtHeader;

// Set Header Info
audioList[idx].riffChunk.Id = "RIFF";
audioList[idx].riffChunk.Id = "RIFF".ToArray();
audioList[idx].riffChunk.Size = 0;
audioList[idx].riffChunk.Format = "WAVE";
audioList[idx].riffChunk.Format = "WAVE".ToArray();

// Set Format Info
audioList[idx].formatChunk.Id = "fmt ";
audioList[idx].formatChunk.Id = "fmt ".ToArray();
audioList[idx].formatChunk.Size = (uint)Marshal.SizeOf(typeof(ADPCMWAVEFORMAT));
audioList[idx].formatChunk.ADPCM = fileFmt.ReadStruct<ADPCMWAVEFORMAT>();

// Set Loop Info
audioList[idx].loopChunk.Id = "fflp";
audioList[idx].loopChunk.Id = "fflp".ToArray();
audioList[idx].loopChunk.Size = (uint)Marshal.SizeOf(typeof(uint)) * 2;
audioList[idx].loopChunk.Start = fmtHeader.Start;
audioList[idx].loopChunk.End = fmtHeader.End;

// Set Data Info
audioList[idx].dataChunk.Id = "data";
audioList[idx].dataChunk.Id = "data".ToArray();
audioList[idx].dataChunk.Size = fmtHeader.Length;
audioList[idx].dataChunk.Data = new byte[audioList[idx].dataChunk.Size];
fileDat.Read(audioList[idx].dataChunk.Data, 0, audioList[idx].dataChunk.Data.Length);
audioList[idx].Data = new byte[audioList[idx].dataChunk.Size];
fileDat.Read(audioList[idx].Data, 0, audioList[idx].Data.Length);

// Finish saving some last info
audioList[idx].riffChunk.Size = (uint)(audioList[idx].riffChunk.Id.Length + Marshal.SizeOf(typeof(FormatChunk)) + Marshal.SizeOf(typeof(DataChunk)) + audioList[idx].dataChunk.Size);
Expand All @@ -78,14 +78,14 @@ private void parseAudioFile(string audioDat, string audioFmt)

private void getWaveStream(Stream stream, int idx)
{
BinaryWriter writer = new BinaryWriter(stream);
AudioFile audioFile = audioList[idx];

audioFile.riffChunk.Serialize(writer);
audioFile.formatChunk.Serialize(writer);
audioFile.dataChunk.Serialize(writer);
stream.WriteStruct<RiffChunk>(audioFile.riffChunk);
stream.WriteStruct<FormatChunk>(audioFile.formatChunk);
stream.WriteStruct<DataChunk>(audioFile.dataChunk);
stream.Write(audioFile.Data, 0, audioFile.Data.Length);

if (audioFile.fmtHeader.Loop > 0) audioFile.loopChunk.Serialize(writer);
if (audioFile.fmtHeader.Loop > 0) stream.WriteStruct<LoopChunk>(audioFile.loopChunk);
}

private void renderList()
Expand Down
11 changes: 11 additions & 0 deletions src/Extensions/StreamExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,17 @@ public static class StreamExtensions
return structure;
}

public static void WriteStruct<T>(this Stream stream, T data) where T : struct
{
var sz = Marshal.SizeOf(data);
IntPtr pStruct = Marshal.AllocHGlobal(sz);
Marshal.StructureToPtr(data, pStruct, false);
var buffer = Array.CreateInstance(typeof(byte), sz) as byte[];
Marshal.Copy(pStruct, buffer, 0, buffer.Length);
stream.Write(buffer, 0, sz);
Marshal.Release(pStruct);
}

public static long SeekStruct<T>(this Stream stream) where T : struct
{
var sz = Marshal.SizeOf(typeof(T));
Expand Down

0 comments on commit 4525c0d

Please sign in to comment.