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