AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/WavWrite.cs

83 lines
3.4 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.IO;
namespace MAME.Core
{
public class WavWrite
{
public static FileStream mWaveFile = null;
private static BinaryWriter mWriter = null;
private static int mSampleCount = 0;
public static void CreateSoundFile(string filename)
{
mWaveFile = new FileStream(filename, FileMode.Create);
mWriter = new BinaryWriter(mWaveFile);
/**************************************************************************
Hereiswherethefilewillbecreated.A
wavefileisaRIFFfile,whichhaschunks
ofdatathatdescribewhatthefilecontains.
AwaveRIFFfileisputtogetherlikethis:
The12byteRIFFchunkisconstructedlikethis:
Bytes0-3: 'R''I''F''F'
Bytes4-7: Lengthoffile,minusthefirst8bytesoftheRIFFdescription.
(4bytesfor"WAVE"+24bytesforformatchunklength+
8bytesfordatachunkdescription+actualsampledatasize.)
Bytes8-11:'W''A''V''E'
The24byteFORMATchunkisconstructedlikethis:
Bytes0-3:'f''m''t'''
Bytes4-7:Theformatchunklength.Thisisalways16.
Bytes8-9:Filepadding.Always1.
Bytes10-11:Numberofchannels.Either1formono, or2forstereo.
Bytes12-15:Samplerate.
Bytes16-19:Numberofbytespersecond.
Bytes20-21:Bytespersample.1for8bitmono,2for8bitstereoor
16bitmono,4for16bitstereo.
Bytes22-23:Numberofbitspersample.
TheDATAchunkisconstructedlikethis:
Bytes0-3:'d''a''t''a'
Bytes4-7:Lengthofdata,inbytes.
Bytes8-:Actualsampledata.
***************************************************************************/
char[] ChunkRiff = { 'R', 'I', 'F', 'F' };
char[] ChunkType = { 'W', 'A', 'V', 'E' };
char[] ChunkFmt = { 'f', 'm', 't', ' ' };
char[] ChunkData = { 'd', 'a', 't', 'a' };
short shPad = 1;        //Filepadding
int nFormatChunkLength = 0x10; //Formatchunklength.
int nLength = 0;        //Filelength,minusfirst8bytesofRIFFdescription.Thiswillbefilledinlater.
mSampleCount = 0;
//RIFF
mWriter.Write(ChunkRiff);
mWriter.Write(nLength);
//WAVE
mWriter.Write(ChunkType);
mWriter.Write(ChunkFmt);
mWriter.Write(nFormatChunkLength);
mWriter.Write(shPad);
mWriter.Write((short)2);
mWriter.Write(48000);
mWriter.Write(192000);
mWriter.Write((short)4);
mWriter.Write((short)16);
//data
mWriter.Write(ChunkData);
mWriter.Write((int)0);
}
public static void CloseSoundFile()
{
mWriter.Seek(4, SeekOrigin.Begin);
mWriter.Write((int)(mSampleCount + 36));
mWriter.Seek(40, SeekOrigin.Begin);
mWriter.Write(mSampleCount);
mWriter.Close();
mWaveFile.Close();
mWriter = null;
mWaveFile = null;
}
public static void wav_add_data_16(byte[] bb1, int length)
{
mWriter.Write(bb1, 0, length);
mSampleCount += length;
mWriter.Flush();
}
}
}