ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/OniSplit/Sound/WavImporter.cs
(Generate patch)

Comparing OniSplit/Sound/WavImporter.cs (file contents):
Revision 1114 by iritscen, Wed Jan 22 14:08:57 2020 UTC vs.
Revision 1156 by geyser, Sat May 8 01:44:24 2021 UTC

# Line 5 | Line 5 | namespace Oni.Sound
5   {
6      internal class WavImporter : Importer
7      {
8 +        private readonly bool convertToDemo;
9 +
10 +        public WavImporter(bool toDemo)
11 +            : base(toDemo?InstanceFileHeader.OniMacTemplateChecksum:InstanceFileHeader.OniPCTemplateChecksum)
12 +        {
13 +            convertToDemo = toDemo;
14 +        }
15 +
16          public override void Import(string filePath, string outputDirPath)
17          {
18              var wav = WavFile.FromFile(filePath);
# Line 37 | Line 45 | namespace Oni.Sound
45  
46          private void WriteSNDD(string name, WavFile wav)
47          {
48 <            float duration = wav.SoundData.Length * 8.0f / wav.BitsPerSample;
41 <            duration /= wav.SampleRate;
42 <            duration /= wav.ChannelCount;
43 <            duration *= 60.0f;
48 >            float duration = wav.SampleCount * 60.0f / wav.SampleRate;
49  
50              var sndd = CreateInstance(TemplateTag.SNDD, name);
51 <
52 <            using (var writer = sndd.OpenWrite(8))
51 >            if (convertToDemo)
52 >            {
53 >                // TODO: also validate other ADPCM parameters (coefficient table)?
54 >                if (wav.Format != WavFormat.Adpcm) // Or is PCM supported, actually?
55 >                    Console.WriteLine("Cannot convert to PC demo: ADPCM format required!");
56 >                if (wav.SampleRate != 22050)
57 >                    Console.WriteLine("Cannot convert to PC demo: 22050 kHz required!");
58 >                if (wav.BlockAlign != 512 * wav.ChannelCount)
59 >                    Console.WriteLine("Cannot convert to PC demo: wrong block alignment!");
60 >                if (wav.BitsPerSample != 4)
61 >                    Console.WriteLine("Cannot convert to PC demo: wrong bits per sample!");
62 >
63 >                using (var writer = sndd.OpenWrite())
64 >                {
65 >                    if (wav.ChannelCount == 2)
66 >                        writer.WriteInt16(3);
67 >                    else
68 >                        writer.WriteInt16(1);
69 >                    writer.WriteInt16(0);
70 >                    writer.Write((int)duration);
71 >                    writer.Write(wav.SoundData.Length);
72 >                    writer.Write(WriteRawPart(wav.SoundData));
73 >                    writer.Skip(8);
74 >                }
75 >            }
76 >            else
77              {
78 <                writer.Write((short)wav.Format);
79 <                writer.WriteInt16(wav.ChannelCount);
80 <                writer.Write(wav.SampleRate);
81 <                writer.Write(wav.AverageBytesPerSecond);
82 <                writer.WriteInt16(wav.BlockAlign);
83 <                writer.WriteInt16(wav.BitsPerSample);
84 <                writer.WriteInt16(wav.ExtraData.Length);
85 <                writer.Write(wav.ExtraData);
86 <                writer.Skip(32 - wav.ExtraData.Length);
87 <                writer.Write((short)duration);
88 <                writer.Write(wav.SoundData.Length);
89 <                writer.Write(WriteRawPart(wav.SoundData));
78 >                using (var writer = sndd.OpenWrite())
79 >                {
80 >                    if (wav.Format == WavFormat.Adpcm)
81 >                        writer.WriteInt16(8);
82 >                    else
83 >                        writer.WriteInt16(0);
84 >                    writer.WriteInt16(0);
85 >                    writer.Write((short)wav.Format);
86 >                    writer.WriteInt16(wav.ChannelCount);
87 >                    writer.Write(wav.SampleRate);
88 >                    writer.Write(wav.AverageBytesPerSecond);
89 >                    writer.WriteInt16(wav.BlockAlign);
90 >                    writer.WriteInt16(wav.BitsPerSample);
91 >                    writer.WriteInt16(wav.ExtraData.Length);
92 >                    writer.Write(wav.ExtraData);
93 >                    writer.Skip(32 - wav.ExtraData.Length);
94 >                    writer.Write((short)duration);
95 >                    writer.Write(wav.SoundData.Length);
96 >                    writer.Write(WriteRawPart(wav.SoundData));
97 >                    writer.Skip(24);
98 >                }
99              }
100          }
101      }

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)