[1114] | 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 | }
|
---|