mirror of
https://github.com/crskycode/GARbro.git
synced 2024-11-26 23:24:00 +08:00
114 lines
5.5 KiB
C#
114 lines
5.5 KiB
C#
//! \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,
|
|
};
|
|
}
|
|
}
|