1 |
using System; |
2 |
using System.IO; |
3 |
|
4 |
namespace 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 |
writer.Write(Utils.ByteSwap(fcc_FORM)); |
35 |
writer.Write(Utils.ByteSwap(50 + sound.Data.Length)); |
36 |
writer.Write(Utils.ByteSwap(fcc_AIFC)); |
37 |
|
38 |
// |
39 |
// write COMM chunk |
40 |
// |
41 |
|
42 |
writer.Write(Utils.ByteSwap(fcc_COMM)); |
43 |
writer.Write(Utils.ByteSwap(22)); // chunk size |
44 |
writer.Write(Utils.ByteSwap((short)sound.ChannelCount)); |
45 |
writer.Write(Utils.ByteSwap(sound.Data.Length / (sound.ChannelCount * 34))); // numSampleFrames |
46 |
writer.Write(Utils.ByteSwap((short)16)); // sampleSize |
47 |
writer.Write(sampleRate); // sampleRate |
48 |
writer.Write(Utils.ByteSwap(fcc_ima4)); |
49 |
|
50 |
// |
51 |
// write SSND chunk |
52 |
// |
53 |
|
54 |
writer.Write(Utils.ByteSwap(fcc_SSND)); |
55 |
writer.Write(Utils.ByteSwap(8 + sound.Data.Length)); // chunk size |
56 |
writer.Write(0); |
57 |
writer.Write(0); |
58 |
writer.Write(sound.Data); |
59 |
} |
60 |
} |
61 |
|
62 |
} |
63 |
} |