예제 #1
0
        /// <summary>
        /// Initializes a new instance of AudioContent.
        /// </summary>
        /// <param name="audioFileName">Name of the audio source file to be processed.</param>
        /// <param name="audioFileType">Type of the processed audio: WAV, MP3 or WMA.</param>
        /// <remarks>Constructs the object from the specified source file, in the format specified.</remarks>
        public AudioContent(string audioFileName, AudioFileType audioFileType)
        {
            _fileName = audioFileName;

            try
            {
                // Get the full path to the file.
                audioFileName = Path.GetFullPath(audioFileName);

                // Use probe to get the details of the file.
                DefaultAudioProfile.ProbeFormat(audioFileName, out _fileType, out _format, out _duration, out _loopStart, out _loopLength);

                // Looks like XNA only cares about type mismatch when
                // the type is WAV... else it is ok.
                if ((audioFileType == AudioFileType.Wav || _fileType == AudioFileType.Wav) &&
                    audioFileType != _fileType)
                {
                    throw new ArgumentException("Incorrect file type!", "audioFileType");
                }

                // Only provide the data for WAV files.
                if (audioFileType == AudioFileType.Wav)
                {
                    byte[] rawData;

                    // Must be opened in read mode otherwise it fails to open
                    // read-only files (found in some source control systems)
                    using (var fs = new FileStream(_fileName, FileMode.Open, FileAccess.Read))
                    {
                        rawData = new byte[fs.Length];
                        fs.Read(rawData, 0, rawData.Length);
                    }

                    AudioFormat riffAudioFormat;
                    var         stripped = DefaultAudioProfile.StripRiffWaveHeader(rawData, out riffAudioFormat);

                    if (riffAudioFormat != null)
                    {
                        if (_format.BlockAlign != riffAudioFormat.BlockAlign)
                        {
                            throw new InvalidOperationException("Calcualted block align does not match RIFF " + _format.BlockAlign + " : " + riffAudioFormat.BlockAlign);
                        }
                        if (_format.ChannelCount != riffAudioFormat.ChannelCount || _format.Format != riffAudioFormat.Format ||
                            _format.SampleRate != riffAudioFormat.SampleRate || _format.AverageBytesPerSecond != riffAudioFormat.AverageBytesPerSecond)
                        {
                            throw new InvalidOperationException("Probed audio format does not match RIFF");
                        }
                    }

                    _data = Array.AsReadOnly(stripped);
                }
            }
            catch (Exception ex)
            {
                var message = string.Format("Failed to open file {0}. Ensure the file is a valid audio file and is not DRM protected.", Path.GetFileNameWithoutExtension(audioFileName));
                throw new InvalidContentException(message, ex);
            }
        }
예제 #2
0
 public void ConvertFormat(ConversionFormat formatType, ConversionQuality quality, string saveToFile)
 {
     // Call the legacy conversion code.
     DefaultAudioProfile.ConvertToFormat(this, formatType, quality, saveToFile);
 }