Воспроизведение аудио остановилось, когда я изменил размер WaveForm до размера

У меня проблема с моим аудио приложением. я использую nAudio библиотека. Поэтому, когда я воспроизводю звук без использования метода "SamplesPerPixel" в моем элементе управления waveViewer, все работает отлично, но когда я хочу присвоить значение этому методу. Звук, когда я играю, начинается с неожиданного времени и заканчивается около 4 секунд. потом.

Вот мой код:

namespace AudioMixer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int bytesPerSample;
        int samples;
        int samplespixel;
        private NAudio.Wave.WaveStream pcm = null;

        private NAudio.Wave.BlockAlignReductionStream stream = null;
        private NAudio.Wave.DirectSoundOut output = null;

        private void openFileToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();

            dialog.Filter = "Audio File (*.wav;*.mp3)|*.wav;*.mp3;";

            if (dialog.ShowDialog() != DialogResult.OK) return;

            DisposeWave();

            if (dialog.FileName.EndsWith(".mp3"))
            {
                pcm = NAudio.Wave.WaveFormatConversionStream.CreatePcmStream(new NAudio.Wave.Mp3FileReader(dialog.FileName));
                stream = new NAudio.Wave.BlockAlignReductionStream(pcm);
            } 
            else if (dialog.FileName.EndsWith(".wav")) 
            {
                pcm = new NAudio.Wave.WaveChannel32(new NAudio.Wave.WaveFileReader(dialog.FileName));
                stream = new NAudio.Wave.BlockAlignReductionStream(pcm);       
            }

            output = new NAudio.Wave.DirectSoundOut();
            output.Init(stream);
            output.Stop();

            waveViewer1.WaveStream = stream;
            bytesPerSample = (pcm.WaveFormat.BitsPerSample / 8) * pcm.WaveFormat.Channels;
            samples = (int)(pcm.Length / bytesPerSample);
            samplespixel = samples / this.Width;
            waveViewer1.SamplesPerPixel = samplespixel;

            opened_file_name.Text = dialog.FileName;
            play_button.Visible = true;
            play_button.Enabled = true;           
        }

        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);
            waveViewer1.SamplesPerPixel = samplespixel;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            opened_file_name.Text = "Audio file not opened, choose one from Your computer";
            play_button.Visible = false;
        }

        private void play_button_Click(object sender, EventArgs e)
        {
            if (output != null)
            {
                if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing)
                {
                    output.Pause();
                }
                else if (output.PlaybackState == NAudio.Wave.PlaybackState.Paused)
                {
                    output.Play();
                }
                else if (output.PlaybackState == NAudio.Wave.PlaybackState.Stopped)
                {
                    output.Play();
                }
            }
        }

        private void DisposeWave()
        {
            if (output != null)
            {
                if (output.PlaybackState == NAudio.Wave.PlaybackState.Playing)
                {
                    output.Stop();
                    output.Dispose();
                    output = null;
                }    
            }

            if (stream != null)
            {
                stream.Dispose();
                stream = null;
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            DisposeWave();
        }

        private void closeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

1 ответ

Я думаю, что это может помочь вам

waveViewer1.SamplesPerPixel = 400; waveViewer1.StartPosition = 400;

Другие вопросы по тегам