2017-02-01 8 views
1

Я хотел бы добавить плагин виртуального аудио устройства в приложение. QAudioSystemPlugin подходит для этой задачи.Как построить статический плагин Qt в приложении с CMake?

Но он не загружается.

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.11) 

project(myproject) 

find_package(Qt5 5.5.0 REQUIRED COMPONENTS 
    Core 
    Multimedia 
) 

set(CMAKE_AUTOMOC ON) 
add_definitions("-DQT_STATICPLUGIN") 

add_executable(${PROJECT_NAME} 
    main.cpp 
    VirtualQAudioSystemPlugin.cpp 
) 

target_link_libraries(${PROJECT_NAME} 
    Qt5::Core 
    Qt5::Multimedia 
) 

set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11) 

main.cpp:

#include <iostream> 

#include <QCoreApplication> 
#include <QAudioDeviceInfo> 
#include <QtPlugin> 

Q_IMPORT_PLUGIN(VirtualQAudioSystemPlugin) 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication app(argc, argv); 

    for (const auto& dev : QAudioDeviceInfo::availableDevices(QAudio::AudioInput)) 
     std::cerr << dev.deviceName().toStdString() << "\n"; 

    return app.exec(); 
} 

VirtualQAudioSystemPlugin.hpp:

#pragma once 

#include <QtMultimedia/QAudioSystemPlugin> 

class VirtualQAudioSystemPlugin: public QAudioSystemPlugin 
{ 
    Q_OBJECT 
    Q_PLUGIN_METADATA(IID "org.qt-project.qt.audiosystemfactory/5.0" FILE "virtual.json") 

public: 
    VirtualQAudioSystemPlugin(QObject *parent = 0); 
    ~VirtualQAudioSystemPlugin() {} 

    virtual QList<QByteArray> availableDevices(QAudio::Mode mode) const override; 
    virtual QAbstractAudioInput* createInput(const QByteArray& device) override; 
    virtual QAbstractAudioOutput* createOutput(const QByteArray& device) override; 
    virtual QAbstractAudioDeviceInfo* createDeviceInfo(const QByteArray& device, QAudio::Mode mode) override; 
}; 

VirtualQAudioSystemPlugin.cpp:

#include "VirtualQAudioSystemPlugin.hpp" 

#include <iostream> 

VirtualQAudioSystemPlugin::VirtualQAudioSystemPlugin(QObject *parent) : 
     QAudioSystemPlugin(parent) 
{ 
    std::cerr << "VirtualQAudioSystemPlugin\n"; 
} 

QList<QByteArray> VirtualQAudioSystemPlugin::availableDevices(QAudio::Mode mode) const 
{ 
    std::cerr << "VirtualQAudioSystemPlugin\n"; 
} 

QAbstractAudioInput* VirtualQAudioSystemPlugin::createInput(const QByteArray &device) 
{ 
    std::cerr << "VirtualQAudioSystemPlugin\n"; 
} 

QAbstractAudioOutput* VirtualQAudioSystemPlugin::createOutput(const QByteArray &device) 
{ 
    std::cerr << "VirtualQAudioSystemPlugin\n"; 
} 

QAbstractAudioDeviceInfo* VirtualQAudioSystemPlugin::createDeviceInfo(const QByteArray &device, QAudio::Mode mode) 
{ 
    std::cerr << "VirtualQAudioSystemPlugin\n"; 
} 

virtual.json:

{ 
    "Keys": ["default"] 
} 

Создание и запуск: конструктор из VirtualQAudioSystemPlugin не выполняется.

Как его загрузить?

update: Я тоже пытался сделать его динамическим плагином, он отлично показывает QT_DEBUG_PLUGINS=1, но не создается и не вызывается.

обновление: QT_DEBUG_PLUGINS=1 ничего не связано с плагином, когда плагин встроен в статически.

Это когда pluging отдельная библиотека (шоу, но по-прежнему не работает):

(обратите внимание, что я также заменил «по умолчанию» в virtual.json с «виртуальным»)

QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/x86_64-linux-gnu/qt5/plugins/audio" ... 
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/audio/libqtaudio_alsa.so" 
Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/audio/libqtaudio_alsa.so, metadata= 
{ 
    "IID": "org.qt-project.qt.audiosystemfactory/5.0", 
    "MetaData": { 
     "Keys": [ 
      "alsa" 
     ] 
    }, 
    "className": "QAlsaPlugin", 
    "debug": false, 
    "version": 328961 
} 


Got keys from plugin meta data ("alsa") 
QFactoryLoader::QFactoryLoader() looking at "/usr/lib/x86_64-linux-gnu/qt5/plugins/audio/libqtmedia_pulse.so" 
Found metadata in lib /usr/lib/x86_64-linux-gnu/qt5/plugins/audio/libqtmedia_pulse.so, metadata= 
{ 
    "IID": "org.qt-project.qt.audiosystemfactory/5.0", 
    "MetaData": { 
     "Keys": [ 
      "default" 
     ] 
    }, 
    "className": "QPulseAudioPlugin", 
    "debug": false, 
    "version": 328961 
} 


Got keys from plugin meta data ("default") 
QFactoryLoader::QFactoryLoader() checking directory path "/data/hd2/tmp/plugins/build/audio" ... 
QFactoryLoader::QFactoryLoader() looking at "/data/hd2/tmp/plugins/build/audio/libmyproject.so" 
Found metadata in lib /data/hd2/tmp/plugins/build/audio/libmyproject.so, metadata= 
{ 
    "IID": "org.qt-project.qt.audiosystemfactory/5.0", 
    "MetaData": { 
     "Keys": [ 
      "virtual" 
     ] 
    }, 
    "className": "VirtualQAudioSystemPlugin", 
    "debug": true, 
    "version": 328961 
} 


Got keys from plugin meta data ("virtual") 
loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/audio/libqtaudio_alsa.so" 
loaded library "/usr/lib/x86_64-linux-gnu/qt5/plugins/audio/libqtmedia_pulse.so" 
loaded library "/data/hd2/tmp/plugins/build/audio/libmyproject.so" 
+0

«статический плагин» - противоречивое утверждение. Вы можете что-то связать, _или подключить его во время выполнения. –

+0

@NicolasHolthaus, есть такая же проблема с динамическим плагином, поэтому я не думаю, что причина в статическом или динамическом. «Статический плагин» является частью терминологии Qt: http://doc.qt.io/qt-5/plugins-howto.html#static-plugins – Velkan

ответ

0

Проблема была из-за «по умолчанию» в virtual.json: она была переопределена другими плагинами. Если других плагинов нет, объект создается.

Пришлось изменить что-то другое, как «виртуальное».

{ 
    "Keys": ["virtual"] 
} 
0

Из того, что я могу видеть, это должно быть, а что-то вроде:

class VirtualQAudioSystemPlugin : public QAudioSystemPlugin, public QAudioSystemPluginExtension 
{ 
    Q_OBJECT 
    Q_PLUGIN_METADATA(IID "org.qt-project.qt.audiosystemfactory/5.0" FILE "virtual.json") 
    Q_INTERFACES(QAudioSystemPluginExtension) 
etc. 

Вы также можете установить переменную окружения QT_DEBUG_PLUGINS 1, чтобы получить больше информации о том, что это происходит.

+0

Почему существует необходимость в 'QAudioSystemPluginExtension'? – Velkan

+0

Поскольку фабрика, которая будет искать плагины аудиосистем, будет искать плагины, реализующие этот интерфейс. – SGaist

+0

SGaist, почему он в частных заголовках и почему он не существует в 5.7? – Velkan

 Смежные вопросы

  • Нет связанных вопросов^_^