--- OniSplit/Sound/WavImporter.cs 2020/01/22 14:08:57 1114 +++ OniSplit/Sound/WavImporter.cs 2021/05/03 15:22:15 1154 @@ -5,6 +5,14 @@ namespace Oni.Sound { internal class WavImporter : Importer { + private readonly bool convertToDemo; + + public WavImporter(bool toDemo) + : base(toDemo?InstanceFileHeader.OniMacTemplateChecksum:InstanceFileHeader.OniPCTemplateChecksum) + { + convertToDemo = toDemo; + } + public override void Import(string filePath, string outputDirPath) { var wav = WavFile.FromFile(filePath); @@ -43,21 +51,52 @@ namespace Oni.Sound duration *= 60.0f; var sndd = CreateInstance(TemplateTag.SNDD, name); - - using (var writer = sndd.OpenWrite(8)) + if (convertToDemo) + { + // TODO: also validate other ADPCM parameters (coefficient table)? + if (wav.Format != WavFormat.Adpcm) // Or is PCM supported, actually? + Console.WriteLine("Cannot convert to PC demo: ADPCM format required!"); + if (wav.SampleRate != 22050) + Console.WriteLine("Cannot convert to PC demo: 22050 kHz required!"); + if (wav.BlockAlign != 512 * wav.ChannelCount) + Console.WriteLine("Cannot convert to PC demo: wrong block alignment!"); + if (wav.BitsPerSample != 4) + Console.WriteLine("Cannot convert to PC demo: wrong bits per sample!"); + + using (var writer = sndd.OpenWrite()) + { + if (wav.ChannelCount == 2) + writer.WriteInt16(3); + else + writer.WriteInt16(1); + writer.WriteInt16(0); + writer.Write((int)duration); + writer.Write(wav.SoundData.Length); + writer.Write(WriteRawPart(wav.SoundData)); + } + } + else { - writer.Write((short)wav.Format); - writer.WriteInt16(wav.ChannelCount); - writer.Write(wav.SampleRate); - writer.Write(wav.AverageBytesPerSecond); - writer.WriteInt16(wav.BlockAlign); - writer.WriteInt16(wav.BitsPerSample); - writer.WriteInt16(wav.ExtraData.Length); - writer.Write(wav.ExtraData); - writer.Skip(32 - wav.ExtraData.Length); - writer.Write((short)duration); - writer.Write(wav.SoundData.Length); - writer.Write(WriteRawPart(wav.SoundData)); + using (var writer = sndd.OpenWrite()) + { + if (wav.Format == WavFormat.Adpcm) + writer.WriteInt16(8); + else + writer.WriteInt16(0); + writer.WriteInt16(0); + writer.Write((short)wav.Format); + writer.WriteInt16(wav.ChannelCount); + writer.Write(wav.SampleRate); + writer.Write(wav.AverageBytesPerSecond); + writer.WriteInt16(wav.BlockAlign); + writer.WriteInt16(wav.BitsPerSample); + writer.WriteInt16(wav.ExtraData.Length); + writer.Write(wav.ExtraData); + writer.Skip(32 - wav.ExtraData.Length); + writer.Write((short)duration); + writer.Write(wav.SoundData.Length); + writer.Write(WriteRawPart(wav.SoundData)); + } } } }