libvlc - не может вызвать функцию из обратного вызова

0

Я пишу программу GTK/VLC. Как и в обычном медиаплеере, моя программа должна действовать следующим образом:

  1. Двойной щелчок по GtkTreeView playlist (реализованному с использованием GtkTreeView) позволяет player (реализованному с помощью libvlc_media_player) воспроизводить выбранный носитель.
  2. Когда достигнут конец носителя, player поднимает событие. Это событие используется для вызова процедуры, которая:
    • поиск следующих медиа в playlist
    • функция g_signal_emit используется для имитации события двойного щелчка в g_signal_emit воспроизведения, чтобы выбрать следующий носитель.

Проблема в том, что функция "играть" player не может быть вызвана тем же потоком обратного вызова самого player.

Как я могу выбраться из этого беспорядка?

** Дополнения ** Сигналы vlc кажутся асинхронными, а gtk - нет. Есть ли способ генерировать асинхронные события gtk?

Теги:
gtk
vlc

1 ответ

2
Лучший ответ

Вам нужно запустить другой поток (или отправить сообщение в другой поток) и запустить там команду. Это хорошо известная проблема с обратными вызовами в libvlc.

Вот как я это сделал:

void player::libvlc_event( const struct libvlc_event_t* event )
{
    //come from another thread
    if( libvlc_MediaPlayerEndReached == event->type ||
        libvlc_MediaPlayerEncounteredError == event->type )
    {
        if( mode_single != get_playback_mode() ) {
            //to avoid deadlock we should execute commands on another thread
            std::thread th( &player::next, this );
            th.detach();
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню