| 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); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 51 | 
   | 
             duration *= 60.0f; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 52 | 
   | 
  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 53 | 
   | 
             var sndd = CreateInstance(TemplateTag.SNDD, name); | 
 
 
 
 
 
 
 
 
 
 
 
 | 54 | 
 < | 
  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 55 | 
 < | 
             using (var writer = sndd.OpenWrite(8)) | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 54 | 
 > | 
             if (convertToDemo) | 
 
 
 
 
 
 | 55 | 
 > | 
             { | 
 
 
 
 
 
 | 56 | 
 > | 
                 // TODO: also validate other ADPCM parameters (coefficient table)? | 
 
 
 
 
 
 | 57 | 
 > | 
                 if (wav.Format != WavFormat.Adpcm) // Or is PCM supported, actually? | 
 
 
 
 
 
 | 58 | 
 > | 
                     Console.WriteLine("Cannot convert to PC demo: ADPCM format required!"); | 
 
 
 
 
 
 | 59 | 
 > | 
                 if (wav.SampleRate != 22050) | 
 
 
 
 
 
 | 60 | 
 > | 
                     Console.WriteLine("Cannot convert to PC demo: 22050 kHz required!"); | 
 
 
 
 
 
 | 61 | 
 > | 
                 if (wav.BlockAlign != 512 * wav.ChannelCount) | 
 
 
 
 
 
 | 62 | 
 > | 
                     Console.WriteLine("Cannot convert to PC demo: wrong block alignment!"); | 
 
 
 
 
 
 | 63 | 
 > | 
                 if (wav.BitsPerSample != 4) | 
 
 
 
 
 
 | 64 | 
 > | 
                     Console.WriteLine("Cannot convert to PC demo: wrong bits per sample!"); | 
 
 
 
 
 
 | 65 | 
 > | 
  | 
 
 
 
 
 
 | 66 | 
 > | 
                 using (var writer = sndd.OpenWrite()) | 
 
 
 
 
 
 | 67 | 
 > | 
                 { | 
 
 
 
 
 
 | 68 | 
 > | 
                     if (wav.ChannelCount == 2) | 
 
 
 
 
 
 | 69 | 
 > | 
                         writer.WriteInt16(3); | 
 
 
 
 
 
 | 70 | 
 > | 
                     else  | 
 
 
 
 
 
 | 71 | 
 > | 
                         writer.WriteInt16(1); | 
 
 
 
 
 
 | 72 | 
 > | 
                     writer.WriteInt16(0); | 
 
 
 
 
 
 | 73 | 
 > | 
                     writer.Write((int)duration); | 
 
 
 
 
 
 | 74 | 
 > | 
                     writer.Write(wav.SoundData.Length); | 
 
 
 
 
 
 | 75 | 
 > | 
                     writer.Write(WriteRawPart(wav.SoundData)); | 
 
 
 
 
 
 | 76 | 
 > | 
                 } | 
 
 
 
 
 
 | 77 | 
 > | 
             } | 
 
 
 
 
 
 | 78 | 
 > | 
             else | 
 
 
 
 
 
 
 
 
 
 
 
 | 79 | 
   | 
             { | 
 
 
 
 
 
 
 
 
 
 
 
 | 80 | 
 < | 
                 writer.Write((short)wav.Format); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 81 | 
 < | 
                 writer.WriteInt16(wav.ChannelCount); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 82 | 
 < | 
                 writer.Write(wav.SampleRate); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 83 | 
 < | 
                 writer.Write(wav.AverageBytesPerSecond); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 84 | 
 < | 
                 writer.WriteInt16(wav.BlockAlign); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 85 | 
 < | 
                 writer.WriteInt16(wav.BitsPerSample); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 86 | 
 < | 
                 writer.WriteInt16(wav.ExtraData.Length); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 87 | 
 < | 
                 writer.Write(wav.ExtraData); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 88 | 
 < | 
                 writer.Skip(32 - wav.ExtraData.Length); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 89 | 
 < | 
                 writer.Write((short)duration); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 90 | 
 < | 
                 writer.Write(wav.SoundData.Length); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 91 | 
 < | 
                 writer.Write(WriteRawPart(wav.SoundData)); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 80 | 
 > | 
                 using (var writer = sndd.OpenWrite()) | 
 
 
 
 
 
 | 81 | 
 > | 
                 { | 
 
 
 
 
 
 | 82 | 
 > | 
                     if (wav.Format == WavFormat.Adpcm) | 
 
 
 
 
 
 | 83 | 
 > | 
                         writer.WriteInt16(8); | 
 
 
 
 
 
 | 84 | 
 > | 
                     else | 
 
 
 
 
 
 | 85 | 
 > | 
                         writer.WriteInt16(0); | 
 
 
 
 
 
 | 86 | 
 > | 
                     writer.WriteInt16(0); | 
 
 
 
 
 
 | 87 | 
 > | 
                     writer.Write((short)wav.Format); | 
 
 
 
 
 
 | 88 | 
 > | 
                     writer.WriteInt16(wav.ChannelCount); | 
 
 
 
 
 
 | 89 | 
 > | 
                     writer.Write(wav.SampleRate); | 
 
 
 
 
 
 | 90 | 
 > | 
                     writer.Write(wav.AverageBytesPerSecond); | 
 
 
 
 
 
 | 91 | 
 > | 
                     writer.WriteInt16(wav.BlockAlign); | 
 
 
 
 
 
 | 92 | 
 > | 
                     writer.WriteInt16(wav.BitsPerSample); | 
 
 
 
 
 
 | 93 | 
 > | 
                     writer.WriteInt16(wav.ExtraData.Length); | 
 
 
 
 
 
 | 94 | 
 > | 
                     writer.Write(wav.ExtraData); | 
 
 
 
 
 
 | 95 | 
 > | 
                     writer.Skip(32 - wav.ExtraData.Length); | 
 
 
 
 
 
 | 96 | 
 > | 
                     writer.Write((short)duration); | 
 
 
 
 
 
 | 97 | 
 > | 
                     writer.Write(wav.SoundData.Length); | 
 
 
 
 
 
 | 98 | 
 > | 
                     writer.Write(WriteRawPart(wav.SoundData)); | 
 
 
 
 
 
 | 99 | 
 > | 
                 } | 
 
 
 
 
 
 
 
 
 
 
 
 | 100 | 
   | 
             } | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 101 | 
   | 
         } | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 102 | 
   | 
     } |