Optimized code

This commit is contained in:
Daniel Brunner
2017-02-17 18:40:36 +01:00
parent 655a9f69f1
commit de3631fd11

View File

@@ -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;
}
}
} }
} }