public void Initialize(Stream stream, AudioInfo info, AudioMetadata metadata, SettingDictionary settings) { InitializeReplayGainFilter(info, metadata, settings); _oggStream = new OggStream(settings.TryGetValue("SerialNumber", out int serialNumber) ? serialNumber : new Random().Next()); // Default to a quality setting of 5 if (settings.TryGetValue("BitRate", out int bitRate)) { if (settings.TryGetValue("ForceCBR", out bool cbr) && cbr) { _encoder = new VorbisEncoder(info.Channels, info.SampleRate, bitRate * 1000, bitRate * 1000, bitRate * 1000); } else { _encoder = new VorbisEncoder(info.Channels, info.SampleRate, -1, bitRate * 1000, -1); } } else { _encoder = new VorbisEncoder(info.Channels, info.SampleRate, settings.TryGetValue("Quality", out int quality) ? quality / 10f : 0.5f); } // Generate the header using (var comment = new MetadataToVorbisCommentAdapter(metadata)) { comment.HeaderOut(_encoder.DspState, out var first, out var second, out var third); _oggStream.PacketIn(first); _oggStream.PacketIn(second); _oggStream.PacketIn(third); } // Buffer the header in memory using (var tempStream = new MemoryStream()) { _outputStream = tempStream; // ReSharper disable once PossibleNullReferenceException while (_oggStream.Flush(out var page)) { WritePage(page); } // Pre-allocate the whole stream (estimate worst case of 500kbps, plus the header) stream.SetLength(0xFA00 * (long)info.PlayLength.TotalSeconds + tempStream.Length); // Flush the headers to the output stream tempStream.WriteTo(stream); } _outputStream = stream; }
public void Initialize(Stream stream, AudioInfo info, AudioMetadata metadata, SettingDictionary settings) { InitializeReplayGainFilter(info, metadata, settings); if (!settings.TryGetValue("SerialNumber", out int serialNumber)) #if NETSTANDARD2_0 { using (var random = RandomNumberGenerator.Create()) { var buffer = new byte[sizeof(int)]; random.GetNonZeroBytes(buffer); serialNumber = BitConverter.ToInt32(buffer, 0); } } #else { serialNumber = RandomNumberGenerator.GetInt32(int.MaxValue); } #endif _oggStream = new(serialNumber); // Default to a quality setting of 5 if (settings.TryGetValue("BitRate", out int bitRate)) { if (settings.TryGetValue("ForceCBR", out bool cbr) && cbr) { _encoder = new(info.Channels, info.SampleRate, bitRate * 1000, bitRate * 1000, bitRate * 1000); } else { _encoder = new(info.Channels, info.SampleRate, -1, bitRate * 1000, -1); } } else { _encoder = new(info.Channels, info.SampleRate, settings.TryGetValue("Quality", out int quality) ? quality / 10f : 0.5f); } // Generate the header using (var comment = new MetadataToVorbisCommentAdapter(metadata)) { comment.HeaderOut(_encoder.DspState, out var first, out var second, out var third); _oggStream.PacketIn(first); _oggStream.PacketIn(second); _oggStream.PacketIn(third); } // Buffer the header in memory using (var tempStream = new MemoryStream()) { _outputStream = tempStream; while (_oggStream.Flush(out var page)) { WritePage(page); } // Pre-allocate the whole stream (estimate worst case of 500kbps, plus the header) stream.SetLength(0xFA00 * (long)info.PlayLength.TotalSeconds + tempStream.Length); // Flush the headers to the output stream tempStream.WriteTo(stream); } _outputStream = stream; }