mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-08-20 00:49:25 +08:00
Fixed generating of audio for stream for AwcAudio
This commit is contained in:
parent
79a0fecde7
commit
31b49d2df3
@ -414,9 +414,9 @@ namespace CodeWalker.GameFiles
|
|||||||
[TC(typeof(EXP))] public class AwcFormatChunk
|
[TC(typeof(EXP))] public class AwcFormatChunk
|
||||||
{
|
{
|
||||||
public uint Samples { get; set; }
|
public uint Samples { get; set; }
|
||||||
public int UnkMinusOne { get; set; }
|
public int LoopPoint { get; set; }
|
||||||
public ushort SamplesPerSecond { get; set; }
|
public ushort SamplesPerSecond { get; set; }
|
||||||
public ushort Unk1 { get; set; }
|
public short Headroom { get; set; }
|
||||||
public ushort Unk2 { get; set; }
|
public ushort Unk2 { get; set; }
|
||||||
public ushort Unk3 { get; set; }
|
public ushort Unk3 { get; set; }
|
||||||
public ushort Unk4 { get; set; }
|
public ushort Unk4 { get; set; }
|
||||||
@ -426,9 +426,9 @@ namespace CodeWalker.GameFiles
|
|||||||
public AwcFormatChunk(DataReader r)
|
public AwcFormatChunk(DataReader r)
|
||||||
{
|
{
|
||||||
Samples = r.ReadUInt32();
|
Samples = r.ReadUInt32();
|
||||||
UnkMinusOne = r.ReadInt32();
|
LoopPoint = r.ReadInt32();
|
||||||
SamplesPerSecond = r.ReadUInt16();
|
SamplesPerSecond = r.ReadUInt16();
|
||||||
Unk1 = r.ReadUInt16();
|
Headroom = r.ReadInt16();
|
||||||
Unk2 = r.ReadUInt16();
|
Unk2 = r.ReadUInt16();
|
||||||
Unk3 = r.ReadUInt16();
|
Unk3 = r.ReadUInt16();
|
||||||
Unk4 = r.ReadUInt16();
|
Unk4 = r.ReadUInt16();
|
||||||
@ -443,7 +443,7 @@ namespace CodeWalker.GameFiles
|
|||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return Unk1.ToString() + ", " + Unk6.ToString() + ": " + Samples.ToString() + " samples, " + SamplesPerSecond.ToString() + " samples/sec";
|
return Headroom.ToString() + ", " + Unk6.ToString() + ": " + Samples.ToString() + " samples, " + SamplesPerSecond.ToString() + " samples/sec";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -503,14 +503,20 @@ namespace CodeWalker.GameFiles
|
|||||||
return fmt + ((hz > 0) ? (", " + hz.ToString() + " Hz") : "");
|
return fmt + ((hz > 0) ? (", " + hz.ToString() + " Hz") : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public float Length
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Format == null ? 0 : (float)Format.Samples / Format.SamplesPerSecond;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public string LengthStr
|
public string LengthStr
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (Format == null) return "0:00";
|
return TimeSpan.FromSeconds(Length).ToString("m\\:ss");
|
||||||
float sec = (float)Format.Samples / Format.SamplesPerSecond;
|
|
||||||
TimeSpan ts = TimeSpan.FromSeconds(sec);
|
|
||||||
return ts.ToString("m\\:ss");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -534,8 +540,8 @@ namespace CodeWalker.GameFiles
|
|||||||
|
|
||||||
public Stream GetWavStream()
|
public Stream GetWavStream()
|
||||||
{
|
{
|
||||||
MemoryStream ms = new MemoryStream();
|
MemoryStream stream = new MemoryStream();
|
||||||
BinaryWriter w = new BinaryWriter(ms);
|
BinaryWriter w = new BinaryWriter(stream);
|
||||||
|
|
||||||
|
|
||||||
//see http://icculus.org/SDL_sound/downloads/external_documentation/wavecomp.htm
|
//see http://icculus.org/SDL_sound/downloads/external_documentation/wavecomp.htm
|
||||||
@ -543,70 +549,38 @@ namespace CodeWalker.GameFiles
|
|||||||
//see https://msdn.microsoft.com/en-us/library/windows/desktop/ff538799(v=vs.85).aspx
|
//see https://msdn.microsoft.com/en-us/library/windows/desktop/ff538799(v=vs.85).aspx
|
||||||
|
|
||||||
|
|
||||||
int sampleCount = SampleCount;
|
|
||||||
int samplesPerSec = SamplesPerSecond;
|
int samplesPerSec = SamplesPerSecond;
|
||||||
//short sampleSize = (short)((BitsPerSample / 8) * Channels);//2
|
|
||||||
//int avgBytesPerSec = sampleSize * samplesPerSec;
|
|
||||||
short blockAlign = 512;
|
|
||||||
|
|
||||||
short samplesPerBlock = (short)((((blockAlign - (7 * Channels)) * 8) / (BitsPerSample * Channels)) + 2);
|
Channels = 1;
|
||||||
int avgBytesPerSec = ((samplesPerSec / samplesPerBlock) * blockAlign);
|
BitsPerSample = 16;
|
||||||
|
int byteRate = samplesPerSec * Channels * BitsPerSample / 8;
|
||||||
|
short blockAlign = (short)(Channels * BitsPerSample / 8);
|
||||||
|
|
||||||
w.Write("RIFF".ToCharArray());
|
// RIFF chunk
|
||||||
w.Write(0); //file size written later...
|
var fileSize = 4 + 24 + 8 + Data.Length;
|
||||||
w.Write("WAVE".ToCharArray());
|
w.Write("RIFF".ToCharArray()); // 0x00 - "RIFF" magic
|
||||||
w.Write("fmt ".ToCharArray());
|
w.Write(fileSize); // 0x04 - file size
|
||||||
w.Write(50); //(PCM:16) //header size
|
w.Write("WAVE".ToCharArray()); // 0x08 - "WAVE" magic
|
||||||
w.Write((short)2); //pcm format tag 1=PCM, 2=ADPCM
|
|
||||||
w.Write(Channels);
|
|
||||||
w.Write(samplesPerSec);
|
|
||||||
w.Write(avgBytesPerSec);
|
|
||||||
w.Write(blockAlign);// sampleSize);
|
|
||||||
w.Write(BitsPerSample);
|
|
||||||
w.Write((short)32);//extra byte count for WAVEFORMATEX
|
|
||||||
|
|
||||||
w.Write(samplesPerBlock);
|
// fmt sub-chunk
|
||||||
w.Write((short)7);//num coefficients
|
w.Write("fmt ".ToCharArray()); // 0x0C - "fmt " magic
|
||||||
w.Write((short)256); //coeff 0
|
w.Write(16); // 0x10 - header size (16 bytes)
|
||||||
w.Write((short)0);
|
w.Write((short)1); // 0x14 - audio format (1=PCM)
|
||||||
w.Write((short)512); //coeff 1
|
w.Write(Channels); // 0x16 - number of channels
|
||||||
w.Write((short)-256);
|
w.Write(samplesPerSec); // 0x18
|
||||||
w.Write((short)0); //coeff 2
|
w.Write(byteRate); // 0x1C
|
||||||
w.Write((short)0);
|
w.Write(blockAlign);// sampleSize); // 0x20
|
||||||
w.Write((short)192); //coeff 3
|
w.Write(BitsPerSample); // 0x22
|
||||||
w.Write((short)64);
|
|
||||||
w.Write((short)240); //coeff 4
|
|
||||||
w.Write((short)0);
|
|
||||||
w.Write((short)460); //coeff 5
|
|
||||||
w.Write((short)-208);
|
|
||||||
w.Write((short)392); //coeff 6
|
|
||||||
w.Write((short)-232);
|
|
||||||
|
|
||||||
|
// data sub-chunk
|
||||||
w.Write("data".ToCharArray());
|
w.Write("data".ToCharArray());
|
||||||
w.Write(0); //data size written later...
|
w.Write(Data.Length);
|
||||||
|
|
||||||
if (sampleCount != 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
//var sc = sampleCount * sampleSize;
|
|
||||||
var datalen = Data.Length;
|
|
||||||
w.Write(Data);
|
w.Write(Data);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
w.Write(Data);
|
|
||||||
}
|
|
||||||
|
|
||||||
ms.Position = 4;
|
|
||||||
w.Write((int)ms.Length - 8);
|
|
||||||
|
|
||||||
ms.Position = 74;// 40;
|
|
||||||
w.Write((int)ms.Length - 78);// 44);
|
|
||||||
|
|
||||||
w.Flush();
|
w.Flush();
|
||||||
|
|
||||||
ms.Position = 0;
|
stream.Position = 0;
|
||||||
return ms;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user