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