public async Task openAndPlay(string location, string inputFormatName = null, string audioLocation = null, string audioFormatName = null, List <String> subtitleLocations = null) { try { // cancel any previously running open operation CancellationTokenSource prevCancelTokenSource = CancelTokenSource; Task prevOpenTask = OpenTask; CancellationTokenSource newCancelTokenSource = new CancellationTokenSource(); CancelTokenSource = newCancelTokenSource; await close(prevCancelTokenSource, prevOpenTask); // open video newCancelTokenSource.Token.ThrowIfCancellationRequested(); VideoLocation = location; OpenVideoArgs args = new OpenVideoArgs(location, inputFormatName, audioLocation, audioFormatName); OpenTask = Task.Factory.StartNew(() => videoDecoder.open(args, DecodedVideoFormat, newCancelTokenSource.Token), newCancelTokenSource.Token); await OpenTask; if (videoDecoder.HasVideo) { videoRender.initialize(videoDecoder.Width, videoDecoder.Height); Subtitles.clear(); Subtitles.findMatchingSubtitleFiles(location); if (subtitleLocations != null) { foreach (String subtitleLocation in subtitleLocations) { Subtitles.addSubtitleFile(subtitleLocation); } } Subtitles.Track = 0; } DurationSeconds = videoDecoder.DurationSeconds; HasAudio = videoDecoder.HasAudio; previousVideoPts = 0; previousVideoDelay = 0.04; audioDiffAvgCount = 0; if (videoDecoder.HasAudio) { audioPlayer.initialize(videoDecoder.SamplesPerSecond, videoDecoder.BytesPerSample, Math.Min(videoDecoder.NrChannels, 2), videoDecoder.MaxAudioFrameSize * 2); audioDiffThreshold = 2.0 * 1024 / videoDecoder.SamplesPerSecond; } VideoState = VideoState.OPEN; play(); } catch (VideoLib.VideoLibException) { VideoState = VideoState.CLOSED; //log.Error("Cannot open: " + location, e); throw; } }