Я создал звуковой плеер, чтобы воспроизвести звук 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), но мне не повезло. Одиночные пьесы отлично работают, просто воспроизводя цикл, который не работает. Никаких исключений, ничего в журналах .... Я потерян ... Мысли?
На самом деле я думаю, что это может быть Задача, в которой сейчас проблема .... похоже, спорадически ударяет по методу PlaySound. – Eric