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;
там.
На данный момент в вашем коде нет ничего, что говорило бы о том, что он должен изменяться на черный только после завершения, только после того, как он начал играть.