正确编写一个类,并将pthread与vlc库和c ++一起使用

问题描述 投票:0回答:1

我的应用程序(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"));
c++ multithreading class ubuntu libvlc
1个回答
0
投票

您在EDIT2]中启动线程的语法不正确。这是使用lambda的一种方法:

std::thread first = std::thread([&mp3]() noexcept {
    mp3->play_mp3("/home/robodyne/Project/audio/scegli-rifiuto.mp3");
});

//...

first.join();
© www.soinside.com 2019 - 2024. All rights reserved.