0

При запуске плеера, все кнопки работают правильно, после запуска песни при помощи кнопки play все так же работает стабильно, но при повторном нажатии клавиши, приложение запускает ещё один раз эту же песню и они начинают играть одновременно, в следствии чего приложение крашится

button 3 - play \ pause, button 5 - filedrop

Код:

public partial class Form1 : Form
    {
        public string path;
        public int quantity = 0;
        WMPLib.WindowsMediaPlayer Player;
        public Form1()
        {
            InitializeComponent();
        }
    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button3_Click(object sender, EventArgs e)
    {
        Player = new WMPLib.WindowsMediaPlayer();
        Player.URL = path;

        quantity++;
        string startPath = Application.StartupPath;

        if (quantity % 2 != 0)
        {
            startPath += "/pause.png";
            button3.Image = Image.FromFile(startPath);
            button3.ImageAlign = ContentAlignment.MiddleCenter;
            Player.controls.play();
        }
        else
        {
            startPath += "/play.png";
            button3.Image = Image.FromFile(startPath);
            button3.ImageAlign = ContentAlignment.MiddleCenter;
            Player.controls.pause();
        }
    }

    private void button5_Click(object sender, EventArgs e)
    {
        openFileDialog1.ShowDialog();
        string filename = openFileDialog1.SafeFileName;
        path = openFileDialog1.FileName;
        label5.Text = filename;
    }
}

  • 1
    Вы же создаёте новый экземпляр плеера при каждом нажатии кнопки. Player = new WMPLib.WindowsMediaPlayer(); - эту строку перенесите в конструктор или в событие Load. – Alexander Petrov Jun 23 '21 at 12:35
  • 1
    Вы еще и картинки с диска каждый раз перечитываете, что не есть хорошо. – aepot Jun 23 '21 at 12:45
  • @aepot как это можно исправить? – Jeffrey Willis Jun 23 '21 at 13:21
  • @Alexander Petrov после исправления этой ошибки, при проигрывании музыки, плеер иногда начинает тормозить (программа не отвечает), но спустя какое-то время плеер отлагивает – Jeffrey Willis Jun 23 '21 at 13:25

1 Answers1

1

Как-то так это может выглядеть. Не проверял, делал по документации.

public partial class Form1 : Form
{
    private WMPLib.WindowsMediaPlayer Player;
    private Image pauseImage;
    private Image playImage;
    private bool isPlaying;
public Form1()
{
    InitializeComponent();
    button3.ImageAlign = ContentAlignment.MiddleCenter;
}

private void Form1_Load(object sender, EventArgs e)
{
    Player = new WMPLib.WindowsMediaPlayer();
    Player.PlayStateChange += new WMPLib._WMPOCXEvents_PlayStateChangeEventHandler(Player_PlayStateChange);
    Player.MediaError += new WMPLib._WMPOCXEvents_MediaErrorEventHandler(Player_MediaError);

    string startPath = Application.StartupPath;
    pauseImage = Image.FromFile(Path.Combine(startPath, "pause.png"));
    playImage = Image.FromFile(Path.Combine(startPath, "play.png"));
    button3.Image = playImage;
}

private void Player_PlayStateChange(int newState)
{
    isPlaying = (WMPLib.WMPPlayState)newState == WMPLib.WMPPlayState.wmppsPlaying;
    if (isPlaying)
         button3.Image = pauseImage;
    else
         button3.Image = playImage;
}

private void Player_MediaError(object pMediaObject)
{
    MessageBox.Show($"Cannot play media file {Player.URL}.");
}

private void button3_Click(object sender, EventArgs e)
{
    if (isPlaying)
        Player.controls.pause();
    else
        Player.controls.play();
}

private void button5_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        if (isPlaying)
            Player.controls.pause();
        label5.Text = openFileDialog1.SafeFileName;
        Player.URL = openFileDialog1.FileName;
    }
}

}

aepot
  • 49,560
  • Вставив Ваш код и скомпилировав его, получил такой же результат, т.е., программа так же начинает зависать при нажатии кнопки play \ pause. (в тот момент, когда mp3 файлик уже выбран) – Jeffrey Willis Jun 23 '21 at 13:51
  • @JeffreyWillis обновил код – aepot Jun 23 '21 at 13:58
  • @JeffreyWillis если вам просто плеер хочется написать - вот я писал для WPF https://ru.stackoverflow.com/a/1277233/373567, используется встроенный контрол, не библиотека. – aepot Jun 23 '21 at 14:01
  • сейчас mp3 файлик совсем не воспроизводится. К сожалению, мне необходима именно эта реализация, ибо стоит задача создать приложение на winforms используя определенный стиль, который уже был создан в дизайнере. – Jeffrey Willis Jun 23 '21 at 14:03
  • @JeffreyWillis Есть библиотека NAudio, примеров ее использования очень много. Поизучайте. – aepot Jun 23 '21 at 14:31
  • 1
    @JeffreyWillis нашел ошибку в коде, исправил. Обратите внимание, что я вообще удалил переменную path. – aepot Jun 23 '21 at 14:33