Я хотел бы добавить плагин виртуального аудио устройства в приложение. 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"
«статический плагин» - противоречивое утверждение. Вы можете что-то связать, _или подключить его во время выполнения. –
@NicolasHolthaus, есть такая же проблема с динамическим плагином, поэтому я не думаю, что причина в статическом или динамическом. «Статический плагин» является частью терминологии Qt: http://doc.qt.io/qt-5/plugins-howto.html#static-plugins – Velkan