// MonoGame - Copyright (C) The MonoGame Team // This file is subject to the terms and conditions defined in // file 'LICENSE.txt', which is part of this source code package. using System; using System.Collections.Generic; using System.Linq; namespace Microsoft.Xna.Framework.Content.Pipeline.Audio { public abstract class AudioProfile { private static readonly LoadedTypeCollection _profiles = new LoadedTypeCollection(); /// /// Find the profile for this target platform. /// /// The platform target for audio. /// public static AudioProfile ForPlatform(TargetPlatform platform) { var profile = _profiles.FirstOrDefault(h => h.Supports(platform)); if (profile != null) return profile; throw new PipelineException("There is no supported audio profile for the '" + platform + "' platform!"); } /// /// Returns true if this profile supports audio processing for this platform. /// public abstract bool Supports(TargetPlatform platform); /// /// Converts the audio content to work on targeted platform. /// /// The platform to build the audio content for. /// The suggested audio quality level. /// The audio content to convert. /// The quality used for conversion which could be different from the suggested quality. public abstract ConversionQuality ConvertAudio(TargetPlatform platform, ConversionQuality quality, AudioContent content); /// /// Converts the audio content to a streaming format that works on targeted platform. /// /// The platform to build the audio content for. /// The suggested audio quality level. /// he audio content to convert. /// /// The quality used for conversion which could be different from the suggested quality. public abstract ConversionQuality ConvertStreamingAudio(TargetPlatform platform, ConversionQuality quality, AudioContent content, ref string outputFileName); protected static int QualityToSampleRate(ConversionQuality quality, int sourceSampleRate) { switch (quality) { case ConversionQuality.Low: return Math.Max(8000, (int)Math.Floor(sourceSampleRate / 2.0)); case ConversionQuality.Medium: return Math.Max(8000, (int)Math.Floor((sourceSampleRate / 4.0) * 3)); } return Math.Max(8000, sourceSampleRate); } protected static int QualityToBitRate(ConversionQuality quality) { switch (quality) { case ConversionQuality.Low: return 96000; case ConversionQuality.Medium: return 128000; } return 192000; } } }