Как воспроизвести музыкальный файл за указанное количество времени - PullRequest
2 голосов
/ 16 декабря 2011

Я пытаюсь воспроизвести музыкальный файл в течение определенного периода времени, а затем прекратить воспроизведение.Тем не менее, весь музыкальный файл воспроизводится.Любые идеи?

Я пытался начать новую тему, все еще не работает.

Ответы [ 3 ]

0 голосов
/ 16 декабря 2011

Я бы построил что-то вроде этого: это просто написано из-под контроля в окне редактирования, поэтому не ожидайте, что оно будет скомпилировано. Он предназначен только для иллюстрации идеи.

internal class MusicPlayer
{
    private const int duration = 1000;
    private Queue<string> queue;
    private SoundPlayer soundPlayer;
    private Timer timer;

    public MusicPlayer(params object[] filenames)
    {
        this.queue = new Queue<string>();
        foreach (var filenameObject in filenames)
        {
            var filename = filenameObject.ToString();
            if (File.Exists(filename))
            {
                this.queue.Enqueue(filename);
            }
        }

        this.soundPlayer = new SoundPlayer();
        this.timer = new Timer();
        timer.Elapsed += new System.Timers.ElapsedEventHandler(ClockTick);
    }

    public event EventHandler OnDonePlaying;

    public void PlayAll()
    {
        this.PlayNext();
    }

    private void PlayNext()
    {
        this.timer.Stop();
        var filename = this.queue.Dequeue();
        this.soundPlayer.SoundLocation = filename;
        this.soundPlayer.Play();
        this.timer.Interval = duration;
        this.timer.Start();
    }

    private void ClockTick(object sender, EventArgs e)
    {
        if (queue.Count == 0 ) {
            this.soundPlayer.Stop();
            this.timer.Stop();
            if (this.OnDonePlaying != null)
            {
                this.OnDonePlaying.Invoke(this, new EventArgs());
            }
        }
        else 
        {
            this.PlayNext();
        }
    }
}
0 голосов
/ 16 декабря 2011

попробуйте это:

ThreadPool.QueueUserWorkItem(o => {
                                    note.Play();
                                    Thread.Sleep(1000);
                                    note.Stop();
                                   });
0 голосов
/ 16 декабря 2011

Проблема в том, что PlaySync блокирует поток, поэтому другие сообщения не будут обрабатываться. Это включает в себя вашу команду остановки из события Tick. Вы должны использовать обычную функцию Play, которая будет асинхронной и создаст новый поток для воспроизведения файла. Вам придется обрабатывать возникающую ситуацию с многопоточностью в зависимости от того, как работает ваше приложение.

...