public override SoundEffectContent Process(AudioContent input, ContentProcessorContext context) { // Fallback if we aren't buiding for iOS. var platform = ContentHelper.GetMonoGamePlatform(); if (platform != MonoGamePlatform.iOS) { return(base.Process(input, context)); } var targetSampleRate = input.Format.SampleRate; // XNA SoundEffects have their sample rate changed based on the quality setting on the processor. //http://blogs.msdn.com/b/etayrien/archive/2008/09/22/audio-input-and-output-formats.aspx switch (this.Quality) { case ConversionQuality.Best: break; case ConversionQuality.Medium: targetSampleRate = (int)(targetSampleRate * 0.75f); break; case ConversionQuality.Low: targetSampleRate = (int)(targetSampleRate * 0.5f); break; } targetSampleRate = Math.Max(8000, targetSampleRate); var wavStream = new MemoryStream(); WaveFormat outputFormat = AudioConverter.ConvertFile(input.FileName, wavStream, AudioFileType.Wav, targetSampleRate, input.Format.BitsPerSample, input.Format.ChannelCount); var outputData = new ReadOnlyCollection <byte>(wavStream.ToArray()); wavStream.Close(); var waveFormatHeader = writeWavHeader(outputFormat); // SoundEffectContent is a sealed class, construct it using reflection var type = typeof(SoundEffectContent); ConstructorInfo c = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(ReadOnlyCollection <byte>), typeof(ReadOnlyCollection <byte>), typeof(int), typeof(int), typeof(int) }, null); var outputSoundEffectContent = (SoundEffectContent)c.Invoke(new Object[] { waveFormatHeader, outputData, input.LoopStart, input.LoopLength, (int)input.Duration.TotalMilliseconds }); return(outputSoundEffectContent); }
public override SongContent Process(AudioContent input, ContentProcessorContext context) { // Fallback if we aren't buiding for iOS. var platform = ContentHelper.GetMonoGamePlatform(); if (platform != MonoGamePlatform.iOS && platform != MonoGamePlatform.Linux) { return(base.Process(input, context)); } //TODO: If quality isn't best and it's a .wma, don't compress to MP3. Leave it as a .wav instead string outputType = (platform == MonoGamePlatform.iOS) ? "mp3" : "wav"; string outputFilename = Path.ChangeExtension(context.OutputFilename, outputType); string directoryName = Path.GetDirectoryName(outputFilename); if (!Directory.Exists(directoryName)) { Directory.CreateDirectory(directoryName); } var inputFilename = Path.GetFullPath(input.FileName); // XNA's songprocessor converts the bitrate on the input file based // on it's conversion quality. //http://blogs.msdn.com/b/etayrien/archive/2008/09/22/audio-input-and-output-formats.aspx int desiredOutputBitRate = 0; switch (this.Quality) { case ConversionQuality.Low: desiredOutputBitRate = 96000; break; case ConversionQuality.Medium: desiredOutputBitRate = 128000; break; case ConversionQuality.Best: desiredOutputBitRate = 192000; break; } AudioFileType target = (platform == MonoGamePlatform.iOS) ? AudioFileType.Mp3 : AudioFileType.Wav; // Create a new file if we need to. FileStream outputStream = input.FileType != target ? new FileStream(outputFilename, FileMode.Create) : null; if (input.FileType != target) { AudioConverter.ConvertFile(inputFilename, outputStream, target, desiredOutputBitRate, input.Format.BitsPerSample, input.Format.ChannelCount); } else { File.Copy(inputFilename, outputFilename, true); } if (outputStream != null) { outputStream.Close(); } context.AddOutputFile(outputFilename); // SoundEffectContent is a sealed class, construct it using reflection var type = typeof(SongContent); ConstructorInfo c = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string), typeof(int) }, null); var outputSongContent = (SongContent)c.Invoke(new Object[] { Path.GetFileName(outputFilename), (int)input.Duration.TotalMilliseconds }); return(outputSongContent); }