private void WriteSounds(SfxDefinition sfxDefinition) { _writer.WriteCode(Code.Normal, @" ** structure for audio structure SoundStructure, 0 word SoundStartOffset_w ; Offset from the fx pack where to start sound word SoundPeriod_w ; word SoundLength_w byte SoundVolume_b ; Audio volume byte SoundUnused_b ; label SOUND_STRUCTURE_SIZE "); _writer.StartObject(ObjectType.Data, "sounds"); _writer.WriteWord(0); // So the first sound is not 0 which could mean no-sound foreach (var soundTuple in sfxDefinition.Sounds) { var sound = soundTuple.Value; _items.Add(ItemTypes.Sound, soundTuple.Key, _writer.GetCurrentOffset(ObjectType.Data)); var startOffset = (ushort)_waveOffsets[sound.Waveform]; var period = (ushort)(TicksPerSecond / sound.Frequency); var length = (ushort)(_waveLengths[sound.Waveform] / 2); _writer.WriteWord(startOffset); _writer.WriteWord(period); _writer.WriteWord(length); _writer.WriteByte((byte)sound.Volume); _writer.WriteByte(0); } _writer.EndObject(); }
private void Render(SfxDefinition sfxDefinition) { var inBuffer = new float [BufferSize]; var outBuffer = new byte[BufferSize]; WriteWaveFile(sfxDefinition, inBuffer, outBuffer); WriteSounds(sfxDefinition); }
private void WriteWaveFile(SfxDefinition sfxDefinition, float[] inBuffer, byte[] outBuffer) { var offset = 0; var startOffset = 0; _writer.StartObject(ObjectType.Audio, "sfx"); foreach (var wave in sfxDefinition.Waveforms) { using (var audioFile = new AudioFileReader(wave.Value.SoundFile.FromInputFolder())) { while (audioFile.HasData(BufferSize)) { var sampleCount = audioFile.Read(inBuffer, 0, BufferSize); if (sampleCount > 0) { for (var i = 0; i < BufferSize; i++) { outBuffer[i] = (byte)(127 * inBuffer[i]); } _writer.WriteBlob(outBuffer, sampleCount); if (sampleCount % 2 != 0) // make wave ends on even bytes { sampleCount++; _writer.WriteByte(0); } offset += sampleCount; } } } _waveOffsets.Add(wave.Key, startOffset); _waveLengths.Add(wave.Key, offset - startOffset); startOffset = offset; } _writer.EndObject(); }