Optimized code
This commit is contained in:
@@ -6,6 +6,20 @@ namespace RCTExtractor
|
|||||||
{
|
{
|
||||||
class Program
|
class Program
|
||||||
{
|
{
|
||||||
|
private static readonly byte[] riff = new byte[] { (byte)'R', (byte)'I', (byte)'F', (byte)'F' };
|
||||||
|
private static readonly byte[] wave = new byte[] { (byte)'W', (byte)'A', (byte)'V', (byte)'E' };
|
||||||
|
private static readonly byte[] fmt = new byte[] { (byte)'f', (byte)'m', (byte)'t', (byte)' ' };
|
||||||
|
private const uint formatSize = 2 + 2 + 4 + 4 + 2 + 2;
|
||||||
|
private static readonly byte[] data = new byte[] { (byte)'d', (byte)'a', (byte)'t', (byte)'a' };
|
||||||
|
private static readonly string[] names = new string[] { "lift 1", "straight running", "lift 2",
|
||||||
|
"scream 1", "click 1", "click 2", "place item", "scream 2", "scream 3", "scream 4",
|
||||||
|
"scream 5", "scream 6", "lift 3", "cash sound", "crash", "laying out water", "water 1",
|
||||||
|
"water 2", "train whistle", "train chugging", "water splash", "hammering", "ride launch 1",
|
||||||
|
"ride launch 2", "cough 1", "cough 2", "cough 3", "cough 4", "rain 1", "thunder 1",
|
||||||
|
"thunder 2", "rain 2", "rain 3", "tink 1", "tink 2", "scream 7", "toilet flush", "click 3",
|
||||||
|
"quack", "message sound", "dialog box sound", "person 1", "person 2", "person 3", "clapping",
|
||||||
|
"haunted house 1", "haunted house 2", "haunted house 3" };
|
||||||
|
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
if (Directory.Exists("sounds"))
|
if (Directory.Exists("sounds"))
|
||||||
@@ -18,65 +32,42 @@ namespace RCTExtractor
|
|||||||
{
|
{
|
||||||
var positions = new uint[br.ReadUInt32()];
|
var positions = new uint[br.ReadUInt32()];
|
||||||
|
|
||||||
Console.WriteLine("{0} sounds", positions.Length);
|
|
||||||
|
|
||||||
for (int i = 0; i < positions.Length; i++)
|
for (int i = 0; i < positions.Length; i++)
|
||||||
{
|
|
||||||
positions[i] = br.ReadUInt32();
|
positions[i] = br.ReadUInt32();
|
||||||
Console.WriteLine("sound {0} at offset {1} {2}", i, positions[i], i > 0 ? "+" + (positions[i] - positions[i - 1]) : "");
|
|
||||||
}
|
|
||||||
|
|
||||||
var names = new string[] { "lift 1", "straight running", "lift 2", "scream 1",
|
|
||||||
"click 1", "click 2", "place item", "scream 2", "scream 3", "scream 4",
|
|
||||||
"scream 5", "scream 6", "lift 3", "cash sound", "crash", "laying out water",
|
|
||||||
"water 1", "water 2", "train whistle", "train chugging", "water splash",
|
|
||||||
"hammering", "ride launch 1", "ride launch 2", "cough 1", "cough 2",
|
|
||||||
"cough 3", "cough 4", "rain 1", "thunder 1", "thunder 2", "rain 2", "rain 3",
|
|
||||||
"tink 1", "tink 2", "scream 7", "toilet flush", "click 3", "quack",
|
|
||||||
"message sound", "dialog box sound", "person 1", "person 2", "person 3",
|
|
||||||
"clapping", "haunted house 1", "haunted house 2", "haunted house 3" };
|
|
||||||
|
|
||||||
for (int i = 0; i < positions.Length; i++)
|
for (int i = 0; i < positions.Length; i++)
|
||||||
{
|
{
|
||||||
fs.Position = positions[i];
|
fs.Position = positions[i];
|
||||||
|
|
||||||
var size = br.ReadUInt32();
|
var size = br.ReadUInt32() - formatSize;
|
||||||
|
|
||||||
var wFormatTag = br.ReadUInt16();
|
|
||||||
var wChannels = br.ReadUInt16();
|
|
||||||
var dwSamplesPerSec = br.ReadUInt32();
|
|
||||||
var dwAvgBytesPerSec = br.ReadUInt32();
|
|
||||||
var wBlockAlign = br.ReadUInt16();
|
|
||||||
var wBitsPerSample = br.ReadUInt16();
|
|
||||||
|
|
||||||
Console.WriteLine("Exporting sound {0} (size: {1})", i, size);
|
|
||||||
Console.WriteLine(" wFormatTag {0}", wFormatTag);
|
|
||||||
Console.WriteLine(" wChannels {0}", wChannels);
|
|
||||||
Console.WriteLine(" dwSamplesPerSec {0}", dwSamplesPerSec);
|
|
||||||
Console.WriteLine(" dwAvgBytesPerSec {0}", dwAvgBytesPerSec);
|
|
||||||
Console.WriteLine(" wBlockAlign {0}", wBlockAlign);
|
|
||||||
Console.WriteLine(" wBitsPerSample {0}", wBitsPerSample);
|
|
||||||
|
|
||||||
using (var sfs = File.OpenWrite(Path.Combine("sounds", names[i] + ".wav")))
|
using (var sfs = File.OpenWrite(Path.Combine("sounds", names[i] + ".wav")))
|
||||||
using (var bw = new BinaryWriter(sfs))
|
using (var bw = new BinaryWriter(sfs))
|
||||||
{
|
{
|
||||||
bw.Write(new byte[] { (byte)'R', (byte)'I', (byte)'F', (byte)'F' });
|
bw.Write(riff);
|
||||||
bw.Write(4 + 4 + 4 + 4 + 4 + size);
|
bw.Write((uint)(wave.Length + fmt.Length + 4 + formatSize + data.Length + 4 + size));
|
||||||
bw.Write(new byte[] { (byte)'W', (byte)'A', (byte)'V', (byte)'E' });
|
bw.Write(wave);
|
||||||
bw.Write(new byte[] { (byte)'f', (byte)'m', (byte)'t', (byte)' ' });
|
bw.Write(fmt);
|
||||||
bw.Write((uint)(2 + 2 + 4 + 4 + 2 + 2));
|
bw.Write(formatSize);
|
||||||
bw.Write(wFormatTag);
|
CopyStream(fs, sfs, (int)formatSize);
|
||||||
bw.Write(wChannels);
|
bw.Write(data);
|
||||||
bw.Write(dwSamplesPerSec);
|
bw.Write(size);
|
||||||
bw.Write(dwAvgBytesPerSec);
|
CopyStream(fs, sfs, (int)size);
|
||||||
bw.Write(wBlockAlign);
|
|
||||||
bw.Write(wBitsPerSample);
|
|
||||||
bw.Write(new byte[] { (byte)'d', (byte)'a', (byte)'t', (byte)'a' });
|
|
||||||
bw.Write(size - 2 - 2 - 4 - 4 - 2 - 2);
|
|
||||||
bw.Write(br.ReadBytes((int)(size - 2 - 2 - 4 - 4 - 2 - 2)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void CopyStream(Stream input, Stream output, int bytes)
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[32768];
|
||||||
|
int read;
|
||||||
|
while (bytes > 0 &&
|
||||||
|
(read = input.Read(buffer, 0, Math.Min(buffer.Length, bytes))) > 0)
|
||||||
|
{
|
||||||
|
output.Write(buffer, 0, read);
|
||||||
|
bytes -= read;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user