MP3 проигрывается в отдельной ветке

Одна проблема была решена, другая последовала: В C#-программе я использую следующий метод, чтобы установить зеленый цвет меток, затем проигрываю mp3-файл и, наконец, возвращаю черный цвет. Проблема заключается в том, что звук воспроизводится в дополнительном потоке, поэтому время между сменой двух цветов слишком короткое (на самом деле он должен иметь зеленый цвет во время воспроизведения файла).

private void playSound()
    {
        label1.ForeColor = Color.LimeGreen;
        Application.DoEvents();

        WMPLib.WindowsMediaPlayer wmp = new WMPLib.WindowsMediaPlayer();
        wmp.URL = @"C:\examplesound.mp3"; // duration about 30s
        wmp.controls.play();

        label1.ForeColor = Color.Black;
    }

Можно ли что-нибудь сделать, чтобы лейбл сохранял зеленый цвет во время воспроизведения mp3-файла?

2 ответа

Решение

Не устанавливайте черный цвет сразу, так как воспроизведение идет в другом потоке.

Когда текущий трек заканчивается, WMPLib отправляет PlayStateChange событие.

Итак, добавьте обработчик:

wmp.PlayStateChange += this.Player_PlayStateChange;

private void Player_PlayStateChange(int newState)
{
    if ((WMPLib.WMPPlayState)newState == WMPLib.WMPPlayState.wmppsStopped)
    {
        label1.ForeColor = Color.Black;
    }
}

Страница для playState имеет список значений:

8 - MediaEnded - Медиа-элемент завершил воспроизведение.

Вам нужно убедиться, что это сделано в потоке пользовательского интерфейса.

Попробуйте подключить событие PlayStateChanged и поместите label1.ForeColor = Color.Black; там.

На данный момент в вашем коде нет ничего, что говорило бы о том, что он должен изменяться на черный только после завершения, только после того, как он начал играть.

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