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);
        }
示例#2
0
        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);
        }