diff --git a/BNS.cs b/BNS.cs index 9872a23..629cac6 100644 --- a/BNS.cs +++ b/BNS.cs @@ -690,4 +690,498 @@ namespace libWiiSharp #endregion #endregion } + internal class BNS_Data + { + private readonly byte[] magic = new byte[4] + { + 68, + 65, + 84, + 65 + }; + private uint size = 315392; + private byte[] data; + + public uint Size + { + get => size; + set => size = value; + } + + public byte[] Data + { + get => data; + set => data = value; + } + + public void Write(Stream outStream) + { + byte[] bytes = BitConverter.GetBytes(Shared.Swap(size)); + outStream.Write(magic, 0, magic.Length); + outStream.Write(bytes, 0, bytes.Length); + outStream.Write(data, 0, data.Length); + } + + public void Read(Stream input) + { + BinaryReader binaryReader = new BinaryReader(input); + size = Shared.CompareByteArrays(magic, binaryReader.ReadBytes(4)) ? Shared.Swap(binaryReader.ReadUInt32()) : throw new Exception("This is not a valid BNS audfo file!"); + data = binaryReader.ReadBytes((int)size - 8); + } + } + internal class BNS_Header + { + private readonly byte[] magic = new byte[4] + { + 66, + 78, + 83, + 32 + }; + private uint flags = 4278124800; + private uint fileSize = 315584; + private ushort size = 32; + private ushort chunkCount = 2; + private uint infoOffset = 32; + private uint infoLength = 160; + private uint dataOffset = 192; + private uint dataLength = 315392; + + public uint DataOffset + { + get => dataOffset; + set => dataOffset = value; + } + + public uint InfoLength + { + get => infoLength; + set => infoLength = value; + } + + public ushort Size + { + get => size; + set => size = value; + } + + public uint DataLength + { + get => dataLength; + set => dataLength = value; + } + + public uint FileSize + { + get => fileSize; + set => fileSize = value; + } + + public void Write(Stream outStream) + { + outStream.Write(magic, 0, magic.Length); + byte[] bytes1 = BitConverter.GetBytes(flags); + Array.Reverse(bytes1); + outStream.Write(bytes1, 0, bytes1.Length); + byte[] bytes2 = BitConverter.GetBytes(fileSize); + Array.Reverse(bytes2); + outStream.Write(bytes2, 0, bytes2.Length); + byte[] bytes3 = BitConverter.GetBytes(size); + Array.Reverse(bytes3); + outStream.Write(bytes3, 0, bytes3.Length); + byte[] bytes4 = BitConverter.GetBytes(chunkCount); + Array.Reverse(bytes4); + outStream.Write(bytes4, 0, bytes4.Length); + byte[] bytes5 = BitConverter.GetBytes(infoOffset); + Array.Reverse(bytes5); + outStream.Write(bytes5, 0, bytes5.Length); + byte[] bytes6 = BitConverter.GetBytes(infoLength); + Array.Reverse(bytes6); + outStream.Write(bytes6, 0, bytes6.Length); + byte[] bytes7 = BitConverter.GetBytes(dataOffset); + Array.Reverse(bytes7); + outStream.Write(bytes7, 0, bytes7.Length); + byte[] bytes8 = BitConverter.GetBytes(dataLength); + Array.Reverse(bytes8); + outStream.Write(bytes8, 0, bytes8.Length); + } + + public void Read(Stream input) + { + BinaryReader binaryReader = new BinaryReader(input); + if (!Shared.CompareByteArrays(magic, binaryReader.ReadBytes(4))) + { + binaryReader.BaseStream.Seek(28L, SeekOrigin.Current); + if (!Shared.CompareByteArrays(magic, binaryReader.ReadBytes(4))) + { + throw new Exception("This is not a valid BNS audio file!"); + } + } + flags = Shared.Swap(binaryReader.ReadUInt32()); + fileSize = Shared.Swap(binaryReader.ReadUInt32()); + size = Shared.Swap(binaryReader.ReadUInt16()); + chunkCount = Shared.Swap(binaryReader.ReadUInt16()); + infoOffset = Shared.Swap(binaryReader.ReadUInt32()); + infoLength = Shared.Swap(binaryReader.ReadUInt32()); + dataOffset = Shared.Swap(binaryReader.ReadUInt32()); + dataLength = Shared.Swap(binaryReader.ReadUInt32()); + } + } + + internal class BNS_Info + { + //Private Variables + private readonly byte[] magic = new byte[4] + { + 73, + 78, + 70, + 79 + }; + private uint size = 160; + private byte codec; + private byte hasLoop; + private byte channelCount = 2; + private byte zero; + private ushort sampleRate = 44100; + private ushort pad0; + private uint loopStart; + private uint loopEnd; //Or total sample count + private uint offsetToChannelStart = 24; + private uint pad1; + private uint channel1StartOffset = 32; + private uint channel2StartOffset = 44; + private uint channel1Start; + private uint coefficients1Offset = 56; + private uint pad2; + private uint channel2Start; + private uint coefficients2Offset = 104; + private uint pad3; + private int[] coefficients1 = new int[16]; + private ushort channel1Gain; + private ushort channel1PredictiveScale; + private ushort channel1PreviousValue; + private ushort channel1NextPreviousValue; + private ushort channel1LoopPredictiveScale; + private ushort channel1LoopPreviousValue; + private ushort channel1LoopNextPreviousValue; + private ushort channel1LoopPadding; + private int[] coefficients2 = new int[16]; + private ushort channel2Gain; + private ushort channel2PredictiveScale; + private ushort channel2PreviousValue; + private ushort channel2NextPreviousValue; + private ushort channel2LoopPredictiveScale; + private ushort channel2LoopPreviousValue; + private ushort channel2LoopNextPreviousValue; + private ushort channel2LoopPadding; + + //Public Variables + public byte HasLoop + { + get => hasLoop; + set => hasLoop = value; + } + + public uint Coefficients1Offset + { + get => coefficients1Offset; + set => coefficients1Offset = value; + } + + public uint Channel1StartOffset + { + get => channel1StartOffset; + set => channel1StartOffset = value; + } + + public uint Channel2StartOffset + { + get => channel2StartOffset; + set => channel2StartOffset = value; + } + + public uint Size + { + get => size; + set => size = value; + } + + public ushort SampleRate + { + get => sampleRate; + set => sampleRate = value; + } + + public byte ChannelCount + { + get => channelCount; + set => channelCount = value; + } + + public uint Channel1Start + { + get => channel1Start; + set => channel1Start = value; + } + + public uint Channel2Start + { + get => channel2Start; + set => channel2Start = value; + } + + public uint LoopStart + { + get => loopStart; + set => loopStart = value; + } + + public uint LoopEnd + { + get => loopEnd; + set => loopEnd = value; + } + + public int[] Coefficients1 + { + get => coefficients1; + set => coefficients1 = value; + } + + public int[] Coefficients2 + { + get => coefficients2; + set => coefficients2 = value; + } + + public void Write(Stream outStream) + { + outStream.Write(magic, 0, magic.Length); + byte[] bytes1 = BitConverter.GetBytes(size); + Array.Reverse(bytes1); + outStream.Write(bytes1, 0, bytes1.Length); + outStream.WriteByte(codec); + outStream.WriteByte(hasLoop); + outStream.WriteByte(channelCount); + outStream.WriteByte(zero); + byte[] bytes2 = BitConverter.GetBytes(sampleRate); + Array.Reverse(bytes2); + outStream.Write(bytes2, 0, bytes2.Length); + byte[] bytes3 = BitConverter.GetBytes(pad0); + Array.Reverse(bytes3); + outStream.Write(bytes3, 0, bytes3.Length); + byte[] bytes4 = BitConverter.GetBytes(loopStart); + Array.Reverse(bytes4); + outStream.Write(bytes4, 0, bytes4.Length); + byte[] bytes5 = BitConverter.GetBytes(loopEnd); + Array.Reverse(bytes5); + outStream.Write(bytes5, 0, bytes5.Length); + byte[] bytes6 = BitConverter.GetBytes(offsetToChannelStart); + Array.Reverse(bytes6); + outStream.Write(bytes6, 0, bytes6.Length); + byte[] bytes7 = BitConverter.GetBytes(pad1); + Array.Reverse(bytes7); + outStream.Write(bytes7, 0, bytes7.Length); + byte[] bytes8 = BitConverter.GetBytes(channel1StartOffset); + Array.Reverse(bytes8); + outStream.Write(bytes8, 0, bytes8.Length); + byte[] bytes9 = BitConverter.GetBytes(channel2StartOffset); + Array.Reverse(bytes9); + outStream.Write(bytes9, 0, bytes9.Length); + byte[] bytes10 = BitConverter.GetBytes(channel1Start); + Array.Reverse(bytes10); + outStream.Write(bytes10, 0, bytes10.Length); + byte[] bytes11 = BitConverter.GetBytes(coefficients1Offset); + Array.Reverse(bytes11); + outStream.Write(bytes11, 0, bytes11.Length); + if (channelCount == 2) + { + byte[] bytes12 = BitConverter.GetBytes(pad2); + Array.Reverse(bytes12); + outStream.Write(bytes12, 0, bytes12.Length); + byte[] bytes13 = BitConverter.GetBytes(channel2Start); + Array.Reverse(bytes13); + outStream.Write(bytes13, 0, bytes13.Length); + byte[] bytes14 = BitConverter.GetBytes(coefficients2Offset); + Array.Reverse(bytes14); + outStream.Write(bytes14, 0, bytes14.Length); + byte[] bytes15 = BitConverter.GetBytes(pad3); + Array.Reverse(bytes15); + outStream.Write(bytes15, 0, bytes15.Length); + foreach (int num in coefficients1) + { + byte[] bytes16 = BitConverter.GetBytes(num); + Array.Reverse(bytes16); + outStream.Write(bytes16, 2, bytes16.Length - 2); + } + byte[] bytes17 = BitConverter.GetBytes(channel1Gain); + Array.Reverse(bytes17); + outStream.Write(bytes17, 0, bytes17.Length); + byte[] bytes18 = BitConverter.GetBytes(channel1PredictiveScale); + Array.Reverse(bytes18); + outStream.Write(bytes18, 0, bytes18.Length); + byte[] bytes19 = BitConverter.GetBytes(channel1PreviousValue); + Array.Reverse(bytes19); + outStream.Write(bytes19, 0, bytes19.Length); + byte[] bytes20 = BitConverter.GetBytes(channel1NextPreviousValue); + Array.Reverse(bytes20); + outStream.Write(bytes20, 0, bytes20.Length); + byte[] bytes21 = BitConverter.GetBytes(channel1LoopPredictiveScale); + Array.Reverse(bytes21); + outStream.Write(bytes21, 0, bytes21.Length); + byte[] bytes22 = BitConverter.GetBytes(channel1LoopPreviousValue); + Array.Reverse(bytes22); + outStream.Write(bytes22, 0, bytes22.Length); + byte[] bytes23 = BitConverter.GetBytes(channel1LoopNextPreviousValue); + Array.Reverse(bytes23); + outStream.Write(bytes23, 0, bytes23.Length); + byte[] bytes24 = BitConverter.GetBytes(channel1LoopPadding); + Array.Reverse(bytes24); + outStream.Write(bytes24, 0, bytes24.Length); + foreach (int num in coefficients2) + { + byte[] bytes16 = BitConverter.GetBytes(num); + Array.Reverse(bytes16); + outStream.Write(bytes16, 2, bytes16.Length - 2); + } + byte[] bytes25 = BitConverter.GetBytes(channel2Gain); + Array.Reverse(bytes25); + outStream.Write(bytes25, 0, bytes25.Length); + byte[] bytes26 = BitConverter.GetBytes(channel2PredictiveScale); + Array.Reverse(bytes26); + outStream.Write(bytes26, 0, bytes26.Length); + byte[] bytes27 = BitConverter.GetBytes(channel2PreviousValue); + Array.Reverse(bytes27); + outStream.Write(bytes27, 0, bytes27.Length); + byte[] bytes28 = BitConverter.GetBytes(channel2NextPreviousValue); + Array.Reverse(bytes28); + outStream.Write(bytes28, 0, bytes28.Length); + byte[] bytes29 = BitConverter.GetBytes(channel2LoopPredictiveScale); + Array.Reverse(bytes29); + outStream.Write(bytes29, 0, bytes29.Length); + byte[] bytes30 = BitConverter.GetBytes(channel2LoopPreviousValue); + Array.Reverse(bytes30); + outStream.Write(bytes30, 0, bytes30.Length); + byte[] bytes31 = BitConverter.GetBytes(channel2LoopNextPreviousValue); + Array.Reverse(bytes31); + outStream.Write(bytes31, 0, bytes31.Length); + byte[] bytes32 = BitConverter.GetBytes(channel2LoopPadding); + Array.Reverse(bytes32); + outStream.Write(bytes32, 0, bytes32.Length); + } + else + { + if (channelCount != 1) + { + return; + } + + foreach (int num in coefficients1) + { + byte[] bytes12 = BitConverter.GetBytes(num); + Array.Reverse(bytes12); + outStream.Write(bytes12, 2, bytes12.Length - 2); + } + byte[] bytes13 = BitConverter.GetBytes(channel1Gain); + Array.Reverse(bytes13); + outStream.Write(bytes13, 0, bytes13.Length); + byte[] bytes14 = BitConverter.GetBytes(channel1PredictiveScale); + Array.Reverse(bytes14); + outStream.Write(bytes14, 0, bytes14.Length); + byte[] bytes15 = BitConverter.GetBytes(channel1PreviousValue); + Array.Reverse(bytes15); + outStream.Write(bytes15, 0, bytes15.Length); + byte[] bytes16 = BitConverter.GetBytes(channel1NextPreviousValue); + Array.Reverse(bytes16); + outStream.Write(bytes16, 0, bytes16.Length); + byte[] bytes17 = BitConverter.GetBytes(channel1LoopPredictiveScale); + Array.Reverse(bytes17); + outStream.Write(bytes17, 0, bytes17.Length); + byte[] bytes18 = BitConverter.GetBytes(channel1LoopPreviousValue); + Array.Reverse(bytes18); + outStream.Write(bytes18, 0, bytes18.Length); + byte[] bytes19 = BitConverter.GetBytes(channel1LoopNextPreviousValue); + Array.Reverse(bytes19); + outStream.Write(bytes19, 0, bytes19.Length); + byte[] bytes20 = BitConverter.GetBytes(channel1LoopPadding); + Array.Reverse(bytes20); + outStream.Write(bytes20, 0, bytes20.Length); + } + } + + public void Read(Stream input) + { + BinaryReader binaryReader = new BinaryReader(input); + size = Shared.CompareByteArrays(magic, binaryReader.ReadBytes(4)) ? Shared.Swap(binaryReader.ReadUInt32()) : throw new Exception("This is not a valid BNS audfo file!"); + codec = binaryReader.ReadByte(); + hasLoop = binaryReader.ReadByte(); + channelCount = binaryReader.ReadByte(); + zero = binaryReader.ReadByte(); + sampleRate = Shared.Swap(binaryReader.ReadUInt16()); + pad0 = Shared.Swap(binaryReader.ReadUInt16()); + loopStart = Shared.Swap(binaryReader.ReadUInt32()); + loopEnd = Shared.Swap(binaryReader.ReadUInt32()); + offsetToChannelStart = Shared.Swap(binaryReader.ReadUInt32()); + pad1 = Shared.Swap(binaryReader.ReadUInt32()); + channel1StartOffset = Shared.Swap(binaryReader.ReadUInt32()); + channel2StartOffset = Shared.Swap(binaryReader.ReadUInt32()); + channel1Start = Shared.Swap(binaryReader.ReadUInt32()); + coefficients1Offset = Shared.Swap(binaryReader.ReadUInt32()); + if (channelCount == 2) + { + pad2 = Shared.Swap(binaryReader.ReadUInt32()); + channel2Start = Shared.Swap(binaryReader.ReadUInt32()); + coefficients2Offset = Shared.Swap(binaryReader.ReadUInt32()); + pad3 = Shared.Swap(binaryReader.ReadUInt32()); + for (int index = 0; index < 16; ++index) + { + coefficients1[index] = (short)Shared.Swap(binaryReader.ReadUInt16()); + } + + channel1Gain = Shared.Swap(binaryReader.ReadUInt16()); + channel1PredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); + channel1PreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel1NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel1LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); + channel1LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel1LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel1LoopPadding = Shared.Swap(binaryReader.ReadUInt16()); + for (int index = 0; index < 16; ++index) + { + coefficients2[index] = (short)Shared.Swap(binaryReader.ReadUInt16()); + } + + channel2Gain = Shared.Swap(binaryReader.ReadUInt16()); + channel2PredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); + channel2PreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel2NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel2LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); + channel2LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel2LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel2LoopPadding = Shared.Swap(binaryReader.ReadUInt16()); + } + else + { + if (channelCount != 1) + { + return; + } + + for (int index = 0; index < 16; ++index) + { + coefficients1[index] = (short)Shared.Swap(binaryReader.ReadUInt16()); + } + + channel1Gain = Shared.Swap(binaryReader.ReadUInt16()); + channel1PredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); + channel1PreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel1NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel1LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); + channel1LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel1LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); + channel1LoopPadding = Shared.Swap(binaryReader.ReadUInt16()); + } + } + } } \ No newline at end of file diff --git a/BNS_Data.cs b/BNS_Data.cs deleted file mode 100644 index 95a6e3d..0000000 --- a/BNS_Data.cs +++ /dev/null @@ -1,63 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - internal class BNS_Data - { - private readonly byte[] magic = new byte[4] - { - 68, - 65, - 84, - 65 - }; - private uint size = 315392; - private byte[] data; - - public uint Size - { - get => size; - set => size = value; - } - - public byte[] Data - { - get => data; - set => data = value; - } - - public void Write(Stream outStream) - { - byte[] bytes = BitConverter.GetBytes(Shared.Swap(size)); - outStream.Write(magic, 0, magic.Length); - outStream.Write(bytes, 0, bytes.Length); - outStream.Write(data, 0, data.Length); - } - - public void Read(Stream input) - { - BinaryReader binaryReader = new BinaryReader(input); - size = Shared.CompareByteArrays(magic, binaryReader.ReadBytes(4)) ? Shared.Swap(binaryReader.ReadUInt32()) : throw new Exception("This is not a valid BNS audfo file!"); - data = binaryReader.ReadBytes((int)size - 8); - } - } -} diff --git a/BNS_Header.cs b/BNS_Header.cs deleted file mode 100644 index 740429b..0000000 --- a/BNS_Header.cs +++ /dev/null @@ -1,122 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - internal class BNS_Header - { - private readonly byte[] magic = new byte[4] - { - 66, - 78, - 83, - 32 - }; - private uint flags = 4278124800; - private uint fileSize = 315584; - private ushort size = 32; - private ushort chunkCount = 2; - private uint infoOffset = 32; - private uint infoLength = 160; - private uint dataOffset = 192; - private uint dataLength = 315392; - - public uint DataOffset - { - get => dataOffset; - set => dataOffset = value; - } - - public uint InfoLength - { - get => infoLength; - set => infoLength = value; - } - - public ushort Size - { - get => size; - set => size = value; - } - - public uint DataLength - { - get => dataLength; - set => dataLength = value; - } - - public uint FileSize - { - get => fileSize; - set => fileSize = value; - } - - public void Write(Stream outStream) - { - outStream.Write(magic, 0, magic.Length); - byte[] bytes1 = BitConverter.GetBytes(flags); - Array.Reverse(bytes1); - outStream.Write(bytes1, 0, bytes1.Length); - byte[] bytes2 = BitConverter.GetBytes(fileSize); - Array.Reverse(bytes2); - outStream.Write(bytes2, 0, bytes2.Length); - byte[] bytes3 = BitConverter.GetBytes(size); - Array.Reverse(bytes3); - outStream.Write(bytes3, 0, bytes3.Length); - byte[] bytes4 = BitConverter.GetBytes(chunkCount); - Array.Reverse(bytes4); - outStream.Write(bytes4, 0, bytes4.Length); - byte[] bytes5 = BitConverter.GetBytes(infoOffset); - Array.Reverse(bytes5); - outStream.Write(bytes5, 0, bytes5.Length); - byte[] bytes6 = BitConverter.GetBytes(infoLength); - Array.Reverse(bytes6); - outStream.Write(bytes6, 0, bytes6.Length); - byte[] bytes7 = BitConverter.GetBytes(dataOffset); - Array.Reverse(bytes7); - outStream.Write(bytes7, 0, bytes7.Length); - byte[] bytes8 = BitConverter.GetBytes(dataLength); - Array.Reverse(bytes8); - outStream.Write(bytes8, 0, bytes8.Length); - } - - public void Read(Stream input) - { - BinaryReader binaryReader = new BinaryReader(input); - if (!Shared.CompareByteArrays(magic, binaryReader.ReadBytes(4))) - { - binaryReader.BaseStream.Seek(28L, SeekOrigin.Current); - if (!Shared.CompareByteArrays(magic, binaryReader.ReadBytes(4))) - { - throw new Exception("This is not a valid BNS audio file!"); - } - } - flags = Shared.Swap(binaryReader.ReadUInt32()); - fileSize = Shared.Swap(binaryReader.ReadUInt32()); - size = Shared.Swap(binaryReader.ReadUInt16()); - chunkCount = Shared.Swap(binaryReader.ReadUInt16()); - infoOffset = Shared.Swap(binaryReader.ReadUInt32()); - infoLength = Shared.Swap(binaryReader.ReadUInt32()); - dataOffset = Shared.Swap(binaryReader.ReadUInt32()); - dataLength = Shared.Swap(binaryReader.ReadUInt32()); - } - } -} diff --git a/BNS_Info.cs b/BNS_Info.cs deleted file mode 100644 index 5c1e0df..0000000 --- a/BNS_Info.cs +++ /dev/null @@ -1,380 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - internal class BNS_Info - { - //Private Variables - private readonly byte[] magic = new byte[4] - { - 73, - 78, - 70, - 79 - }; - private uint size = 160; - private byte codec; - private byte hasLoop; - private byte channelCount = 2; - private byte zero; - private ushort sampleRate = 44100; - private ushort pad0; - private uint loopStart; - private uint loopEnd; //Or total sample count - private uint offsetToChannelStart = 24; - private uint pad1; - private uint channel1StartOffset = 32; - private uint channel2StartOffset = 44; - private uint channel1Start; - private uint coefficients1Offset = 56; - private uint pad2; - private uint channel2Start; - private uint coefficients2Offset = 104; - private uint pad3; - private int[] coefficients1 = new int[16]; - private ushort channel1Gain; - private ushort channel1PredictiveScale; - private ushort channel1PreviousValue; - private ushort channel1NextPreviousValue; - private ushort channel1LoopPredictiveScale; - private ushort channel1LoopPreviousValue; - private ushort channel1LoopNextPreviousValue; - private ushort channel1LoopPadding; - private int[] coefficients2 = new int[16]; - private ushort channel2Gain; - private ushort channel2PredictiveScale; - private ushort channel2PreviousValue; - private ushort channel2NextPreviousValue; - private ushort channel2LoopPredictiveScale; - private ushort channel2LoopPreviousValue; - private ushort channel2LoopNextPreviousValue; - private ushort channel2LoopPadding; - - //Public Variables - public byte HasLoop - { - get => hasLoop; - set => hasLoop = value; - } - - public uint Coefficients1Offset - { - get => coefficients1Offset; - set => coefficients1Offset = value; - } - - public uint Channel1StartOffset - { - get => channel1StartOffset; - set => channel1StartOffset = value; - } - - public uint Channel2StartOffset - { - get => channel2StartOffset; - set => channel2StartOffset = value; - } - - public uint Size - { - get => size; - set => size = value; - } - - public ushort SampleRate - { - get => sampleRate; - set => sampleRate = value; - } - - public byte ChannelCount - { - get => channelCount; - set => channelCount = value; - } - - public uint Channel1Start - { - get => channel1Start; - set => channel1Start = value; - } - - public uint Channel2Start - { - get => channel2Start; - set => channel2Start = value; - } - - public uint LoopStart - { - get => loopStart; - set => loopStart = value; - } - - public uint LoopEnd - { - get => loopEnd; - set => loopEnd = value; - } - - public int[] Coefficients1 - { - get => coefficients1; - set => coefficients1 = value; - } - - public int[] Coefficients2 - { - get => coefficients2; - set => coefficients2 = value; - } - - public void Write(Stream outStream) - { - outStream.Write(magic, 0, magic.Length); - byte[] bytes1 = BitConverter.GetBytes(size); - Array.Reverse(bytes1); - outStream.Write(bytes1, 0, bytes1.Length); - outStream.WriteByte(codec); - outStream.WriteByte(hasLoop); - outStream.WriteByte(channelCount); - outStream.WriteByte(zero); - byte[] bytes2 = BitConverter.GetBytes(sampleRate); - Array.Reverse(bytes2); - outStream.Write(bytes2, 0, bytes2.Length); - byte[] bytes3 = BitConverter.GetBytes(pad0); - Array.Reverse(bytes3); - outStream.Write(bytes3, 0, bytes3.Length); - byte[] bytes4 = BitConverter.GetBytes(loopStart); - Array.Reverse(bytes4); - outStream.Write(bytes4, 0, bytes4.Length); - byte[] bytes5 = BitConverter.GetBytes(loopEnd); - Array.Reverse(bytes5); - outStream.Write(bytes5, 0, bytes5.Length); - byte[] bytes6 = BitConverter.GetBytes(offsetToChannelStart); - Array.Reverse(bytes6); - outStream.Write(bytes6, 0, bytes6.Length); - byte[] bytes7 = BitConverter.GetBytes(pad1); - Array.Reverse(bytes7); - outStream.Write(bytes7, 0, bytes7.Length); - byte[] bytes8 = BitConverter.GetBytes(channel1StartOffset); - Array.Reverse(bytes8); - outStream.Write(bytes8, 0, bytes8.Length); - byte[] bytes9 = BitConverter.GetBytes(channel2StartOffset); - Array.Reverse(bytes9); - outStream.Write(bytes9, 0, bytes9.Length); - byte[] bytes10 = BitConverter.GetBytes(channel1Start); - Array.Reverse(bytes10); - outStream.Write(bytes10, 0, bytes10.Length); - byte[] bytes11 = BitConverter.GetBytes(coefficients1Offset); - Array.Reverse(bytes11); - outStream.Write(bytes11, 0, bytes11.Length); - if (channelCount == 2) - { - byte[] bytes12 = BitConverter.GetBytes(pad2); - Array.Reverse(bytes12); - outStream.Write(bytes12, 0, bytes12.Length); - byte[] bytes13 = BitConverter.GetBytes(channel2Start); - Array.Reverse(bytes13); - outStream.Write(bytes13, 0, bytes13.Length); - byte[] bytes14 = BitConverter.GetBytes(coefficients2Offset); - Array.Reverse(bytes14); - outStream.Write(bytes14, 0, bytes14.Length); - byte[] bytes15 = BitConverter.GetBytes(pad3); - Array.Reverse(bytes15); - outStream.Write(bytes15, 0, bytes15.Length); - foreach (int num in coefficients1) - { - byte[] bytes16 = BitConverter.GetBytes(num); - Array.Reverse(bytes16); - outStream.Write(bytes16, 2, bytes16.Length - 2); - } - byte[] bytes17 = BitConverter.GetBytes(channel1Gain); - Array.Reverse(bytes17); - outStream.Write(bytes17, 0, bytes17.Length); - byte[] bytes18 = BitConverter.GetBytes(channel1PredictiveScale); - Array.Reverse(bytes18); - outStream.Write(bytes18, 0, bytes18.Length); - byte[] bytes19 = BitConverter.GetBytes(channel1PreviousValue); - Array.Reverse(bytes19); - outStream.Write(bytes19, 0, bytes19.Length); - byte[] bytes20 = BitConverter.GetBytes(channel1NextPreviousValue); - Array.Reverse(bytes20); - outStream.Write(bytes20, 0, bytes20.Length); - byte[] bytes21 = BitConverter.GetBytes(channel1LoopPredictiveScale); - Array.Reverse(bytes21); - outStream.Write(bytes21, 0, bytes21.Length); - byte[] bytes22 = BitConverter.GetBytes(channel1LoopPreviousValue); - Array.Reverse(bytes22); - outStream.Write(bytes22, 0, bytes22.Length); - byte[] bytes23 = BitConverter.GetBytes(channel1LoopNextPreviousValue); - Array.Reverse(bytes23); - outStream.Write(bytes23, 0, bytes23.Length); - byte[] bytes24 = BitConverter.GetBytes(channel1LoopPadding); - Array.Reverse(bytes24); - outStream.Write(bytes24, 0, bytes24.Length); - foreach (int num in coefficients2) - { - byte[] bytes16 = BitConverter.GetBytes(num); - Array.Reverse(bytes16); - outStream.Write(bytes16, 2, bytes16.Length - 2); - } - byte[] bytes25 = BitConverter.GetBytes(channel2Gain); - Array.Reverse(bytes25); - outStream.Write(bytes25, 0, bytes25.Length); - byte[] bytes26 = BitConverter.GetBytes(channel2PredictiveScale); - Array.Reverse(bytes26); - outStream.Write(bytes26, 0, bytes26.Length); - byte[] bytes27 = BitConverter.GetBytes(channel2PreviousValue); - Array.Reverse(bytes27); - outStream.Write(bytes27, 0, bytes27.Length); - byte[] bytes28 = BitConverter.GetBytes(channel2NextPreviousValue); - Array.Reverse(bytes28); - outStream.Write(bytes28, 0, bytes28.Length); - byte[] bytes29 = BitConverter.GetBytes(channel2LoopPredictiveScale); - Array.Reverse(bytes29); - outStream.Write(bytes29, 0, bytes29.Length); - byte[] bytes30 = BitConverter.GetBytes(channel2LoopPreviousValue); - Array.Reverse(bytes30); - outStream.Write(bytes30, 0, bytes30.Length); - byte[] bytes31 = BitConverter.GetBytes(channel2LoopNextPreviousValue); - Array.Reverse(bytes31); - outStream.Write(bytes31, 0, bytes31.Length); - byte[] bytes32 = BitConverter.GetBytes(channel2LoopPadding); - Array.Reverse(bytes32); - outStream.Write(bytes32, 0, bytes32.Length); - } - else - { - if (channelCount != 1) - { - return; - } - - foreach (int num in coefficients1) - { - byte[] bytes12 = BitConverter.GetBytes(num); - Array.Reverse(bytes12); - outStream.Write(bytes12, 2, bytes12.Length - 2); - } - byte[] bytes13 = BitConverter.GetBytes(channel1Gain); - Array.Reverse(bytes13); - outStream.Write(bytes13, 0, bytes13.Length); - byte[] bytes14 = BitConverter.GetBytes(channel1PredictiveScale); - Array.Reverse(bytes14); - outStream.Write(bytes14, 0, bytes14.Length); - byte[] bytes15 = BitConverter.GetBytes(channel1PreviousValue); - Array.Reverse(bytes15); - outStream.Write(bytes15, 0, bytes15.Length); - byte[] bytes16 = BitConverter.GetBytes(channel1NextPreviousValue); - Array.Reverse(bytes16); - outStream.Write(bytes16, 0, bytes16.Length); - byte[] bytes17 = BitConverter.GetBytes(channel1LoopPredictiveScale); - Array.Reverse(bytes17); - outStream.Write(bytes17, 0, bytes17.Length); - byte[] bytes18 = BitConverter.GetBytes(channel1LoopPreviousValue); - Array.Reverse(bytes18); - outStream.Write(bytes18, 0, bytes18.Length); - byte[] bytes19 = BitConverter.GetBytes(channel1LoopNextPreviousValue); - Array.Reverse(bytes19); - outStream.Write(bytes19, 0, bytes19.Length); - byte[] bytes20 = BitConverter.GetBytes(channel1LoopPadding); - Array.Reverse(bytes20); - outStream.Write(bytes20, 0, bytes20.Length); - } - } - - public void Read(Stream input) - { - BinaryReader binaryReader = new BinaryReader(input); - size = Shared.CompareByteArrays(magic, binaryReader.ReadBytes(4)) ? Shared.Swap(binaryReader.ReadUInt32()) : throw new Exception("This is not a valid BNS audfo file!"); - codec = binaryReader.ReadByte(); - hasLoop = binaryReader.ReadByte(); - channelCount = binaryReader.ReadByte(); - zero = binaryReader.ReadByte(); - sampleRate = Shared.Swap(binaryReader.ReadUInt16()); - pad0 = Shared.Swap(binaryReader.ReadUInt16()); - loopStart = Shared.Swap(binaryReader.ReadUInt32()); - loopEnd = Shared.Swap(binaryReader.ReadUInt32()); - offsetToChannelStart = Shared.Swap(binaryReader.ReadUInt32()); - pad1 = Shared.Swap(binaryReader.ReadUInt32()); - channel1StartOffset = Shared.Swap(binaryReader.ReadUInt32()); - channel2StartOffset = Shared.Swap(binaryReader.ReadUInt32()); - channel1Start = Shared.Swap(binaryReader.ReadUInt32()); - coefficients1Offset = Shared.Swap(binaryReader.ReadUInt32()); - if (channelCount == 2) - { - pad2 = Shared.Swap(binaryReader.ReadUInt32()); - channel2Start = Shared.Swap(binaryReader.ReadUInt32()); - coefficients2Offset = Shared.Swap(binaryReader.ReadUInt32()); - pad3 = Shared.Swap(binaryReader.ReadUInt32()); - for (int index = 0; index < 16; ++index) - { - coefficients1[index] = (short)Shared.Swap(binaryReader.ReadUInt16()); - } - - channel1Gain = Shared.Swap(binaryReader.ReadUInt16()); - channel1PredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); - channel1PreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel1NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel1LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); - channel1LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel1LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel1LoopPadding = Shared.Swap(binaryReader.ReadUInt16()); - for (int index = 0; index < 16; ++index) - { - coefficients2[index] = (short)Shared.Swap(binaryReader.ReadUInt16()); - } - - channel2Gain = Shared.Swap(binaryReader.ReadUInt16()); - channel2PredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); - channel2PreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel2NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel2LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); - channel2LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel2LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel2LoopPadding = Shared.Swap(binaryReader.ReadUInt16()); - } - else - { - if (channelCount != 1) - { - return; - } - - for (int index = 0; index < 16; ++index) - { - coefficients1[index] = (short)Shared.Swap(binaryReader.ReadUInt16()); - } - - channel1Gain = Shared.Swap(binaryReader.ReadUInt16()); - channel1PredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); - channel1PreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel1NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel1LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16()); - channel1LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel1LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16()); - channel1LoopPadding = Shared.Swap(binaryReader.ReadUInt16()); - } - } - } -} diff --git a/ColorIndexConverter.cs b/ColorIndexConverter.cs deleted file mode 100644 index 790140d..0000000 --- a/ColorIndexConverter.cs +++ /dev/null @@ -1,314 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; - -namespace libWiiSharp -{ - internal class ColorIndexConverter - { - private uint[] rgbaPalette; - private byte[] tplPalette; - private readonly uint[] rgbaData; - private byte[] tplData; - private readonly TPL_TextureFormat tplFormat; - private readonly TPL_PaletteFormat paletteFormat; - private readonly int width; - private readonly int height; - - public byte[] Palette => tplPalette; - - public byte[] Data => tplData; - - public ColorIndexConverter( - uint[] rgbaData, - int width, - int height, - TPL_TextureFormat tplFormat, - TPL_PaletteFormat paletteFormat) - { - if (tplFormat != TPL_TextureFormat.CI4 && tplFormat != TPL_TextureFormat.CI8) - { - throw new Exception("Texture format must be either CI4 or CI8"); - } - - if (paletteFormat != TPL_PaletteFormat.IA8 && paletteFormat != TPL_PaletteFormat.RGB565 && paletteFormat != TPL_PaletteFormat.RGB5A3) - { - throw new Exception("Palette format must be either IA8, RGB565 or RGB5A3!"); - } - - this.rgbaData = rgbaData; - this.width = width; - this.height = height; - this.tplFormat = tplFormat; - this.paletteFormat = paletteFormat; - BuildPalette(); - if (tplFormat != TPL_TextureFormat.CI4) - { - if (tplFormat == TPL_TextureFormat.CI8) - { - ToCI8(); - } - else - { - ToCI14X2(); - } - } - else - { - ToCI4(); - } - } - - private void ToCI4() - { - byte[] numArray = new byte[Shared.AddPadding(width, 8) * Shared.AddPadding(height, 8) / 2]; - int num = 0; - for (int index1 = 0; index1 < height; index1 += 8) - { - for (int index2 = 0; index2 < width; index2 += 8) - { - for (int index3 = index1; index3 < index1 + 8; ++index3) - { - for (int index4 = index2; index4 < index2 + 8; index4 += 2) - { - uint colorIndex1 = GetColorIndex(index3 >= height || index4 >= width ? 0U : rgbaData[index3 * width + index4]); - uint colorIndex2 = GetColorIndex(index3 >= height || index4 >= width ? 0U : (index3 * width + index4 + 1 < rgbaData.Length ? rgbaData[index3 * width + index4 + 1] : 0U)); - numArray[num++] = (byte)((uint)(byte)colorIndex1 << 4 | (byte)colorIndex2); - } - } - } - } - tplData = numArray; - } - - private void ToCI8() - { - byte[] numArray = new byte[Shared.AddPadding(width, 8) * Shared.AddPadding(height, 4)]; - int num1 = 0; - for (int index1 = 0; index1 < height; index1 += 4) - { - for (int index2 = 0; index2 < width; index2 += 8) - { - for (int index3 = index1; index3 < index1 + 4; ++index3) - { - for (int index4 = index2; index4 < index2 + 8; ++index4) - { - uint num2 = index3 >= height || index4 >= width ? 0U : rgbaData[index3 * width + index4]; - numArray[num1++] = (byte)GetColorIndex(num2); - } - } - } - } - tplData = numArray; - } - - private void ToCI14X2() - { - byte[] numArray1 = new byte[Shared.AddPadding(width, 4) * Shared.AddPadding(height, 4) * 2]; - int num1 = 0; - for (int index1 = 0; index1 < height; index1 += 4) - { - for (int index2 = 0; index2 < width; index2 += 4) - { - for (int index3 = index1; index3 < index1 + 4; ++index3) - { - for (int index4 = index2; index4 < index2 + 4; ++index4) - { - byte[] bytes = BitConverter.GetBytes((ushort)GetColorIndex(index3 >= height || index4 >= width ? 0U : rgbaData[index3 * width + index4])); - byte[] numArray2 = numArray1; - int index5 = num1; - int num2 = index5 + 1; - int num3 = bytes[1]; - numArray2[index5] = (byte)num3; - byte[] numArray3 = numArray1; - int index6 = num2; - num1 = index6 + 1; - int num4 = bytes[0]; - numArray3[index6] = (byte)num4; - } - } - } - } - tplData = numArray1; - } - - private void BuildPalette() - { - int num1 = 256; - if (tplFormat == TPL_TextureFormat.CI4) - { - num1 = 16; - } - else if (tplFormat == TPL_TextureFormat.CI14X2) - { - num1 = 16384; - } - - List uintList = new List(); - List ushortList = new List(); - uintList.Add(0U); - ushortList.Add(0); - for (int index = 1; index < rgbaData.Length && uintList.Count != num1; ++index) - { - if ((rgbaData[index] >> 24 & byte.MaxValue) >= (tplFormat == TPL_TextureFormat.CI14X2 ? 1L : 25L)) - { - ushort num2 = Shared.Swap(ConvertToPaletteValue((int)rgbaData[index])); - if (!uintList.Contains(rgbaData[index]) && !ushortList.Contains(num2)) - { - uintList.Add(rgbaData[index]); - ushortList.Add(num2); - } - } - } - while (uintList.Count % 16 != 0) - { - uintList.Add(uint.MaxValue); - ushortList.Add(ushort.MaxValue); - } - tplPalette = Shared.UShortArrayToByteArray(ushortList.ToArray()); - rgbaPalette = uintList.ToArray(); - } - - private ushort ConvertToPaletteValue(int rgba) - { - int num1 = 0; - int num2; - if (paletteFormat == TPL_PaletteFormat.IA8) - { - int num3 = ((rgba & byte.MaxValue) + (rgba >> 8 & byte.MaxValue) + (rgba >> 16 & byte.MaxValue)) / 3 & byte.MaxValue; - num2 = (ushort)((rgba >> 24 & byte.MaxValue) << 8 | num3); - } - else if (paletteFormat == TPL_PaletteFormat.RGB565) - { - num2 = (ushort)((rgba >> 16 & byte.MaxValue) >> 3 << 11 | (rgba >> 8 & byte.MaxValue) >> 2 << 5 | (rgba & byte.MaxValue) >> 3); - } - else - { - int num3 = rgba >> 16 & byte.MaxValue; - int num4 = rgba >> 8 & byte.MaxValue; - int num5 = rgba & byte.MaxValue; - int num6 = rgba >> 24 & byte.MaxValue; - if (num6 <= 218) - { - int num7 = num1 & -32769; - int num8 = num3 * 15 / byte.MaxValue & 15; - int num9 = num4 * 15 / byte.MaxValue & 15; - int num10 = num5 * 15 / byte.MaxValue & 15; - int num11 = num6 * 7 / byte.MaxValue & 7; - num2 = num7 | num11 << 12 | num10 | num9 << 4 | num8 << 8; - } - else - { - int num7 = num1 | 32768; - int num8 = num3 * 31 / byte.MaxValue & 31; - int num9 = num4 * 31 / byte.MaxValue & 31; - int num10 = num5 * 31 / byte.MaxValue & 31; - num2 = num7 | num10 | num9 << 5 | num8 << 10; - } - } - return (ushort)num2; - } - - private uint GetColorIndex(uint value) - { - uint num1 = int.MaxValue; - uint num2 = 0; - if ((value >> 24 & byte.MaxValue) < (tplFormat == TPL_TextureFormat.CI14X2 ? 1L : 25L)) - { - return 0; - } - - ushort paletteValue1 = ConvertToPaletteValue((int)value); - for (int index = 0; index < rgbaPalette.Length; ++index) - { - ushort paletteValue2 = ConvertToPaletteValue((int)rgbaPalette[index]); - if (paletteValue1 == paletteValue2) - { - return (uint)index; - } - - uint distance = GetDistance(paletteValue1, paletteValue2); - if (distance < num1) - { - num1 = distance; - num2 = (uint)index; - } - } - return num2; - } - - private uint GetDistance(ushort color, ushort paletteColor) - { - int rgbaValue1 = (int)ConvertToRgbaValue(color); - uint rgbaValue2 = ConvertToRgbaValue(paletteColor); - uint val1_1 = (uint)rgbaValue1 >> 24 & byte.MaxValue; - uint val1_2 = (uint)rgbaValue1 >> 16 & byte.MaxValue; - uint val1_3 = (uint)rgbaValue1 >> 8 & byte.MaxValue; - uint val1_4 = (uint)(rgbaValue1 & byte.MaxValue); - uint val2_1 = rgbaValue2 >> 24 & byte.MaxValue; - uint val2_2 = rgbaValue2 >> 16 & byte.MaxValue; - uint val2_3 = rgbaValue2 >> 8 & byte.MaxValue; - uint val2_4 = rgbaValue2 & byte.MaxValue; - int num1 = (int)Math.Max(val1_1, val2_1) - (int)Math.Min(val1_1, val2_1); - uint num2 = Math.Max(val1_2, val2_2) - Math.Min(val1_2, val2_2); - uint num3 = Math.Max(val1_3, val2_3) - Math.Min(val1_3, val2_3); - uint num4 = Math.Max(val1_4, val2_4) - Math.Min(val1_4, val2_4); - int num5 = (int)num2; - return (uint)(num1 + num5) + num3 + num4; - } - - private uint ConvertToRgbaValue(ushort pixel) - { - if (paletteFormat == TPL_PaletteFormat.IA8) - { - int num1 = pixel >> 8; - int num2 = pixel & byte.MaxValue; - return (uint)(num1 | num1 << 8 | num1 << 16 | num2 << 24); - } - if (paletteFormat == TPL_PaletteFormat.RGB565) - { - int num1 = (pixel >> 11 & 31) << 3 & byte.MaxValue; - int num2 = (pixel >> 5 & 63) << 2 & byte.MaxValue; - int num3 = (pixel & 31) << 3 & byte.MaxValue; - int maxValue = byte.MaxValue; - return (uint)(num3 | num2 << 8 | num1 << 16 | maxValue << 24); - } - int num4; - int num5; - int num6; - int num7; - if ((pixel & 32768) != 0) - { - num4 = (pixel >> 10 & 31) * byte.MaxValue / 31; - num5 = (pixel >> 5 & 31) * byte.MaxValue / 31; - num6 = (pixel & 31) * byte.MaxValue / 31; - num7 = byte.MaxValue; - } - else - { - num7 = (pixel >> 12 & 7) * byte.MaxValue / 7; - num4 = (pixel >> 8 & 15) * byte.MaxValue / 15; - num5 = (pixel >> 4 & 15) * byte.MaxValue / 15; - num6 = (pixel & 15) * byte.MaxValue / 15; - } - return (uint)(num6 | num5 << 8 | num4 << 16 | num7 << 24); - } - } -} diff --git a/Region.cs b/Region.cs deleted file mode 100644 index 7173172..0000000 --- a/Region.cs +++ /dev/null @@ -1,28 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace libWiiSharp -{ - public enum Region : ushort - { - Japan, - USA, - Europe, - Free, - } -} diff --git a/TMD.cs b/TMD.cs index 5656c2e..ff18ca0 100644 --- a/TMD.cs +++ b/TMD.cs @@ -23,6 +23,15 @@ using System.Security.Cryptography; namespace libWiiSharp { + + public enum Region : ushort + { + Japan, + USA, + Europe, + Free, + } + public enum ContentType : ushort { Normal = 1, @@ -598,4 +607,44 @@ namespace libWiiSharp debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); } } + + public class TMD_Content + { + private uint contentId; + private ushort index; + private ushort type; + private ulong size; + private byte[] hash = new byte[20]; + + public uint ContentID + { + get => contentId; + set => contentId = value; + } + + public ushort Index + { + get => index; + set => index = value; + } + + public ContentType Type + { + get => (ContentType)type; + set => type = (ushort)value; + } + + public ulong Size + { + get => size; + set => size = value; + } + + public byte[] Hash + { + get => hash; + set => hash = value; + } + } + } diff --git a/TMD_Content.cs b/TMD_Content.cs deleted file mode 100644 index 67267fe..0000000 --- a/TMD_Content.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace libWiiSharp -{ - public class TMD_Content - { - private uint contentId; - private ushort index; - private ushort type; - private ulong size; - private byte[] hash = new byte[20]; - - public uint ContentID - { - get => contentId; - set => contentId = value; - } - - public ushort Index - { - get => index; - set => index = value; - } - - public ContentType Type - { - get => (ContentType)type; - set => type = (ushort)value; - } - - public ulong Size - { - get => size; - set => size = value; - } - - public byte[] Hash - { - get => hash; - set => hash = value; - } - } -} diff --git a/TPL.cs b/TPL.cs index 885877d..13124c6 100644 --- a/TPL.cs +++ b/TPL.cs @@ -16,6 +16,10 @@ * along with this program. If not, see . */ +//TPL conversion based on Wii.py by Xuzz, SquidMan, megazig, Matt_P, Omega and The Lemon Man. +//Zetsubou by SquidMan was also a reference. +//Thanks to the authors! + using System; using System.Collections.Generic; using System.Drawing; @@ -25,6 +29,30 @@ using System.Runtime.InteropServices; namespace libWiiSharp { + + public enum TPL_TextureFormat + { + I4 = 0, + I8 = 1, + IA4 = 2, + IA8 = 3, + RGB565 = 4, + RGB5A3 = 5, + RGBA8 = 6, + CI4 = 8, + CI8 = 9, + CI14X2 = 10, // 0x0000000A + CMP = 14, // 0x0000000E + } + + public enum TPL_PaletteFormat + { + IA8 = 0, + RGB565 = 1, + RGB5A3 = 2, + None = 255, // 0x000000FF + } + public class TPL : IDisposable { private TPL_Header tplHeader = new TPL_Header(); @@ -1432,4 +1460,502 @@ namespace libWiiSharp debug(new object(), new MessageEventArgs(string.Format(debugMessage, args))); } } + + public class TPL_Header + { + private readonly uint tplMagic = 2142000; + private uint numOfTextures; + private readonly uint headerSize = 12; + + public uint TplMagic => tplMagic; + + public uint NumOfTextures + { + get => numOfTextures; + set => numOfTextures = value; + } + + public uint HeaderSize => headerSize; + + public void Write(Stream writeStream) + { + writeStream.Write(BitConverter.GetBytes(Shared.Swap(tplMagic)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(numOfTextures)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(headerSize)), 0, 4); + } + } + + public class TPL_TextureEntry + { + private uint textureHeaderOffset; + private uint paletteHeaderOffset; + + public uint TextureHeaderOffset + { + get => textureHeaderOffset; + set => textureHeaderOffset = value; + } + + public uint PaletteHeaderOffset + { + get => paletteHeaderOffset; + set => paletteHeaderOffset = value; + } + + public void Write(Stream writeStream) + { + writeStream.Write(BitConverter.GetBytes(Shared.Swap(textureHeaderOffset)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(paletteHeaderOffset)), 0, 4); + } + } + + public class TPL_TextureHeader + { + private ushort textureHeight; + private ushort textureWidth; + private uint textureFormat; + private uint textureDataOffset; + private uint wrapS; + private uint wrapT; + private uint minFilter = 1; + private uint magFilter = 1; + private uint lodBias; + private byte edgeLod; + private byte minLod; + private byte maxLod; + private byte unpacked; + + public ushort TextureHeight + { + get => textureHeight; + set => textureHeight = value; + } + + public ushort TextureWidth + { + get => textureWidth; + set => textureWidth = value; + } + + public uint TextureFormat + { + get => textureFormat; + set => textureFormat = value; + } + + public uint TextureDataOffset + { + get => textureDataOffset; + set => textureDataOffset = value; + } + + public uint WrapS + { + get => wrapS; + set => wrapS = value; + } + + public uint WrapT + { + get => wrapT; + set => wrapT = value; + } + + public uint MinFilter + { + get => minFilter; + set => minFilter = value; + } + + public uint MagFilter + { + get => magFilter; + set => magFilter = value; + } + + public uint LodBias + { + get => lodBias; + set => lodBias = value; + } + + public byte EdgeLod + { + get => edgeLod; + set => edgeLod = value; + } + + public byte MinLod + { + get => minLod; + set => minLod = value; + } + + public byte MaxLod + { + get => maxLod; + set => maxLod = value; + } + + public byte Unpacked + { + get => unpacked; + set => unpacked = value; + } + + public void Write(Stream writeStream) + { + writeStream.Write(BitConverter.GetBytes(Shared.Swap(textureHeight)), 0, 2); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(textureWidth)), 0, 2); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(textureFormat)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(textureDataOffset)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(wrapS)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(wrapT)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(minFilter)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(magFilter)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(lodBias)), 0, 4); + writeStream.WriteByte(edgeLod); + writeStream.WriteByte(minLod); + writeStream.WriteByte(maxLod); + writeStream.WriteByte(unpacked); + } + } + + public class TPL_PaletteHeader + { + private ushort numberOfItems; + private byte unpacked; + private byte pad; + private uint paletteFormat = byte.MaxValue; + private uint paletteDataOffset; + + public ushort NumberOfItems + { + get => numberOfItems; + set => numberOfItems = value; + } + + public byte Unpacked + { + get => unpacked; + set => unpacked = value; + } + + public byte Pad + { + get => pad; + set => pad = value; + } + + public uint PaletteFormat + { + get => paletteFormat; + set => paletteFormat = value; + } + + public uint PaletteDataOffset + { + get => paletteDataOffset; + set => paletteDataOffset = value; + } + + public void Write(Stream writeStream) + { + writeStream.Write(BitConverter.GetBytes(Shared.Swap(numberOfItems)), 0, 2); + writeStream.WriteByte(unpacked); + writeStream.WriteByte(pad); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(paletteFormat)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(paletteDataOffset)), 0, 4); + } + } + internal class ColorIndexConverter + { + private uint[] rgbaPalette; + private byte[] tplPalette; + private readonly uint[] rgbaData; + private byte[] tplData; + private readonly TPL_TextureFormat tplFormat; + private readonly TPL_PaletteFormat paletteFormat; + private readonly int width; + private readonly int height; + + public byte[] Palette => tplPalette; + + public byte[] Data => tplData; + + public ColorIndexConverter( + uint[] rgbaData, + int width, + int height, + TPL_TextureFormat tplFormat, + TPL_PaletteFormat paletteFormat) + { + if (tplFormat != TPL_TextureFormat.CI4 && tplFormat != TPL_TextureFormat.CI8) + { + throw new Exception("Texture format must be either CI4 or CI8"); + } + + if (paletteFormat != TPL_PaletteFormat.IA8 && paletteFormat != TPL_PaletteFormat.RGB565 && paletteFormat != TPL_PaletteFormat.RGB5A3) + { + throw new Exception("Palette format must be either IA8, RGB565 or RGB5A3!"); + } + + this.rgbaData = rgbaData; + this.width = width; + this.height = height; + this.tplFormat = tplFormat; + this.paletteFormat = paletteFormat; + BuildPalette(); + if (tplFormat != TPL_TextureFormat.CI4) + { + if (tplFormat == TPL_TextureFormat.CI8) + { + ToCI8(); + } + else + { + ToCI14X2(); + } + } + else + { + ToCI4(); + } + } + + private void ToCI4() + { + byte[] numArray = new byte[Shared.AddPadding(width, 8) * Shared.AddPadding(height, 8) / 2]; + int num = 0; + for (int index1 = 0; index1 < height; index1 += 8) + { + for (int index2 = 0; index2 < width; index2 += 8) + { + for (int index3 = index1; index3 < index1 + 8; ++index3) + { + for (int index4 = index2; index4 < index2 + 8; index4 += 2) + { + uint colorIndex1 = GetColorIndex(index3 >= height || index4 >= width ? 0U : rgbaData[index3 * width + index4]); + uint colorIndex2 = GetColorIndex(index3 >= height || index4 >= width ? 0U : (index3 * width + index4 + 1 < rgbaData.Length ? rgbaData[index3 * width + index4 + 1] : 0U)); + numArray[num++] = (byte)((uint)(byte)colorIndex1 << 4 | (byte)colorIndex2); + } + } + } + } + tplData = numArray; + } + + private void ToCI8() + { + byte[] numArray = new byte[Shared.AddPadding(width, 8) * Shared.AddPadding(height, 4)]; + int num1 = 0; + for (int index1 = 0; index1 < height; index1 += 4) + { + for (int index2 = 0; index2 < width; index2 += 8) + { + for (int index3 = index1; index3 < index1 + 4; ++index3) + { + for (int index4 = index2; index4 < index2 + 8; ++index4) + { + uint num2 = index3 >= height || index4 >= width ? 0U : rgbaData[index3 * width + index4]; + numArray[num1++] = (byte)GetColorIndex(num2); + } + } + } + } + tplData = numArray; + } + + private void ToCI14X2() + { + byte[] numArray1 = new byte[Shared.AddPadding(width, 4) * Shared.AddPadding(height, 4) * 2]; + int num1 = 0; + for (int index1 = 0; index1 < height; index1 += 4) + { + for (int index2 = 0; index2 < width; index2 += 4) + { + for (int index3 = index1; index3 < index1 + 4; ++index3) + { + for (int index4 = index2; index4 < index2 + 4; ++index4) + { + byte[] bytes = BitConverter.GetBytes((ushort)GetColorIndex(index3 >= height || index4 >= width ? 0U : rgbaData[index3 * width + index4])); + byte[] numArray2 = numArray1; + int index5 = num1; + int num2 = index5 + 1; + int num3 = bytes[1]; + numArray2[index5] = (byte)num3; + byte[] numArray3 = numArray1; + int index6 = num2; + num1 = index6 + 1; + int num4 = bytes[0]; + numArray3[index6] = (byte)num4; + } + } + } + } + tplData = numArray1; + } + + private void BuildPalette() + { + int num1 = 256; + if (tplFormat == TPL_TextureFormat.CI4) + { + num1 = 16; + } + else if (tplFormat == TPL_TextureFormat.CI14X2) + { + num1 = 16384; + } + + List uintList = new List(); + List ushortList = new List(); + uintList.Add(0U); + ushortList.Add(0); + for (int index = 1; index < rgbaData.Length && uintList.Count != num1; ++index) + { + if ((rgbaData[index] >> 24 & byte.MaxValue) >= (tplFormat == TPL_TextureFormat.CI14X2 ? 1L : 25L)) + { + ushort num2 = Shared.Swap(ConvertToPaletteValue((int)rgbaData[index])); + if (!uintList.Contains(rgbaData[index]) && !ushortList.Contains(num2)) + { + uintList.Add(rgbaData[index]); + ushortList.Add(num2); + } + } + } + while (uintList.Count % 16 != 0) + { + uintList.Add(uint.MaxValue); + ushortList.Add(ushort.MaxValue); + } + tplPalette = Shared.UShortArrayToByteArray(ushortList.ToArray()); + rgbaPalette = uintList.ToArray(); + } + + private ushort ConvertToPaletteValue(int rgba) + { + int num1 = 0; + int num2; + if (paletteFormat == TPL_PaletteFormat.IA8) + { + int num3 = ((rgba & byte.MaxValue) + (rgba >> 8 & byte.MaxValue) + (rgba >> 16 & byte.MaxValue)) / 3 & byte.MaxValue; + num2 = (ushort)((rgba >> 24 & byte.MaxValue) << 8 | num3); + } + else if (paletteFormat == TPL_PaletteFormat.RGB565) + { + num2 = (ushort)((rgba >> 16 & byte.MaxValue) >> 3 << 11 | (rgba >> 8 & byte.MaxValue) >> 2 << 5 | (rgba & byte.MaxValue) >> 3); + } + else + { + int num3 = rgba >> 16 & byte.MaxValue; + int num4 = rgba >> 8 & byte.MaxValue; + int num5 = rgba & byte.MaxValue; + int num6 = rgba >> 24 & byte.MaxValue; + if (num6 <= 218) + { + int num7 = num1 & -32769; + int num8 = num3 * 15 / byte.MaxValue & 15; + int num9 = num4 * 15 / byte.MaxValue & 15; + int num10 = num5 * 15 / byte.MaxValue & 15; + int num11 = num6 * 7 / byte.MaxValue & 7; + num2 = num7 | num11 << 12 | num10 | num9 << 4 | num8 << 8; + } + else + { + int num7 = num1 | 32768; + int num8 = num3 * 31 / byte.MaxValue & 31; + int num9 = num4 * 31 / byte.MaxValue & 31; + int num10 = num5 * 31 / byte.MaxValue & 31; + num2 = num7 | num10 | num9 << 5 | num8 << 10; + } + } + return (ushort)num2; + } + + private uint GetColorIndex(uint value) + { + uint num1 = int.MaxValue; + uint num2 = 0; + if ((value >> 24 & byte.MaxValue) < (tplFormat == TPL_TextureFormat.CI14X2 ? 1L : 25L)) + { + return 0; + } + + ushort paletteValue1 = ConvertToPaletteValue((int)value); + for (int index = 0; index < rgbaPalette.Length; ++index) + { + ushort paletteValue2 = ConvertToPaletteValue((int)rgbaPalette[index]); + if (paletteValue1 == paletteValue2) + { + return (uint)index; + } + + uint distance = GetDistance(paletteValue1, paletteValue2); + if (distance < num1) + { + num1 = distance; + num2 = (uint)index; + } + } + return num2; + } + + private uint GetDistance(ushort color, ushort paletteColor) + { + int rgbaValue1 = (int)ConvertToRgbaValue(color); + uint rgbaValue2 = ConvertToRgbaValue(paletteColor); + uint val1_1 = (uint)rgbaValue1 >> 24 & byte.MaxValue; + uint val1_2 = (uint)rgbaValue1 >> 16 & byte.MaxValue; + uint val1_3 = (uint)rgbaValue1 >> 8 & byte.MaxValue; + uint val1_4 = (uint)(rgbaValue1 & byte.MaxValue); + uint val2_1 = rgbaValue2 >> 24 & byte.MaxValue; + uint val2_2 = rgbaValue2 >> 16 & byte.MaxValue; + uint val2_3 = rgbaValue2 >> 8 & byte.MaxValue; + uint val2_4 = rgbaValue2 & byte.MaxValue; + int num1 = (int)Math.Max(val1_1, val2_1) - (int)Math.Min(val1_1, val2_1); + uint num2 = Math.Max(val1_2, val2_2) - Math.Min(val1_2, val2_2); + uint num3 = Math.Max(val1_3, val2_3) - Math.Min(val1_3, val2_3); + uint num4 = Math.Max(val1_4, val2_4) - Math.Min(val1_4, val2_4); + int num5 = (int)num2; + return (uint)(num1 + num5) + num3 + num4; + } + + private uint ConvertToRgbaValue(ushort pixel) + { + if (paletteFormat == TPL_PaletteFormat.IA8) + { + int num1 = pixel >> 8; + int num2 = pixel & byte.MaxValue; + return (uint)(num1 | num1 << 8 | num1 << 16 | num2 << 24); + } + if (paletteFormat == TPL_PaletteFormat.RGB565) + { + int num1 = (pixel >> 11 & 31) << 3 & byte.MaxValue; + int num2 = (pixel >> 5 & 63) << 2 & byte.MaxValue; + int num3 = (pixel & 31) << 3 & byte.MaxValue; + int maxValue = byte.MaxValue; + return (uint)(num3 | num2 << 8 | num1 << 16 | maxValue << 24); + } + int num4; + int num5; + int num6; + int num7; + if ((pixel & 32768) != 0) + { + num4 = (pixel >> 10 & 31) * byte.MaxValue / 31; + num5 = (pixel >> 5 & 31) * byte.MaxValue / 31; + num6 = (pixel & 31) * byte.MaxValue / 31; + num7 = byte.MaxValue; + } + else + { + num7 = (pixel >> 12 & 7) * byte.MaxValue / 7; + num4 = (pixel >> 8 & 15) * byte.MaxValue / 15; + num5 = (pixel >> 4 & 15) * byte.MaxValue / 15; + num6 = (pixel & 15) * byte.MaxValue / 15; + } + return (uint)(num6 | num5 << 8 | num4 << 16 | num7 << 24); + } + } } diff --git a/TPL_Header.cs b/TPL_Header.cs deleted file mode 100644 index c176f1c..0000000 --- a/TPL_Header.cs +++ /dev/null @@ -1,47 +0,0 @@ -/* This file is part of libWiiSharp -*Copyright(C) 2009 Leathl -* Copyright(C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - public class TPL_Header - { - private readonly uint tplMagic = 2142000; - private uint numOfTextures; - private readonly uint headerSize = 12; - - public uint TplMagic => tplMagic; - - public uint NumOfTextures - { - get => numOfTextures; - set => numOfTextures = value; - } - - public uint HeaderSize => headerSize; - - public void Write(Stream writeStream) - { - writeStream.Write(BitConverter.GetBytes(Shared.Swap(tplMagic)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(numOfTextures)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(headerSize)), 0, 4); - } - } -} diff --git a/TPL_PaletteFormat.cs b/TPL_PaletteFormat.cs deleted file mode 100644 index 98040eb..0000000 --- a/TPL_PaletteFormat.cs +++ /dev/null @@ -1,28 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace libWiiSharp -{ - public enum TPL_PaletteFormat - { - IA8 = 0, - RGB565 = 1, - RGB5A3 = 2, - None = 255, // 0x000000FF - } -} diff --git a/TPL_PaletteHeader.cs b/TPL_PaletteHeader.cs deleted file mode 100644 index 191f197..0000000 --- a/TPL_PaletteHeader.cs +++ /dev/null @@ -1,71 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - public class TPL_PaletteHeader - { - private ushort numberOfItems; - private byte unpacked; - private byte pad; - private uint paletteFormat = byte.MaxValue; - private uint paletteDataOffset; - - public ushort NumberOfItems - { - get => numberOfItems; - set => numberOfItems = value; - } - - public byte Unpacked - { - get => unpacked; - set => unpacked = value; - } - - public byte Pad - { - get => pad; - set => pad = value; - } - - public uint PaletteFormat - { - get => paletteFormat; - set => paletteFormat = value; - } - - public uint PaletteDataOffset - { - get => paletteDataOffset; - set => paletteDataOffset = value; - } - - public void Write(Stream writeStream) - { - writeStream.Write(BitConverter.GetBytes(Shared.Swap(numberOfItems)), 0, 2); - writeStream.WriteByte(unpacked); - writeStream.WriteByte(pad); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(paletteFormat)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(paletteDataOffset)), 0, 4); - } - } -} diff --git a/TPL_TextureEntry.cs b/TPL_TextureEntry.cs deleted file mode 100644 index 1b862ec..0000000 --- a/TPL_TextureEntry.cs +++ /dev/null @@ -1,47 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - public class TPL_TextureEntry - { - private uint textureHeaderOffset; - private uint paletteHeaderOffset; - - public uint TextureHeaderOffset - { - get => textureHeaderOffset; - set => textureHeaderOffset = value; - } - - public uint PaletteHeaderOffset - { - get => paletteHeaderOffset; - set => paletteHeaderOffset = value; - } - - public void Write(Stream writeStream) - { - writeStream.Write(BitConverter.GetBytes(Shared.Swap(textureHeaderOffset)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(paletteHeaderOffset)), 0, 4); - } - } -} diff --git a/TPL_TextureFormat.cs b/TPL_TextureFormat.cs deleted file mode 100644 index 4785c37..0000000 --- a/TPL_TextureFormat.cs +++ /dev/null @@ -1,35 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace libWiiSharp -{ - public enum TPL_TextureFormat - { - I4 = 0, - I8 = 1, - IA4 = 2, - IA8 = 3, - RGB565 = 4, - RGB5A3 = 5, - RGBA8 = 6, - CI4 = 8, - CI8 = 9, - CI14X2 = 10, // 0x0000000A - CMP = 14, // 0x0000000E - } -} diff --git a/TPL_TextureHeader.cs b/TPL_TextureHeader.cs deleted file mode 100644 index fadadd9..0000000 --- a/TPL_TextureHeader.cs +++ /dev/null @@ -1,135 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - public class TPL_TextureHeader - { - private ushort textureHeight; - private ushort textureWidth; - private uint textureFormat; - private uint textureDataOffset; - private uint wrapS; - private uint wrapT; - private uint minFilter = 1; - private uint magFilter = 1; - private uint lodBias; - private byte edgeLod; - private byte minLod; - private byte maxLod; - private byte unpacked; - - public ushort TextureHeight - { - get => textureHeight; - set => textureHeight = value; - } - - public ushort TextureWidth - { - get => textureWidth; - set => textureWidth = value; - } - - public uint TextureFormat - { - get => textureFormat; - set => textureFormat = value; - } - - public uint TextureDataOffset - { - get => textureDataOffset; - set => textureDataOffset = value; - } - - public uint WrapS - { - get => wrapS; - set => wrapS = value; - } - - public uint WrapT - { - get => wrapT; - set => wrapT = value; - } - - public uint MinFilter - { - get => minFilter; - set => minFilter = value; - } - - public uint MagFilter - { - get => magFilter; - set => magFilter = value; - } - - public uint LodBias - { - get => lodBias; - set => lodBias = value; - } - - public byte EdgeLod - { - get => edgeLod; - set => edgeLod = value; - } - - public byte MinLod - { - get => minLod; - set => minLod = value; - } - - public byte MaxLod - { - get => maxLod; - set => maxLod = value; - } - - public byte Unpacked - { - get => unpacked; - set => unpacked = value; - } - - public void Write(Stream writeStream) - { - writeStream.Write(BitConverter.GetBytes(Shared.Swap(textureHeight)), 0, 2); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(textureWidth)), 0, 2); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(textureFormat)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(textureDataOffset)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(wrapS)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(wrapT)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(minFilter)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(magFilter)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(lodBias)), 0, 4); - writeStream.WriteByte(edgeLod); - writeStream.WriteByte(minLod); - writeStream.WriteByte(maxLod); - writeStream.WriteByte(unpacked); - } - } -} diff --git a/U8.cs b/U8.cs index 6f120a3..67ecde9 100644 --- a/U8.cs +++ b/U8.cs @@ -25,6 +25,12 @@ using System.Text; namespace libWiiSharp { + public enum U8_NodeType : ushort + { + File = 0, + Directory = 256, // 0x0100 + } + public class U8 : IDisposable { //private const int dataPadding = 32; @@ -962,4 +968,81 @@ namespace libWiiSharp progress(new object(), new ProgressChangedEventArgs(progressPercentage, string.Empty)); } } + + public class U8_Header + { + private readonly uint u8Magic = 1437218861; + private readonly uint offsetToRootNode = 32; + private uint headerSize; + private uint offsetToData; + private readonly byte[] padding = new byte[16]; + + public uint U8Magic => u8Magic; + + public uint OffsetToRootNode => offsetToRootNode; + + public uint HeaderSize + { + get => headerSize; + set => headerSize = value; + } + + public uint OffsetToData + { + get => offsetToData; + set => offsetToData = value; + } + + public byte[] Padding => padding; + + public void Write(Stream writeStream) + { + writeStream.Write(BitConverter.GetBytes(Shared.Swap(u8Magic)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToRootNode)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(headerSize)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToData)), 0, 4); + writeStream.Write(padding, 0, 16); + } + } + + public class U8_Node + { + private ushort type; + private ushort offsetToName; + private uint offsetToData; + private uint sizeOfData; + + public U8_NodeType Type + { + get => (U8_NodeType)type; + set => type = (ushort)value; + } + + public ushort OffsetToName + { + get => offsetToName; + set => offsetToName = value; + } + + public uint OffsetToData + { + get => offsetToData; + set => offsetToData = value; + } + + public uint SizeOfData + { + get => sizeOfData; + set => sizeOfData = value; + } + + public void Write(Stream writeStream) + { + writeStream.Write(BitConverter.GetBytes(Shared.Swap(type)), 0, 2); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToName)), 0, 2); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToData)), 0, 4); + writeStream.Write(BitConverter.GetBytes(Shared.Swap(sizeOfData)), 0, 4); + } + } + } diff --git a/U8_Header.cs b/U8_Header.cs deleted file mode 100644 index b9af640..0000000 --- a/U8_Header.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - public class U8_Header - { - private readonly uint u8Magic = 1437218861; - private readonly uint offsetToRootNode = 32; - private uint headerSize; - private uint offsetToData; - private readonly byte[] padding = new byte[16]; - - public uint U8Magic => u8Magic; - - public uint OffsetToRootNode => offsetToRootNode; - - public uint HeaderSize - { - get => headerSize; - set => headerSize = value; - } - - public uint OffsetToData - { - get => offsetToData; - set => offsetToData = value; - } - - public byte[] Padding => padding; - - public void Write(Stream writeStream) - { - writeStream.Write(BitConverter.GetBytes(Shared.Swap(u8Magic)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToRootNode)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(headerSize)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToData)), 0, 4); - writeStream.Write(padding, 0, 16); - } - } -} diff --git a/U8_Node.cs b/U8_Node.cs deleted file mode 100644 index 9b615d5..0000000 --- a/U8_Node.cs +++ /dev/null @@ -1,63 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - public class U8_Node - { - private ushort type; - private ushort offsetToName; - private uint offsetToData; - private uint sizeOfData; - - public U8_NodeType Type - { - get => (U8_NodeType)type; - set => type = (ushort)value; - } - - public ushort OffsetToName - { - get => offsetToName; - set => offsetToName = value; - } - - public uint OffsetToData - { - get => offsetToData; - set => offsetToData = value; - } - - public uint SizeOfData - { - get => sizeOfData; - set => sizeOfData = value; - } - - public void Write(Stream writeStream) - { - writeStream.Write(BitConverter.GetBytes(Shared.Swap(type)), 0, 2); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToName)), 0, 2); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(offsetToData)), 0, 4); - writeStream.Write(BitConverter.GetBytes(Shared.Swap(sizeOfData)), 0, 4); - } - } -} diff --git a/U8_NodeType.cs b/U8_NodeType.cs deleted file mode 100644 index a1493f1..0000000 --- a/U8_NodeType.cs +++ /dev/null @@ -1,26 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -namespace libWiiSharp -{ - public enum U8_NodeType : ushort - { - File = 0, - Directory = 256, // 0x0100 - } -} diff --git a/Wave.cs b/Wave.cs index 12f2d6e..ef71a5e 100644 --- a/Wave.cs +++ b/Wave.cs @@ -17,6 +17,7 @@ */ using System; +using System.Collections.Generic; using System.IO; namespace libWiiSharp @@ -230,4 +231,244 @@ namespace libWiiSharp } } } + + internal class WaveHeader + { + private readonly uint headerId = 1380533830; + private uint fileSize = 12; + private readonly uint format = 1463899717; + + public uint FileSize + { + get => fileSize; + set => fileSize = value; + } + + public void Write(BinaryWriter writer) + { + writer.Write(Shared.Swap(headerId)); + writer.Write(fileSize); + writer.Write(Shared.Swap(format)); + } + + public void Read(BinaryReader reader) + { + fileSize = (int)Shared.Swap(reader.ReadUInt32()) == (int)headerId ? reader.ReadUInt32() : throw new Exception("Not a valid RIFF Wave file!"); + if ((int)Shared.Swap(reader.ReadUInt32()) != (int)format) + { + throw new Exception("Not a valid RIFF Wave file!"); + } + } + } + + internal class WaveFmtChunk + { + private readonly uint fmtId = 1718449184; + private uint fmtSize = 16; + private ushort audioFormat = 1; + private ushort numChannels = 2; + private uint sampleRate = 44100; + private uint byteRate; + private ushort blockAlign; + private ushort bitsPerSample = 16; + + public uint FmtSize => fmtSize; + + public ushort NumChannels + { + get => numChannels; + set => numChannels = value; + } + + public uint SampleRate + { + get => sampleRate; + set => sampleRate = value; + } + + public ushort BitsPerSample + { + get => bitsPerSample; + set => bitsPerSample = value; + } + + public uint AudioFormat => audioFormat; + + public void Write(BinaryWriter writer) + { + byteRate = sampleRate * numChannels * bitsPerSample / 8U; + blockAlign = (ushort)(numChannels * bitsPerSample / 8); + writer.Write(Shared.Swap(fmtId)); + writer.Write(fmtSize); + writer.Write(audioFormat); + writer.Write(numChannels); + writer.Write(sampleRate); + writer.Write(byteRate); + writer.Write(blockAlign); + writer.Write(bitsPerSample); + } + + public void Read(BinaryReader reader) + { + fmtSize = (int)Shared.Swap(reader.ReadUInt32()) == (int)fmtId ? reader.ReadUInt32() : throw new Exception("Wrong chunk ID!"); + audioFormat = reader.ReadUInt16(); + numChannels = reader.ReadUInt16(); + sampleRate = reader.ReadUInt32(); + byteRate = reader.ReadUInt32(); + blockAlign = reader.ReadUInt16(); + bitsPerSample = reader.ReadUInt16(); + } + } + + internal class WaveDataChunk + { + private readonly uint dataId = 1684108385; + private uint dataSize = 8; + private byte[] data; + + public uint DataSize => dataSize; + + public byte[] Data + { + get => data; + set + { + data = value; + dataSize = (uint)data.Length; + } + } + + public void Write(BinaryWriter writer) + { + writer.Write(Shared.Swap(dataId)); + writer.Write(dataSize); + writer.Write(data, 0, data.Length); + } + + public void Read(BinaryReader reader) + { + dataSize = (int)Shared.Swap(reader.ReadUInt32()) == (int)dataId ? reader.ReadUInt32() : throw new Exception("Wrong chunk ID!"); + data = reader.ReadBytes((int)dataSize); + } + } + + internal class WaveSmplChunk + { + private readonly uint smplId = 1936552044; + private uint smplSize = 36; + private uint manufacturer; + private uint product; + private uint samplePeriod; + private uint unityNote = 60; + private uint pitchFraction; + private uint smpteFormat; + private uint smpteOffset; + private uint numLoops; + private uint samplerData; + private readonly List smplLoops = new List(); + + public uint SmplSize => smplSize; + + public uint NumLoops => numLoops; + + public WaveSmplLoop[] Loops => smplLoops.ToArray(); + + public void AddLoop(int loopStartSample, int loopEndSample) + { + RemoveAllLoops(); + ++numLoops; + smplLoops.Add(new WaveSmplLoop() + { + LoopStart = (uint)loopStartSample, + LoopEnd = (uint)loopEndSample + }); + } + + public void RemoveAllLoops() + { + smplLoops.Clear(); + numLoops = 0U; + } + + public void Write(BinaryWriter writer) + { + writer.Write(Shared.Swap(smplId)); + writer.Write(smplSize); + writer.Write(manufacturer); + writer.Write(product); + writer.Write(samplePeriod); + writer.Write(unityNote); + writer.Write(pitchFraction); + writer.Write(smpteFormat); + writer.Write(smpteOffset); + writer.Write(numLoops); + writer.Write(samplerData); + for (int index = 0; index < numLoops; ++index) + { + smplLoops[index].Write(writer); + } + } + + public void Read(BinaryReader reader) + { + smplSize = (int)Shared.Swap(reader.ReadUInt32()) == (int)smplId ? reader.ReadUInt32() : throw new Exception("Wrong chunk ID!"); + manufacturer = reader.ReadUInt32(); + product = reader.ReadUInt32(); + samplePeriod = reader.ReadUInt32(); + unityNote = reader.ReadUInt32(); + pitchFraction = reader.ReadUInt32(); + smpteFormat = reader.ReadUInt32(); + smpteOffset = reader.ReadUInt32(); + numLoops = reader.ReadUInt32(); + samplerData = reader.ReadUInt32(); + for (int index = 0; index < numLoops; ++index) + { + WaveSmplLoop waveSmplLoop = new WaveSmplLoop(); + waveSmplLoop.Read(reader); + smplLoops.Add(waveSmplLoop); + } + } + } + + internal class WaveSmplLoop + { + private uint cuePointId; + private uint type; + private uint start; + private uint end; + private uint fraction; + private uint playCount; + + public uint LoopStart + { + get => start; + set => start = value; + } + + public uint LoopEnd + { + get => end; + set => end = value; + } + + public void Write(BinaryWriter writer) + { + writer.Write(cuePointId); + writer.Write(type); + writer.Write(start); + writer.Write(end); + writer.Write(fraction); + writer.Write(playCount); + } + + public void Read(BinaryReader reader) + { + cuePointId = reader.ReadUInt32(); + type = reader.ReadUInt32(); + start = reader.ReadUInt32(); + end = reader.ReadUInt32(); + fraction = reader.ReadUInt32(); + playCount = reader.ReadUInt32(); + } + } } diff --git a/WaveDataChunk.cs b/WaveDataChunk.cs deleted file mode 100644 index 3363cfc..0000000 --- a/WaveDataChunk.cs +++ /dev/null @@ -1,55 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - internal class WaveDataChunk - { - private readonly uint dataId = 1684108385; - private uint dataSize = 8; - private byte[] data; - - public uint DataSize => dataSize; - - public byte[] Data - { - get => data; - set - { - data = value; - dataSize = (uint)data.Length; - } - } - - public void Write(BinaryWriter writer) - { - writer.Write(Shared.Swap(dataId)); - writer.Write(dataSize); - writer.Write(data, 0, data.Length); - } - - public void Read(BinaryReader reader) - { - dataSize = (int)Shared.Swap(reader.ReadUInt32()) == (int)dataId ? reader.ReadUInt32() : throw new Exception("Wrong chunk ID!"); - data = reader.ReadBytes((int)dataSize); - } - } -} diff --git a/WaveFmtChunk.cs b/WaveFmtChunk.cs deleted file mode 100644 index 43a126a..0000000 --- a/WaveFmtChunk.cs +++ /dev/null @@ -1,82 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - internal class WaveFmtChunk - { - private readonly uint fmtId = 1718449184; - private uint fmtSize = 16; - private ushort audioFormat = 1; - private ushort numChannels = 2; - private uint sampleRate = 44100; - private uint byteRate; - private ushort blockAlign; - private ushort bitsPerSample = 16; - - public uint FmtSize => fmtSize; - - public ushort NumChannels - { - get => numChannels; - set => numChannels = value; - } - - public uint SampleRate - { - get => sampleRate; - set => sampleRate = value; - } - - public ushort BitsPerSample - { - get => bitsPerSample; - set => bitsPerSample = value; - } - - public uint AudioFormat => audioFormat; - - public void Write(BinaryWriter writer) - { - byteRate = sampleRate * numChannels * bitsPerSample / 8U; - blockAlign = (ushort)(numChannels * bitsPerSample / 8); - writer.Write(Shared.Swap(fmtId)); - writer.Write(fmtSize); - writer.Write(audioFormat); - writer.Write(numChannels); - writer.Write(sampleRate); - writer.Write(byteRate); - writer.Write(blockAlign); - writer.Write(bitsPerSample); - } - - public void Read(BinaryReader reader) - { - fmtSize = (int)Shared.Swap(reader.ReadUInt32()) == (int)fmtId ? reader.ReadUInt32() : throw new Exception("Wrong chunk ID!"); - audioFormat = reader.ReadUInt16(); - numChannels = reader.ReadUInt16(); - sampleRate = reader.ReadUInt32(); - byteRate = reader.ReadUInt32(); - blockAlign = reader.ReadUInt16(); - bitsPerSample = reader.ReadUInt16(); - } - } -} diff --git a/WaveHeader.cs b/WaveHeader.cs deleted file mode 100644 index 6b2ea6c..0000000 --- a/WaveHeader.cs +++ /dev/null @@ -1,52 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.IO; - -namespace libWiiSharp -{ - internal class WaveHeader - { - private readonly uint headerId = 1380533830; - private uint fileSize = 12; - private readonly uint format = 1463899717; - - public uint FileSize - { - get => fileSize; - set => fileSize = value; - } - - public void Write(BinaryWriter writer) - { - writer.Write(Shared.Swap(headerId)); - writer.Write(fileSize); - writer.Write(Shared.Swap(format)); - } - - public void Read(BinaryReader reader) - { - fileSize = (int)Shared.Swap(reader.ReadUInt32()) == (int)headerId ? reader.ReadUInt32() : throw new Exception("Not a valid RIFF Wave file!"); - if ((int)Shared.Swap(reader.ReadUInt32()) != (int)format) - { - throw new Exception("Not a valid RIFF Wave file!"); - } - } - } -} diff --git a/WaveSmplChunk.cs b/WaveSmplChunk.cs deleted file mode 100644 index ebecebb..0000000 --- a/WaveSmplChunk.cs +++ /dev/null @@ -1,102 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.IO; - -namespace libWiiSharp -{ - internal class WaveSmplChunk - { - private readonly uint smplId = 1936552044; - private uint smplSize = 36; - private uint manufacturer; - private uint product; - private uint samplePeriod; - private uint unityNote = 60; - private uint pitchFraction; - private uint smpteFormat; - private uint smpteOffset; - private uint numLoops; - private uint samplerData; - private readonly List smplLoops = new List(); - - public uint SmplSize => smplSize; - - public uint NumLoops => numLoops; - - public WaveSmplLoop[] Loops => smplLoops.ToArray(); - - public void AddLoop(int loopStartSample, int loopEndSample) - { - RemoveAllLoops(); - ++numLoops; - smplLoops.Add(new WaveSmplLoop() - { - LoopStart = (uint)loopStartSample, - LoopEnd = (uint)loopEndSample - }); - } - - public void RemoveAllLoops() - { - smplLoops.Clear(); - numLoops = 0U; - } - - public void Write(BinaryWriter writer) - { - writer.Write(Shared.Swap(smplId)); - writer.Write(smplSize); - writer.Write(manufacturer); - writer.Write(product); - writer.Write(samplePeriod); - writer.Write(unityNote); - writer.Write(pitchFraction); - writer.Write(smpteFormat); - writer.Write(smpteOffset); - writer.Write(numLoops); - writer.Write(samplerData); - for (int index = 0; index < numLoops; ++index) - { - smplLoops[index].Write(writer); - } - } - - public void Read(BinaryReader reader) - { - smplSize = (int)Shared.Swap(reader.ReadUInt32()) == (int)smplId ? reader.ReadUInt32() : throw new Exception("Wrong chunk ID!"); - manufacturer = reader.ReadUInt32(); - product = reader.ReadUInt32(); - samplePeriod = reader.ReadUInt32(); - unityNote = reader.ReadUInt32(); - pitchFraction = reader.ReadUInt32(); - smpteFormat = reader.ReadUInt32(); - smpteOffset = reader.ReadUInt32(); - numLoops = reader.ReadUInt32(); - samplerData = reader.ReadUInt32(); - for (int index = 0; index < numLoops; ++index) - { - WaveSmplLoop waveSmplLoop = new WaveSmplLoop(); - waveSmplLoop.Read(reader); - smplLoops.Add(waveSmplLoop); - } - } - } -} diff --git a/WaveSmplLoop.cs b/WaveSmplLoop.cs deleted file mode 100644 index 277d8cf..0000000 --- a/WaveSmplLoop.cs +++ /dev/null @@ -1,64 +0,0 @@ -/* This file is part of libWiiSharp - * Copyright (C) 2009 Leathl - * Copyright (C) 2020 - 2021 Github Contributors - * - * libWiiSharp is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * libWiiSharp is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System.IO; - -namespace libWiiSharp -{ - internal class WaveSmplLoop - { - private uint cuePointId; - private uint type; - private uint start; - private uint end; - private uint fraction; - private uint playCount; - - public uint LoopStart - { - get => start; - set => start = value; - } - - public uint LoopEnd - { - get => end; - set => end = value; - } - - public void Write(BinaryWriter writer) - { - writer.Write(cuePointId); - writer.Write(type); - writer.Write(start); - writer.Write(end); - writer.Write(fraction); - writer.Write(playCount); - } - - public void Read(BinaryReader reader) - { - cuePointId = reader.ReadUInt32(); - type = reader.ReadUInt32(); - start = reader.ReadUInt32(); - end = reader.ReadUInt32(); - fraction = reader.ReadUInt32(); - playCount = reader.ReadUInt32(); - } - } -} diff --git a/libWiiSharp.csproj b/libWiiSharp.csproj index 9b1e20a..fbb6901 100644 --- a/libWiiSharp.csproj +++ b/libWiiSharp.csproj @@ -47,13 +47,9 @@ - - - - @@ -63,30 +59,14 @@ - - - - - - - - - - - - - - - -