Мое приложение (C ++, WxWidgets, Ubuntu) должно воспроизводить разные mp3-файлы в зависимости от действий пользователя. В данный момент я использую библиотеку vlc и всегда вызываю новую функцию для воспроизведения аудиофайла, но для этого требуется слишком много кода, и я думаю, что это не так профессионально. Поскольку я не хочу останавливать поток приложения во время воспроизведения mp3, я использую нити.
Я пытался написать класс для mp3, но я думаю, что это не правильно, так как я получаю эту ошибку:
/home/isola/Documents/Isola02/secondpanel.cpp:68:102: error: invalid use of void expression
pthread_create(&thread, NULL, mp3->play_mp3("/home/user/Project/audio/scegli-rifiuto.mp3"), NULL);
Это код моего класса:
rePlay.cpp
#include "rePlay.h"
#include <vlc/vlc.h>
rePlay::rePlay()
{
//ctor
}
rePlay::~rePlay()
{
//dtor
}
void rePlay::play_mp3(const char* path){
// 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, path);
// 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);
printf("Done.\n");
}
void rePlay::stop_mp3(){
// stop playing
libvlc_media_player_stop(mp);
// free the media_player
libvlc_media_player_release(mp);
libvlc_release(inst);
}
и заголовок rePlay. h
#ifndef REPLAY_H
#define REPLAY_H
#include <vlc/vlc.h>
class rePlay
{
public:
rePlay();
virtual ~rePlay();
void play_mp3(const char*);
void stop_mp3();
protected:
libvlc_instance_t *inst;
libvlc_media_player_t *mp;
libvlc_media_t *m;
private:
};
#endif // REPLAY_H
Моя идея - позвонить:
pthread_t thread;
rePlay *mp3;
mp3-> new rePlay ();pthread_create (& thread, NULL, mp3-> play_mp3 ("/ home / user / Project / audio / scegli-rifiuto.mp3"), NULL);
путем передачи пути к файлу каждый раз, когда я хочувоспроизведите mp3 и затем позвоните:
pthread_create(&thread, NULL, mp3->stop_mp3, NULL);
, когда я захочу остановить его.
В данный момент я получаю эту ошибку от компилятора относительно pthread_create, но я думаю, что долженмогут быть другие проблемы, так как я не знаю, могут ли play_mp3 () и stop_mp3 () работать.
Можете ли вы мне помочь, пожалуйста?
EDIT1: класс работаетесли я не использую функцию pthread_create
EDIT2 : если я использую, я получаю ту же ошибку:
std::thread first (mp3->play_mp3("/home/robodyne/Project/audio/scegli-rifiuto.mp3"));
ошибка:
/home/isola/Documents/Isola02/secondpanel.cpp:85:85: error: invalid use of void expression
std::thread first (mp3->play_mp3("/home/robodyne/Project/audio/scegli-rifiuto.mp3"));
EDIT3: Почему, если я объявляю rePlay *mp3_apertura_porta;
в другом классе с именем firstpanel
как public
, я получаю эту ошибку:
/home/isola/Documents/Isola02/firstpanel.cpp: In member function ‘void firstpanel::check_cf(wxTimerEvent&)’:
/home/isola/Documents/Isola02/firstpanel.cpp:160:44: error: capture of non-variable ‘firstpanel::mp3_apertura_porta’
std::thread second = std::thread([&mp3_apertura_porta]() noexcept {
^~~~~~~~~~~~~~~~~~
In file included from /home/isola/Documents/Isola02/firstpanel.cpp:1:0:
/home/isola/Documents/Isola02/firstpanel.h:20:12: note: ‘rePlay* firstpanel::mp3_apertura_porta’ declared here
rePlay *mp3_apertura_porta;
^~~~~~~~~~~~~~~~~~
/home/isola/Documents/Isola02/firstpanel.cpp: In lambda function:
/home/isola/Documents/Isola02/firstpanel.cpp:161:9: error: ‘this’ was not captured for this lambda function
mp3_apertura_porta->play_mp3("/home/robodyne/Project/audio/scegli-rifiuto.mp3"); });
при вызове
rePlay *mp3_apertura_porta = new rePlay();
std::thread first = std::thread([&mp3_apertura_porta]() noexcept {
mp3_apertura_porta->play_mp3("/home/isola/Documents/Isola02/audio/errore-ripetere-la-strisciata.mp3"); });
first.join();
в firstpanel.cpp?