2013-11-26 48 views
0

我已經創建了一個聲音播放器,可以在任何給定時間播放聲音集合中的證書聲音。其中的一個聲音需要循環播放。下面是我的代碼: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

這樣的noob .... 每次調用方法時取消標記都是一樣的。所以當我在任務沒有開火之前取消它的時候...... Derp。