/// <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); }
/// <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); }
/// <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; }
/// <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; } }
/// <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); } }
/// <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)); }
/// <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);
/// <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; }
/// <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; }