예제 #1
0
        public static DialogResult Show(AudioFormat format, string[] names, Form parent)
        {
            AudioForm form = new AudioForm();

            form.Format = format;
            form.Names  = names;
            return(form.ShowDialog(parent));
        }
예제 #2
0
        private void ReplaceAudioButton_Click(object sender, EventArgs e)
        {
            OpenDialog.Multiselect = true;
            OpenDialog.Title       = "Select audio files";
            OpenDialog.Filter      = "Common Audio Files|*.ogg;*.wav;*.flac;*.mp3;*.aiff;*.ac3|All Files|*";
            if (OpenDialog.ShowDialog(this) == DialogResult.Cancel)
            {
                return;
            }

            bool allogg = true;

            using (DelayedStreamCache cache = new DelayedStreamCache()) {
                FormatData    data    = new TemporaryFormatData();
                AudioFormat   format  = new AudioFormat();
                List <string> names   = new List <string>();
                Stream[]      streams = new Stream[OpenDialog.FileNames.Length];
                for (int i = 0; i < streams.Length; i++)
                {
                    string filename = OpenDialog.FileNames[i];
                    streams[i] = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);

                    cache.AddStream(streams[i]);
                    IDecoder decoder;
                    if (new EndianReader(streams[i], Endianness.BigEndian).ReadUInt32() != OggMagic)
                    {
                        allogg = false;
                        streams[i].Position = 0;
                        decoder             = new FFmpegDecoder(streams[i]);
                    }
                    else
                    {
                        decoder = new RawkAudio.Decoder(streams[i], RawkAudio.Decoder.AudioFormat.VorbisOgg);
                    }

                    for (int k = 0; k < decoder.Channels; k++)
                    {
                        names.Add(Path.GetFileName(filename) + " [Channel #" + (k + 1).ToString("0") + "]");
                        float balance = 0;
                        if (decoder.Channels == 2)
                        {
                            balance = k == 0 ? -1 : 1;
                        }
                        format.Mappings.Add(new AudioFormat.Mapping(0, balance, Platform.InstrumentFromString(Path.GetFileNameWithoutExtension(filename))));
                    }

                    decoder.Dispose();
                    streams[i].Position = 0;
                }

                if (AudioForm.Show(format, names.ToArray(), this) == DialogResult.Cancel)
                {
                    return;
                }

                foreach (IFormat audioformat in Data.GetFormats(FormatType.Audio))
                {
                    foreach (string audiostream in Data.GetStreamNames(audioformat))
                    {
                        Data.DeleteStream(audiostream);
                    }
                }

                if (allogg)
                {
                    AudioFormatOgg.Instance.Create(data, streams, format);
                }
                else
                {
                    AudioFormatFFmpeg.Instance.Create(data, streams, format);
                }
                data.SaveTo(Data);
            }

            UpdateAudioSizes();
        }