Я не могу понять, почему я продолжаю получать эту ошибку:
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();
}