public static void TranscodePreview(IList <int> previewtimes, List <AudioFormat.Mapping> maps, IDecoder decoder, Stream stream, ProgressIndicator progress) { RawkAudio.Encoder encoder; if (maps != null && maps.Count(m => m.Instrument == Instrument.Preview) > 0) { decoder.Seek(0); List <ushort> masks = new List <ushort>(); foreach (var m in maps) { if (m.Instrument == Instrument.Preview) { masks.Add((ushort)(1 << maps.IndexOf(m))); } } ushort[] mask = masks.ToArray(); encoder = new RawkAudio.Encoder(stream, mask.Length, decoder.SampleRate, 28000); long samples = decoder.Samples; progress.NewTask("Transcoding Preview", samples); JaggedShortArray buffer = new JaggedShortArray(encoder.Channels, decoder.AudioBuffer.Rank2); while (samples > 0) { int read = decoder.Read((int)Math.Min(samples, decoder.AudioBuffer.Rank2)); if (read <= 0) { break; } decoder.AudioBuffer.DownmixTo(buffer, mask, read); encoder.Write(buffer, read); samples -= read; progress.Progress(read); } progress.EndTask(); } else { long start = Math.Min(decoder.Samples, (long)previewtimes[0] * decoder.SampleRate / 1000); decoder.Seek(start); long duration = Math.Min(decoder.Samples - start, (long)(previewtimes[1] - previewtimes[0]) * decoder.SampleRate / 1000); encoder = new RawkAudio.Encoder(stream, 1, decoder.SampleRate); AudioFormat.Transcode(encoder, decoder, duration, progress); } encoder.Dispose(); }
internal void EncodeOggAudio(AudioFormat data, FormatData destination, IFormat format, Stream stream, ProgressIndicator progress) { IDecoder decoder = data.Decoder; RawkAudio.Encoder encoder = new RawkAudio.Encoder(stream, decoder.Channels, decoder.SampleRate); AudioFormat.ProcessOffset(decoder, encoder, data.InitialOffset); progress.NewTask(1); AudioFormat.Transcode(encoder, decoder, progress); progress.Progress(); encoder.Dispose(); destination.CloseStream(format, AudioName); decoder.Dispose(); data.Save(destination.AddStream(format, FormatName)); destination.CloseStream(format, FormatName); progress.EndTask(); }