From 0206bc574e87f563ac3fd07e5b21a04635bd1de6 Mon Sep 17 00:00:00 2001 From: morkt Date: Sat, 11 Mar 2017 11:37:51 +0400 Subject: [PATCH] implemented KAAS engine audio. --- ArcFormats/ArcFormats.csproj | 1 + ArcFormats/Kaas/AudioKAAS.cs | 113 +++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 ArcFormats/Kaas/AudioKAAS.cs diff --git a/ArcFormats/ArcFormats.csproj b/ArcFormats/ArcFormats.csproj index 603333a7..74334db9 100644 --- a/ArcFormats/ArcFormats.csproj +++ b/ArcFormats/ArcFormats.csproj @@ -101,6 +101,7 @@ + diff --git a/ArcFormats/Kaas/AudioKAAS.cs b/ArcFormats/Kaas/AudioKAAS.cs new file mode 100644 index 00000000..c19b5554 --- /dev/null +++ b/ArcFormats/Kaas/AudioKAAS.cs @@ -0,0 +1,113 @@ +//! \file AudioKAAS.cs +//! \date Fri Mar 10 18:46:22 2017 +//! \brief KAAS engine PCM audio format. +// +// Copyright (C) 2017 by morkt +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + +using System; +using System.ComponentModel.Composition; +using System.IO; + +namespace GameRes.Formats.KAAS +{ + [Export(typeof(AudioFormat))] + public class KaasAudio : AudioFormat + { + public override string Tag { get { return "PCM/KAAS"; } } + public override string Description { get { return "KAAS engine audio format"; } } + public override uint Signature { get { return 0; } } + public override bool CanWrite { get { return false; } } + + public KaasAudio () + { + Extensions = new string[] { "" }; + } + + public override SoundInput TryOpen (IBinaryStream file) + { + var header = file.ReadHeader (0x10); + var length = header.ToInt32 (0); + if (header.ToUInt16 (4) != 0x800 || file.Length != length + 0x10 + || header.ToUInt32 (0xC) != 0x84BE2329) + return null; + ushort channels = header.ToUInt16 (6); + if (channels > 1) + return null; + ++channels; + var format = new WaveFormat { + FormatTag = 1, + Channels = channels, + SamplesPerSecond = header.ToUInt32 (8), + BlockAlign = (ushort)(2 * channels), + BitsPerSample = 16, + }; + format.SetBPS(); + var pcm = new MemoryStream (length * 2); + using (var pcm_writer = new BinaryWriter (pcm, System.Text.Encoding.Default, true)) + { + for (int i = 0; i < length; ++i) + { + ushort sample = SampleTable[file.ReadUInt8()]; + pcm_writer.Write (sample); + } + } + file.Dispose(); + pcm.Position = 0; + return new RawPcmInput (pcm, format); + } + + static readonly ushort[] SampleTable = { + 0x0000, 0x0001, 0x0007, 0x0011, 0x001F, 0x0031, 0x0047, 0x0061, + 0x007E, 0x00A0, 0x00C6, 0x00EF, 0x011D, 0x014E, 0x0184, 0x01BD, + 0x01FA, 0x023C, 0x0281, 0x02CA, 0x0318, 0x0369, 0x03BE, 0x0417, + 0x0474, 0x04D5, 0x053A, 0x05A3, 0x0610, 0x0681, 0x06F6, 0x076E, + 0x07EB, 0x086C, 0x08F0, 0x0979, 0x0A06, 0x0A96, 0x0B2B, 0x0BC3, + 0x0C60, 0x0D00, 0x0DA4, 0x0E4D, 0x0EF9, 0x0FA9, 0x105D, 0x1115, + 0x11D1, 0x1291, 0x1356, 0x141D, 0x14E9, 0x15B9, 0x168D, 0x1765, + 0x1841, 0x1921, 0x1A04, 0x1AEC, 0x1BD8, 0x1CC7, 0x1DBB, 0x1EB2, + 0x1FAE, 0x20AD, 0x21B0, 0x22B8, 0x23C3, 0x24D2, 0x25E6, 0x26FD, + 0x2818, 0x2937, 0x2A5A, 0x2B81, 0x2CAC, 0x2DDB, 0x2F0E, 0x3045, + 0x3180, 0x32BE, 0x3401, 0x3548, 0x3692, 0x37E1, 0x3934, 0x3A8A, + 0x3BE5, 0x3D43, 0x3EA6, 0x400C, 0x4176, 0x42E5, 0x4457, 0x45CD, + 0x4747, 0x48C5, 0x4A47, 0x4BCD, 0x4D58, 0x4EE5, 0x5077, 0x520D, + 0x53A7, 0x5545, 0x56E7, 0x588D, 0x5A36, 0x5BE4, 0x5D96, 0x5F4B, + 0x6105, 0x62C2, 0x6484, 0x6649, 0x6812, 0x69E0, 0x6BB1, 0x6D86, + 0x6F60, 0x713D, 0x731E, 0x7503, 0x76EC, 0x78D9, 0x7ACA, 0x7CBF, + 0xFFFF, 0xFFFE, 0xFFF8, 0xFFEE, 0xFFE0, 0xFFCE, 0xFFB8, 0xFF9E, + 0xFF81, 0xFF5F, 0xFF39, 0xFF10, 0xFEE2, 0xFEB1, 0xFE7B, 0xFE42, + 0xFE05, 0xFDC3, 0xFD7E, 0xFD35, 0xFCE7, 0xFC96, 0xFC41, 0xFBE8, + 0xFB8B, 0xFB2A, 0xFAC5, 0xFA5C, 0xF9EF, 0xF97E, 0xF909, 0xF891, + 0xF814, 0xF793, 0xF70F, 0xF686, 0xF5F9, 0xF569, 0xF4D4, 0xF43C, + 0xF39F, 0xF2FF, 0xF25B, 0xF1B2, 0xF106, 0xF056, 0xEFA2, 0xEEEA, + 0xEE2E, 0xED6E, 0xECA9, 0xEBE2, 0xEB16, 0xEA46, 0xE972, 0xE89A, + 0xE7BE, 0xE6DE, 0xE5FB, 0xE513, 0xE427, 0xE338, 0xE244, 0xE14D, + 0xE051, 0xDF52, 0xDE4F, 0xDD47, 0xDC3C, 0xDB2D, 0xDA19, 0xD902, + 0xD7E7, 0xD6C8, 0xD5A5, 0xD47E, 0xD353, 0xD224, 0xD0F1, 0xCFBA, + 0xCE7F, 0xCD41, 0xCBFE, 0xCAB7, 0xC96D, 0xC81E, 0xC6CB, 0xC575, + 0xC41A, 0xC2BC, 0xC159, 0xBFF3, 0xBE89, 0xBD1A, 0xBBA8, 0xBA32, + 0xB8B8, 0xB73A, 0xB5B8, 0xB432, 0xB2A7, 0xB11A, 0xAF88, 0xADF2, + 0xAC58, 0xAABA, 0xA918, 0xA772, 0xA5C9, 0xA41B, 0xA269, 0xA0B4, + 0x9EFA, 0x9D3D, 0x9B7B, 0x99B6, 0x97ED, 0x961F, 0x944E, 0x9279, + 0x909F, 0x8EC2, 0x8CE1, 0x8AFC, 0x8913, 0x8726, 0x8535, 0x8340, + }; + } +}