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),但我沒有運氣。單個播放工作正常,它只是重播循環不工作。沒有例外,日誌中什麼都沒有......我迷路了......想法?
其實我認爲這可能是現在的問題任務....似乎是偶爾擊中PlaySound方法。 – Eric