Example #1
0
        public async void Play(int index, CancellationToken cancellationToken)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            bool sameSong = index == SelectedIndex;

            SelectedIndex = index;
            var resourceItem = Items[index];

            // If paused, just unpause and play
            if (PlaybackState == PlaybackState.Paused)
            {
                Pause();
                return;
            }

            // If same song and stream is loaded, just JumpTo start and start play.
            if (sameSong && resourceItem.Stream != null && PlaybackState == PlaybackState.Playing)
            {
                JumpTo(TimeSpan.Zero);
                return;
            }

            Stop(false);

            Log(string.Format(@"Reading : '{0}'", resourceItem.DisplayName));
            var status = await _client.GetStreamAsync(resourceItem, cancellationToken);

            if (status != ResourceLoadStatus.Ok && status != ResourceLoadStatus.StreamExisting)
            {
                Log(string.Format(@"Reading error : {0}", status));
                return;
            }

            Log(string.Format(@"Reading done : {0}", status));

            _resourceItemQueue.Enqueue(resourceItem);

            string extension = new FileInfo(resourceItem.DisplayName).Extension.ToLowerInvariant();

            switch (extension)
            {
            case ".wav":
                _waveSource = new WaveFileReader(resourceItem.Stream);
                break;

            case ".mp3":
                _waveSource = new DmoMp3Decoder(resourceItem.Stream);
                break;

            case ".ogg":
                _waveSource = new NVorbisSource(resourceItem.Stream).ToWaveSource();
                break;

            case ".flac":
                _waveSource = new FlacFile(resourceItem.Stream);
                break;

            case ".wma":
                _waveSource = new WmaDecoder(resourceItem.Stream);
                break;

            case ".aac":
            case ".m4a":
            case ".mp4":
                _waveSource = new AacDecoder(resourceItem.Stream);
                break;

            default:
                throw new NotSupportedException(string.Format("Extension '{0}' is not supported", extension));
            }

            _soundOut.Initialize(_waveSource);
            _soundOut.Play();
            PlayStarted(SelectedIndex, resourceItem);

            // Preload Next
            PreloadNext(cancellationToken);
        }