mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-01-23 17:43:08 -05:00
76 lines
2.6 KiB
C#
76 lines
2.6 KiB
C#
// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.IO;
|
|
using ClassicalSharp;
|
|
using ClassicalSharp.TexturePack;
|
|
|
|
namespace Launcher {
|
|
|
|
public static class BinUnpacker {
|
|
|
|
public static void Unpack( string dir, string group ) {
|
|
string binFile = Path.Combine( dir, group + ".bin" );
|
|
if( !File.Exists( binFile ) ) return;
|
|
|
|
byte[] data = File.ReadAllBytes( binFile );
|
|
UnpackBin( data, dir, group );
|
|
File.Delete( binFile );
|
|
}
|
|
|
|
static void UnpackBin( byte[] data, string dir, string group ) {
|
|
string propsFile = Path.Combine( dir, group + ".txt" );
|
|
using( StreamReader reader = new StreamReader( propsFile ) ) {
|
|
string line;
|
|
while( (line = reader.ReadLine()) != null ) {
|
|
if( line.Length == 0 || line[0] == '#' ) continue;
|
|
string[] parts = line.Split( ',' );
|
|
if( parts.Length < 6 ) continue;
|
|
string name = parts[0].ToLower();
|
|
int sampleRate, bitsPerSample, channels;
|
|
int offset, length;
|
|
|
|
if( !Int32.TryParse( parts[1], out sampleRate ) ||
|
|
!Int32.TryParse( parts[2], out bitsPerSample ) ||
|
|
!Int32.TryParse( parts[3], out channels ) ||
|
|
!Int32.TryParse( parts[4], out offset ) ||
|
|
!Int32.TryParse( parts[5], out length ) )
|
|
continue;
|
|
|
|
string file = Path.Combine( dir, group + "_" + name + ".wav" );
|
|
using( FileStream fs = File.Create( file ) )
|
|
WriteWave( fs, data, offset, length,
|
|
channels, sampleRate, bitsPerSample );
|
|
}
|
|
}
|
|
File.Delete( propsFile );
|
|
}
|
|
|
|
static void WriteWave( Stream stream, byte[] data, int dataOffset, int dataLen,
|
|
int channels, int frequency, int bitsPerSample ) {
|
|
BinaryWriter w = new BinaryWriter( stream );
|
|
WriteFourCC( w, "RIFF" );
|
|
w.Write( 4 + (8 + 16) + (8 + dataLen) );
|
|
WriteFourCC( w, "WAVE" );
|
|
|
|
WriteFourCC( w, "fmt " );
|
|
w.Write( 16 );
|
|
w.Write( (ushort)1 ); // audio format, PCM
|
|
w.Write( (ushort)channels );
|
|
w.Write( frequency );
|
|
w.Write((frequency * channels * bitsPerSample) / 8 ); // byte rate
|
|
w.Write( (ushort)((channels * bitsPerSample) / 8) ); // block align
|
|
w.Write( (ushort)bitsPerSample );
|
|
|
|
WriteFourCC( w, "data" );
|
|
w.Write( dataLen );
|
|
w.Write( data, dataOffset, dataLen );
|
|
}
|
|
|
|
static void WriteFourCC( BinaryWriter w, string fourCC ) {
|
|
w.Write( (byte)fourCC[0] ); w.Write( (byte)fourCC[1] );
|
|
w.Write( (byte)fourCC[2] ); w.Write( (byte)fourCC[3] );
|
|
}
|
|
}
|
|
}
|