2013-11-26 3 views
0

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

public class SoundService : ISoundService 
{ 
    private Dictionary<string, SoundPlayer> SoundCollections { get; set; } 
    private SoundPlayer _soundPlayerPlaceHolder; 
    private readonly CancellationTokenSource _cancellationToken = new CancellationTokenSource(); 
    private CancellationToken _token; 

    public void Play(SoundType soundType) 
    { 
     _token = _cancellationToken.Token; 
     Task.Factory.StartNew(() => PlaySound(soundType), _token); 
    } 

    private void PlayLooping(SoundType soundType) 
    { 
     if (!SoundCollections.ContainsKey(soundType.ToString())) 
     { 
      s_Log.Error("Error retrieving sound from Sound collection. XXX.SoundService"); 
      return; 
     } 
     _soundPlayerPlaceHolder = SoundCollections[soundType.ToString()]; 
     if (_token.IsCancellationRequested) 
     { 
      if (_soundPlayerPlaceHolder != null) 
      { 
       _soundPlayerPlaceHolder.Stop(); 
       _soundPlayerPlaceHolder = null; 
      } 
      return; 
     } 

     _soundPlayerPlaceHolder.PlayLooping(); 

    } 

    public void StopSound() 
    { 
     _cancellationToken.Cancel(); 
    } 

    public void LoadSounds() 
    { 
     var sounds = Enum.GetValues(typeof (SoundType)); 
     SoundCollections = new Dictionary<string,SoundPlayer>(); 
     foreach (var soundType in sounds) 
     { 
      var resourceName = GetResourceNameAttribute(soundType); 
      if (string.IsNullOrEmpty(resourceName)) 
       continue; 

      try 
      { 
       var stream = Resources.ResourceManager.GetStream(resourceName); 

       var soundPlayer = new SoundPlayer(stream); 
       soundPlayer.LoadAsync(); 

       SoundCollections.Add(soundType.ToString(), soundPlayer); 
       s_Log.Info(string.Format(@"loading sound {0}", soundType)); 
      } 
      catch (Exception e) 
      { 
       s_Log.Error(e); 
      } 
     } 

    } 

    private string GetResourceNameAttribute(object enumToQuery) 
    { 
     var fi = enumToQuery.GetType().GetField(enumToQuery.ToString()); 

     var attributes = (ResourceNameAttribute[])fi.GetCustomAttributes(
      typeof(ResourceNameAttribute), false); 

     return attributes.Length > 0 ? attributes[0].ResourceName : enumToQuery.ToString(); 
    } 


    /// <summary> 
    /// . 
    /// </summary> 
    /// <param name="aSoundType"></param> 
    private void PlaySound(SoundType aSoundType) 
    { 
     s_Log.Info("loading sound {0}", aSoundType.ToString()); 

     if (aSoundType == SoundType.ItemNotFound) 
     { 
      PlayLooping(aSoundType); 
     } 
     else 
     { 
      if (_soundPlayerPlaceHolder == null) 
      SoundCollections[aSoundType.ToString()].Play(); 
     } 
    } 
} 

Проблема с этим я испытываю это после того, как звук игрок играет в цикле (который работает) и маркер отмены отменен я не могу играть один и тот же звук петля больше. Я не уверен, почему это так, и я пробовал много других вариантов потока (Task, BackgroundWorker), но мне не повезло. Одиночные пьесы отлично работают, просто воспроизводя цикл, который не работает. Никаких исключений, ничего в журналах .... Я потерян ... Мысли?

+0

На самом деле я думаю, что это может быть Задача, в которой сейчас проблема .... похоже, спорадически ударяет по методу PlaySound. – Eric

ответ

0

Такой нуб .... Маркер отмены был одинаковым при каждом вызове метода. Поэтому, когда я отменил его до того, как Задача не стреляла ... Дерп.

Смежные вопросы