GARbro-mirror/ArcFormats/Kaas/AudioKAAS.cs

114 lines
5.5 KiB
C#
Raw Permalink Normal View History

2017-03-11 15:37:51 +08:00
//! \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,
};
}
}