source: OniSplit/Sound/AifExporter.cs@ 1130

Last change on this file since 1130 was 1130, checked in by geyser, 4 years ago

Minor fixes and features in SNDD export: "transcoding" forbidden, standard-compliant MSADPCM (with padding and "fact" section), PCM export (with -extract:pcm).

File size: 2.4 KB
Line 
1using System;
2using System.IO;
3
4namespace Oni.Sound
5{
6 internal class AifExporter : SoundExporter
7 {
8 #region Private data
9 private const int fcc_FORM = 0x464f524d;
10 private const int fcc_AIFC = 0x41494643;
11 private const int fcc_COMM = 0x434f4d4d;
12 private const int fcc_ima4 = 0x696d6134;
13 private const int fcc_SSND = 0x53534e44;
14
15 private static readonly byte[] sampleRate = new byte[10]
16 {
17 0x40, 0x0d, 0xac, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
18 };
19
20 #endregion
21
22 public AifExporter(InstanceFileManager fileManager, string outputDirPath)
23 : base(fileManager, outputDirPath)
24 {
25 }
26
27 protected override void ExportInstance(InstanceDescriptor descriptor)
28 {
29 var sound = SoundData.Read(descriptor);
30
31 using (var stream = File.Create(Path.Combine(OutputDirPath, descriptor.FullName + ".aif")))
32 using (var writer = new BinaryWriter(stream))
33 {
34 if (!(sound.IsIMA4))
35 {
36 throw new NotSupportedException("Transcoding from PC ADPCM to Mac/demo ADPCM not supported!");
37 }
38 writer.Write(Utils.ByteSwap(fcc_FORM));
39 writer.Write(Utils.ByteSwap(50 + sound.Data.Length));
40 writer.Write(Utils.ByteSwap(fcc_AIFC));
41
42 //
43 // write COMM chunk
44 //
45
46 writer.Write(Utils.ByteSwap(fcc_COMM));
47 writer.Write(Utils.ByteSwap(22)); // chunk size
48 writer.Write(Utils.ByteSwap((short)sound.ChannelCount));
49 writer.Write(Utils.ByteSwap(sound.Data.Length / (sound.ChannelCount * 34))); // numSampleFrames
50 writer.Write(Utils.ByteSwap((short)16)); // sampleSize
51 writer.Write(sampleRate); // sampleRate
52 writer.Write(Utils.ByteSwap(fcc_ima4));
53
54 //
55 // write SSND chunk
56 //
57
58 writer.Write(Utils.ByteSwap(fcc_SSND));
59 writer.Write(Utils.ByteSwap(8 + sound.Data.Length)); // chunk size
60 writer.Write(0);
61 writer.Write(0);
62 writer.Write(sound.Data);
63 }
64 }
65
66 }
67}
Note: See TracBrowser for help on using the repository browser.