Пример #1
0
        /// <summary>
        /// Gets the peak byte from the audio file reader.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>The peak byte as an absolute value.</returns>
        public virtual float GetPeak(IAudioFileReader reader)
        {
            float peak = 0;

            var buffer = new float[reader.WaveFormat.SampleRate];
            int read;

            // determine the peak
            do
            {
                read = reader.Read(buffer, 0, buffer.Length);
                for (int n = 0; n < read; n++)
                {
                    var abs = Math.Abs(buffer[n]);
                    if (abs > peak)
                    {
                        peak = abs;
                    }
                }
            } while (read > 0);

            // rewind the reader and set the volume
            reader.Seek(0, SeekOrigin.Begin);
            return(peak);
        }
Пример #2
0
        /// <summary>
        /// Gets the peak of the audio file.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <returns>The peak as an absolute value of the byte.</returns>
        public override float GetPeak(IAudioFileReader reader)
        {
            var key   = this.GetKey(reader);
            var entry = this.Items.GetOrAdd(key, _ => this.GetNewEntry(key, reader));

            return(entry.Peak);
        }
Пример #3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="AudioReaderStateInfo"/> class.
        /// </summary>
        /// <param name="reader">The reader.</param>
        public AudioReaderStateInfo(IAudioFileReader reader)
        {
            this.Reader = new WeakReference <IAudioFileReader>(reader);

            this._volume  = reader.Volume;
            this.FileName = reader.FileName;
        }
Пример #4
0
        /// <summary>
        /// Applies the loudness normalization, based on the percent multiplier.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="maxGain">The maximum gain.</param>
        public void ApplyLoudnessNormalization(IAudioFileReader reader, float maxGain)
        {
            var peak = this.GetPeak(reader);

            if (peak >= maxGain)
            {
                reader.Volume = (1.0f / peak) * maxGain;
            }
        }
Пример #5
0
 /// <summary>
 /// Gets the event arguments from a <see cref="IAudioFileReader"/>.
 /// </summary>
 /// <param name="reader">The reader.</param>
 /// <returns>The event arguments.</returns>
 internal static PlaybackTimeEventArgs FromReader(IAudioFileReader reader)
 {
     try
     {
         return(new PlaybackTimeEventArgs(reader.CurrentTime, reader.TotalTime));
     }
     catch
     {
         return(PlaybackTimeEventArgs.Zero);
     }
 }
Пример #6
0
        /// <summary>
        /// Gets a new cache entry for the specified reader.
        /// </summary>
        /// <param name="key">The key.</param>
        /// <param name="reader">The reader.</param>
        /// <returns>The cache entry.</returns>
        private CacheEntry GetNewEntry(string key, IAudioFileReader reader)
        {
            var peak    = base.GetPeak(reader);
            var watcher = new FileSystemWatcher
            {
                Path   = Path.GetDirectoryName(key),
                Filter = Path.GetFileName(key)
            };

            watcher.Changed            += this.RemoveCacheEntry;
            watcher.Deleted            += this.RemoveCacheEntry;
            watcher.Renamed            += this.RenameCacheEntry;
            watcher.EnableRaisingEvents = true;

            return(new CacheEntry(peak, watcher));
        }
Пример #7
0
 /// <summary>
 /// Gets the cache entry key.
 /// </summary>
 /// <param name="reader">The reader.</param>
 /// <returns>The key.</returns>
 private string GetKey(IAudioFileReader reader)
 => this.GetKey(reader?.FileName);
Пример #8
0
        /// <summary>
        /// Normalizes the volume of the audio file reader, based on the peak.
        /// </summary>
        /// <param name="reader">The reader.</param>
        public void ApplyPeakNormalization(IAudioFileReader reader)
        {
            var peak = this.GetPeak(reader);

            reader.Volume = 1.0f / peak;
        }
Пример #9
0
 /// <summary>
 /// Initializes a new instance of the <see cref="AudioFileEncoder"/> class.
 /// </summary>
 /// <param name="reader">The reader.</param>
 public AudioFileEncoder(IAudioFileReader reader)
 {
     this.Reader = reader;
 }