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 ответ

Решение

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

Другие вопросы по тегам