LINUX.ORG.RU

libvorbisfile Приостановить декодирование.


0

0

Декодирую vorbis с помощью libvorbisfile. Нужно «Сделать паузу» Код функции:

void vorbis_decoder::StartDecode()
{
    int current_section;
    int sample_size = 16*ti.channels/8;
    int bufsize = 4096;
    while(stop != true)
    {
        char buf[bufsize];
        long ret=ov_read(&vf,buf,bufsize,0,2,1,&current_section);
        if (ret == 0)
        {
                stop=true;
        }
        else
            if (ret < 0)
            {
            }
            else
            {
                int len = ret/sample_size;
                snd_pcm_writei(ahandle, buf, len); //Вывожу полученые семплы через alsa 
                ti.currpos = ov_time_tell(&vf);
                if (ret < bufsize)
                    bufsize -= ret;
                currentsample += ret / (ti.channels * 2);
                //printf("CurrSample: %d\t EndSample: %d\t Readed: %ld\t\n", currentsample, endsample, ret);
            }
    }
    printf("Stopped\n");
}

Пробовал ввести переменную bool pause, и если она true то просто гонять цикл, если false то выполнять код декодирования, т.е. ~ так:

void vorbis_decoder::StartDecode()
{
    int current_section;
    int sample_size = 16*ti.channels/8;
    int bufsize = 4096;
    while(stop != true)
    {
        if (pause == false)
        {
            char buf[bufsize];
            long ret=ov_read(&vf,buf,bufsize,0,2,1,&current_section);
            if (ret == 0)
            {
                stop=true;
            }
            else
                if (ret < 0)
                {
                }
                else
                {
                    int len = ret/sample_size;
                    snd_pcm_writei(ahandle, buf, len);
                    ti.currpos = ov_time_tell(&vf);
                    if (ret < bufsize)
                    {
                    bufsize -= ret;
                    }
                    currentsample += ret / (ti.channels * 2);
                //printf("CurrSample: %d\t EndSample: %d\t Readed: %ld\t\n", currentsample, endsample, ret);
                }
        }
        else
            sleep(1);
    }
    printf("Stopped\n");
}

Во время декодирования, выставляю pause в true, декодирование приостанавливается, выставляю в fale, цикл прерывается, т.к. ov_read начинает возвращать 0;

Никогда раньше не писал такие вещи. Прошу вашей помощи

В принципе получилось, только почемуто после приостановки нужно заного инициализировать альсу. Но всё-же мне кажется что я делаю это криво :-(

Pentium02 ★★
() автор топика

Страшновато выглядит, но работать должно. Что до альзы - зачем её переинициализировать - неясно. Скорее всего проигрывание остановилось из-за того, что кончились данные в буфере, и после возобновления декодирования проигрывание ahandle нужно заново запустить. По крайней мере в OpenAL так.

Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.