private void OnPlayerOutputReady(AudioToolbox.OutputAudioQueue outputAudioQueue)
        {
            Console.WriteLine($"Player: Output Ready");

            _audioQueueTimeline = outputAudioQueue.CreateTimeline();
            MediaStateChanged(MediaState.Opened);
        }
        private async Task StreamDownloadHandler(Guid guid, CancellationToken cancellationToken)
        {
            var  buffer = new byte[8192];
            long totalNumberBytesRead = 0;

            _totalStreamLength  = 0L;
            _audioQueueTimeline = null;

            Console.WriteLine($"Downloader started");
            try
            {
                using (_player = new StreamingPlayback())
                {
                    _player.OutputReady             += OnPlayerOutputReady;
                    _player.Finished                += OnPlayerFinished;
                    _player.AudioPlayerStateChanged += OnAudioPlayerStateChanged;

                    Uri requestUri = GetRequestUri(guid);
                    using (var httpClient = await _requestService.GetHttpClient())
                    {
                        using (var response = await TryGetAsync(0, requestUri, httpClient, cancellationToken))
                        {
                            _totalStreamLength = response.Content.Headers.ContentLength.GetValueOrDefault(totalNumberBytesRead);
                            Console.WriteLine($"Stream Length: {_totalStreamLength}");

                            using (var inputStream = await GetQueueStream(response.Content, cancellationToken))
                            {
                                //var inputStream = await response.Content.ReadAsStreamAsync();
                                int inputStreamLength;

                                while (((inputStreamLength = inputStream.Read(buffer, 0, buffer.Length)) != 0) || !cancellationToken.IsCancellationRequested)
                                {
                                    if (cancellationToken.IsCancellationRequested)
                                    {
                                        cancellationToken.ThrowIfCancellationRequested();
                                    }
                                    //Console.WriteLine($"{nameof(StreamDownloadHandler)} read {totalNumberBytesRead} from {_totalStreamLength} ");
                                    totalNumberBytesRead += inputStreamLength;
                                    _player.ParseBytes(buffer, inputStreamLength, false, totalNumberBytesRead == (int)_totalStreamLength);
                                }
                            }
                        }
                    }
                }
            }
            catch (HttpStatusRequestException exception)
            {
                Console.WriteLine($"Exception thrown in {nameof(StreamDownloadHandler)} with message {exception.Message}");
                if (exception.StatusCode == System.Net.HttpStatusCode.BadRequest)
                {
                    MediaStateChanged(MediaState.BadRequest);
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine($"Exception thrown in {nameof(StreamDownloadHandler)} with message {exception.Message}");
            }
        }
        void RepeatingAction(AudioQueueTimeline timeline, double sampleRate)
        {
            var queue = player.OutputQueue;

            if (queue == null || timeline == null)
            {
                return;
            }

            bool disc = false;
            var  time = new AudioTimeStamp();

            queue.GetCurrentTime(timeline, ref time, ref disc);

            playbackTime.Text = FormatTime(time.SampleTime / sampleRate);
        }
Example #4
0
        public override double Now()
        {
            double result = 0;

            if (m_AudioQueue == null)
            {
                return(result);
            }

            AudioQueueTimeline timeline  = m_AudioQueue.CreateTimeline();
            AudioTimeStamp     timestamp = new AudioTimeStamp();
            bool t = false;

            m_AudioQueue.GetCurrentTime(timeline, ref timestamp, ref t);
            return(timestamp.SampleTime / m_SampleFormat.Rate * 1000);
        }
        void StreamDownloadedHandler(IAsyncResult result)
        {
            var    buffer = new byte [8192];
            int    l      = 0;
            int    inputStreamLength;
            double sampleRate = 0;

            Stream             inputStream;
            AudioQueueTimeline timeline = null;

            var request = result.AsyncState as HttpWebRequest;

            try {
                var response       = request.EndGetResponse(result);
                var responseStream = response.GetResponseStream();

                if (PlayerOption == PlayerOption.StreamAndSave)
                {
                    inputStream = GetQueueStream(responseStream);
                }
                else
                {
                    inputStream = responseStream;
                }

                using (player = new StreamingPlayback()) {
                    player.OutputReady += delegate {
                        timeline   = player.OutputQueue.CreateTimeline();
                        sampleRate = player.OutputQueue.SampleRate;
                    };

                    InvokeOnMainThread(delegate {
                        if (updatingTimer != null)
                        {
                            updatingTimer.Invalidate();
                        }

                        updatingTimer = NSTimer.CreateRepeatingScheduledTimer(0.5, (timer) => RepeatingAction(timeline, sampleRate));
                    });

                    while ((inputStreamLength = inputStream.Read(buffer, 0, buffer.Length)) != 0 && player != null)
                    {
                        l += inputStreamLength;
                        player.ParseBytes(buffer, inputStreamLength, false, l == (int)response.ContentLength);

                        InvokeOnMainThread(delegate {
                            progressBar.Progress = l / (float)response.ContentLength;
                        });
                    }
                }
            } catch (Exception e) {
                RaiseErrorOccurredEvent("Error fetching response stream\n" + e);
                Debug.WriteLine(e);
                InvokeOnMainThread(delegate {
                    if (NavigationController != null)
                    {
                        NavigationController.PopToRootViewController(true);
                    }
                });
            }
        }
		private void RepeatingAction (AudioQueueTimeline timeline, double sampleRate)
		{
			var queue = player.OutputQueue;
			if (queue == null || timeline == null)
				return;

			bool disc = false;
			var time = new AudioTimeStamp ();
			queue.GetCurrentTime (timeline, ref time, ref disc);

			playbackTime.Text = FormatTime (time.SampleTime / sampleRate);
		}
Example #7
0
        void StreamDownloaded(IAsyncResult result)
        {
            var  request = result.AsyncState as HttpWebRequest;
            bool pushed  = false;

            try {
                var    response       = request.EndGetResponse(result);
                var    responseStream = response.GetResponseStream();
                Stream inputStream;
                var    buffer = new byte [8192];
                int    l = 0, n;

                InvokeOnMainThread(delegate {
                    viewController.PushViewController(playController, true);
                });

                pushed = true;

                if (saveCopy)
                {
                    inputStream = MakeQueueStream(responseStream);
                }
                else
                {
                    inputStream = responseStream;
                }

                //
                // Create StreamingPlayer, the using statement will automatically
                // force the resources to be disposed and the playback to stop.
                //
                using (player = new StreamingPlayback()){
                    AudioQueueTimeline timeline   = null;
                    double             sampleRate = 0;

                    player.OutputReady += delegate {
                        timeline   = player.OutputQueue.CreateTimeline();
                        sampleRate = player.OutputQueue.SampleRate;
                    };
                    InvokeOnMainThread(delegate {
                        if (updatingTimer != null)
                        {
                            updatingTimer.Invalidate();
                        }

                        updatingTimer = NSTimer.CreateRepeatingScheduledTimer(0.5, delegate {
                            var queue = player.OutputQueue;
                            if (queue == null || timeline == null)
                            {
                                return;
                            }

                            bool disc           = false;
                            AudioTimeStamp time = new AudioTimeStamp();
                            queue.GetCurrentTime(timeline, ref time, ref disc);

                            playbackTime.Text = FormatTime(time.SampleTime / sampleRate);
                        });
                    });
                    while ((n = inputStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        l += n;
                        player.ParseBytes(buffer, n, false, l == (int)response.ContentLength);

                        InvokeOnMainThread(delegate {
                            progress.Progress = l / (float)response.ContentLength;
                        });
                    }
                }
            } catch (Exception e) {
                InvokeOnMainThread(delegate {
                    if (pushed)
                    {
                        viewController.PopToRootViewController(true);
                        pushed = false;
                    }
                    status.Text = "Error fetching response stream\n" + e;
                    Console.WriteLine(e);
                });
            }

            //
            // Restore the default AudioSession, this allows the iPhone
            // to go to sleep now that we are done playing the audio
            //
            AudioSession.Category = AudioSessionCategory.MediaPlayback;
            if (pushed)
            {
                viewController.PopToRootViewController(true);
                status.Text = "Finished playback";
            }
        }