2011-12-16 3 views
2

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

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

+0

Вы используете обычный C# для этого, или вы используете рамки XNA тоже? –

ответ

0

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

+0

Я пробовал сделать это и обновил код выше. Не могли бы вы посмотреть, пожалуйста, так как он все еще не работает? Я предполагаю, что это проблема с потоками. –

+0

Что делает остальная часть вашей программы? Ваш код работает по большей части, за исключением того, что вы должны останавливать() и Dispose() ваш таймер на ClockTick, чтобы остановить таймер от повторного запуска. Если ваша программа выйдет в конце, файл никогда не будет воспроизводиться, например, если у вас есть консольное приложение, которое не ждет ввода какого-либо пользователя. –

0

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

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

Спасибо за ваше предложение - сейчас я пытаюсь использовать потоки. Как вы думаете, вы можете взглянуть на отредактированный код, пожалуйста? –

0

попробовать это:

ThreadPool.QueueUserWorkItem(o => { 
            note.Play(); 
            Thread.Sleep(1000); 
            note.Stop(); 
            });