| 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 |
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 |
} |