AudioPlayerAgent Streaming — Stop не удаляет буфер

В настоящее время я разрабатываю приложение для веб-радио, и если пользователь нажимает клавишу паузы/стоп, поток должен останавливаться, и, конечно, когда он снова нажимает кнопку воспроизведения, поток должен продолжаться.

У меня проблема в том, что player.Stop() только приостанавливает дорожку. Если снова нажать продолжить, то первые 5 секунд читаются не из потока, а из буфера, затем несколько секунд не воспроизводится звук, а затем снова начинается чтение из потока.

Это фатально для приложения веб-радио. Как я могу это исправить? Или как я могу удалить буфер?

    protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
    {
        switch (playState)
        {
            case PlayState.TrackReady:
                player.Play();
                break;
            case PlayState.Stopped:
                player.Stop();
                break;
            case PlayState.Paused:
                player.Stop();
                break; 
        }

        NotifyComplete();
    }

person martinyyyy    schedule 01.02.2012    source источник


Ответы (2)


Ладно... просто чтобы вы знали, вот что я сделал. Я не знаю, есть ли лучший способ, но это работает для меня:

        protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
    {
        switch (playState)
        {
            case PlayState.Stopped:
                track.BeginEdit();
                track.Tag = track.Source.OriginalString;
                track.Source = new Uri("http://127.0.0.1", UriKind.Absolute);
                track.EndEdit();

                player.Track = track;
                break;


        protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
    {
        switch (action)
        {
            case UserAction.Play:
                if (player.PlayerState != PlayState.Playing)
                {
                    try
                    {
                        player.Play();
                    }
                    catch(Exception)
                    {
                        track.BeginEdit();
                        track.Source = new Uri(player.Track.Tag, UriKind.Absolute);
                        track.EndEdit();

                        player.Track = track;
                        player.Play();
                    }
                }
                break;
            case UserAction.Stop:
            case UserAction.Pause:
                if (player.Track.Source.OriginalString != "http://127.0.0.1/")
                {
                    player.Stop();
                }
                break;
person martinyyyy    schedule 07.02.2012
comment
+1 за обратную связь. Это обязательно когда-нибудь мне пригодится. Избранное. - person spender; 16.02.2012

Как насчет того, чтобы выбросить все, когда вы остановитесь, и снова добавить его, когда воспроизведение начнется снова? Кажется, функциональность, которую вы используете, больше подходит для приостановки статического контента. Пауза не имеет особого смысла с радио.

person spender    schedule 01.02.2012
comment
Как только вы установите для дорожки или чего-либо еще значение null, AudioPlayerAgent закрывается. И поскольку это фоновая задача, которая также запускается, когда приложение закрыто, я не могу его перезапустить. - person martinyyyy; 01.02.2012
comment
Ой. Я буду с интересом следить за этим, так как мы, вероятно, напишем то же самое через несколько месяцев. - person spender; 01.02.2012