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

Comparing OniSplit/Sound/SoundData.cs (file contents):
Revision 1114 by iritscen, Wed Jan 22 14:08:57 2020 UTC vs.
Revision 1131 by geyser, Sat May 30 12:08:12 2020 UTC

# Line 6 | Line 6 | namespace Oni.Sound
6   {
7      internal class SoundData
8      {
9 +        public bool IsIMA4;
10          public int SampleRate;
11          public int ChannelCount;
12          public byte[] Data;
13  
14 <        public static SoundData Read(InstanceDescriptor sndd)
14 >        public static SoundData Read(InstanceDescriptor sndd, bool do_pc_demo_test)
15          {
16              if (sndd.Template.Tag != TemplateTag.SNDD)
17                  throw new ArgumentException("descriptor");
# Line 27 | Line 28 | namespace Oni.Sound
28                      sound.ChannelCount = (reader.ReadInt32() >> 1) + 1;
29                      sound.SampleRate = 22050;
30                      reader.Skip(4);
31 +                    sound.IsIMA4 = true;
32                  }
33                  else
34                  {
35 <                    reader.Skip(6);
35 >                    reader.Skip(6); // ADPCM format identifiers (change to support PCM?)
36                      sound.ChannelCount = reader.ReadInt16();
37                      sound.SampleRate = reader.ReadInt32();
38                      reader.Skip(44);
39 +                    sound.IsIMA4 = false;
40                  }
41  
42                  dataSize = reader.ReadInt32();
# Line 43 | Line 46 | namespace Oni.Sound
46              using (var rawReader = sndd.GetRawReader(dataOffset))
47                  sound.Data = rawReader.ReadBytes(dataSize);
48  
49 +            if (sound.IsIMA4 && do_pc_demo_test) // check if the raw data actually looks like IMA4
50 +            {
51 +                int nIMABlocks = sound.Data.Length / 34;
52 +                int remainder = sound.Data.Length - nIMABlocks * 34;
53 +                if (remainder == 0 && (nIMABlocks % sound.ChannelCount) == 0)
54 +                {
55 +                    bool stepIndexAbove88 = false;
56 +                    for (int ii = 0; ii < nIMABlocks; ii++)
57 +                    {
58 +                        Byte cc = sound.Data[ii * 34 + 1];
59 +                        if ((cc & 0x7F) > 88)
60 +                            stepIndexAbove88 = true;
61 +                    }
62 +                    if (stepIndexAbove88)
63 +                        sound.IsIMA4 = false;
64 +                }
65 +                else
66 +                    sound.IsIMA4 = false;
67 +                if (!(sound.IsIMA4))
68 +                    Console.WriteLine("PC-demo MS ADPCM detected; use -nodemo flag to treat as IMA4.");
69 +            }
70 +
71              return sound;
72          }
73      }

Diff Legend

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