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();
        }
Beispiel #2
0
        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();
        }