Библиотека Vlc не работает, когда я использую fork () в C и Ubuntu - PullRequest
0 голосов
/ 07 октября 2019

Я не могу понять, почему я продолжаю получать эту ошибку:

    ALSA lib pcm_dmix.c:1108:(snd_pcm_dmix_open) unable to open slave
[00005617d3cf0630] alsa audio output error: cannot open ALSA device "default": No such file or directory
[00005617d3cf0630] main audio output error: Audio output failed
[00005617d3cf0630] main audio output error: The audio device "default" could not be used:
No such file or directory.
[00005617d3cf0630] main audio output error: module not functional
[00007f2ce803b080] main decoder error: failed to create audio output

, когда я пытаюсь воспроизвести mp3-файл с помощью fork ().

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

pid = fork();
     printf("il pid: %d\n", pid);
     if (pid == 0) {
         libvlc_instance_t *inst;
    libvlc_media_player_t *mp;
    libvlc_media_t *m;

    // load the vlc engine
    inst = libvlc_new(0, NULL);
    printf("apro il file \n");
    // create a new item
    m = libvlc_media_new_path(inst, "/home/robodyne/Downloads/file.mp3");

    // create a media play playing environment
    mp = libvlc_media_player_new_from_media(m);

    // no need to keep the media now
    libvlc_media_release(m);

    // play the media_player
    libvlc_media_player_play(mp);

    sleep(10);

    // stop playing
    libvlc_media_player_stop(mp);

    // free the media_player
    libvlc_media_player_release(mp);

    libvlc_release(inst);

        exit(0);
}

РЕДАКТИРОВАТЬ1: я пытаюсь использовать резьбы

Следуя совету Антти Хаапала,Я пытался использовать потоки вместо fork (), но когда я вызываю «pthread_cancel (thread);», mp3 не останавливается.

Это мой новый код:

pthread_t thread;

void *wait(void*)
{
    libvlc_instance_t *inst;
    libvlc_media_player_t *mp;
    libvlc_media_t *m;
    // load the vlc engine
    inst = libvlc_new(0, NULL);
    printf("apro il file %d\n", inst);
    // create a new item
    m = libvlc_media_new_path(inst, "/home/robodyne/Downloads/file.mp3");
    // create a media play playing environment
    mp = libvlc_media_player_new_from_media(m);
    // no need to keep the media now
    libvlc_media_release(m);

    // play the media_player
    libvlc_media_player_play(mp);

    sleep(10);
    // stop playing
    libvlc_media_player_stop(mp);
    // free the media_player
    libvlc_media_player_release(mp);
    libvlc_release(inst);


    printf("Done.\n");
}
SecondPage::SecondPage(wxWindow* parent,wxWindowID id)
{
    //(*Initialize(SecondPage)
    Create(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("wxID_ANY"));
    SetClientSize(wxSize(1314,769));
    SetBackgroundColour(wxColour(175,253,202));
    // some code from wxwidgets removed


    m_reboot.Bind(wxEVT_TIMER, &SecondPage::Reboot, this);

     if (get_day_of_year() == 2 || get_day_of_year() == 4){
        secco->Show();
     }

     pthread_create(&thread, NULL, wait, NULL);
}

void SecondPage::OnplasticaClick(wxCommandEvent& event)
{
    pthread_cancel(thread);

    thirdpage = new ThirdPage(nullptr, 2);
    thirdpage->selezione="plastica";
    strcpy(thirdpage->codice_fiscale, codice_fiscale);
    thirdpage->tipologia_rifiuto->SetLabel(thirdpage->selezione);
    thirdpage->Refresh();
    thirdpage->Update();
    thirdpage->m_reboot.StartOnce(600000);
    thirdpage->Show(true);
    this->Hide();
}

1 Ответ

3 голосов
/ 07 октября 2019

A fork является никогда безопасным в многопоточной программе, за исключением случаев, когда сразу следует exit или exec. Непонятно, что вы делаете до вызова fork, но вы делаете что-то нетривиальное наверняка, иначе не было бы никакой разницы между этой раздвоенной версией и той, которая делаетне форк.

К сожалению, на самом деле есть 3 варианта:

  1. fork на самом раннем этапе выполнения программы, прежде чем использовать какие-либо библиотеки,
  2. использовать потоки
  3. выполнить другую программу - например, тот же исполняемый файл с различными аргументами, чтобы он знал, что это дочерний элемент в разветвленномпроцесс.
...