#region License /* FNA - XNA4 Reimplementation for Desktop Platforms * Copyright 2009-2020 Ethan Lee and the MonoGame Team * * Released under the Microsoft Public License. * See LICENSE for details. */ #endregion #region Using Statements using System.IO; using Microsoft.Xna.Framework.Audio; #endregion namespace Microsoft.Xna.Framework.Content { internal class SoundEffectReader : ContentTypeReader { #region Private Supported File Extensions Variable static string[] supportedExtensions = new string[] { ".wav" }; #endregion #region Internal Filename Normalizer Method internal static string Normalize(string fileName) { return Normalize(fileName, supportedExtensions); } #endregion #region Protected Read Method protected internal override SoundEffect Read( ContentReader input, SoundEffect existingInstance ) { /* Swap endian - this is one of the very few places requiring this! * Note: This only affects the fmt chunk that's glued into the file. */ bool se = input.platform == 'x'; // Format block length uint formatLength = input.ReadUInt32(); // WaveFormatEx data ushort wFormatTag = Swap(se, input.ReadUInt16()); ushort nChannels = Swap(se, input.ReadUInt16()); uint nSamplesPerSec = Swap(se, input.ReadUInt32()); uint nAvgBytesPerSec = Swap(se, input.ReadUInt32()); ushort nBlockAlign = Swap(se, input.ReadUInt16()); ushort wBitsPerSample = Swap(se, input.ReadUInt16()); /* ushort cbSize =*/ input.ReadUInt16(); // Seek past the rest of this crap (cannot seek though!) input.ReadBytes((int) (formatLength - 18)); // Wavedata byte[] data = input.ReadBytes(input.ReadInt32()); // Loop information int loopStart = input.ReadInt32(); int loopLength = input.ReadInt32(); // Sound duration in milliseconds, unused input.ReadUInt32(); return new SoundEffect( input.AssetName, data, 0, data.Length, wFormatTag, nChannels, nSamplesPerSec, nAvgBytesPerSec, nBlockAlign, wBitsPerSample, loopStart, loopLength ); } #endregion #region Internal Static Swapping Methods internal static ushort Swap(bool swap, ushort x) { return !swap ? x : (ushort) ( ((x >> 8) & 0x00FF) | ((x << 8) & 0xFF00) ); } internal static uint Swap(bool swap, uint x) { return !swap ? x : ( ((x >> 24) & 0x000000FF) | ((x >> 8) & 0x0000FF00) | ((x << 8) & 0x00FF0000) | ((x << 24) & 0xFF000000) ); } #endregion } }