void VstPlugin::tryLoad( const QString &remoteVstPluginExecutable ) { init( remoteVstPluginExecutable, false, {m_embedMethod} ); waitForHostInfoGotten(); if( failed() ) { return; } lock(); VstHostLanguages hlang = LanguageEnglish; switch( QLocale::system().language() ) { case QLocale::French: hlang = LanguageFrench; break; case QLocale::German: hlang = LanguageGerman; break; case QLocale::Italian: hlang = LanguageItalian; break; case QLocale::Japanese: hlang = LanguageJapanese; break; case QLocale::Korean: hlang = LanguageKorean; break; case QLocale::Spanish: hlang = LanguageSpanish; break; default: break; } sendMessage( message( IdVstSetLanguage ).addInt( hlang ) ); sendMessage( message( IdVstLoadPlugin ).addString( QSTR_TO_STDSTR( m_plugin ) ) ); waitForInitDone(); unlock(); }
bool RemotePlugin::init( const QString &pluginExecutable, bool waitForInitDoneMsg ) { lock(); if( m_failed ) { reset( new shmFifo(), new shmFifo() ); m_failed = false; } QString exec = configManager::inst()->pluginDir() + QDir::separator() + pluginExecutable; QStringList args; // swap in and out for bidirectional communication args << QString::number( out()->shmKey() ); args << QString::number( in()->shmKey() ); #ifndef DEBUG_REMOTE_PLUGIN m_process.setProcessChannelMode( QProcess::ForwardedChannels ); m_process.setWorkingDirectory( QCoreApplication::applicationDirPath() ); m_process.start( exec, args ); m_watcher.start( QThread::LowestPriority ); #else qDebug() << exec << args; #endif resizeSharedProcessingMemory(); if( waitForInitDoneMsg ) { waitForInitDone(); } unlock(); return failed(); }
bool RemotePlugin::init(const QString &pluginExecutable, bool waitForInitDoneMsg , QStringList extraArgs) { lock(); if( m_failed ) { #ifdef SYNC_WITH_SHM_FIFO reset( new shmFifo(), new shmFifo() ); #endif m_failed = false; } QString exec = QFileInfo(QDir("plugins:"), pluginExecutable).absoluteFilePath(); #ifdef LMMS_BUILD_APPLE // search current directory first QString curDir = QCoreApplication::applicationDirPath() + "/" + pluginExecutable; if( QFile( curDir ).exists() ) { exec = curDir; } #endif #ifdef LMMS_BUILD_WIN32 if( ! exec.endsWith( ".exe", Qt::CaseInsensitive ) ) { exec += ".exe"; } #endif if( ! QFile( exec ).exists() ) { qWarning( "Remote plugin '%s' not found.", exec.toUtf8().constData() ); m_failed = true; invalidate(); unlock(); return failed(); } QStringList args; #ifdef SYNC_WITH_SHM_FIFO // swap in and out for bidirectional communication args << QString::number( out()->shmKey() ); args << QString::number( in()->shmKey() ); #else args << m_socketFile; #endif args << extraArgs; #ifndef DEBUG_REMOTE_PLUGIN m_process.setProcessChannelMode( QProcess::ForwardedChannels ); m_process.setWorkingDirectory( QCoreApplication::applicationDirPath() ); m_process.start( exec, args ); m_watcher.start( QThread::LowestPriority ); #else qDebug() << exec << args; #endif #ifndef SYNC_WITH_SHM_FIFO struct pollfd pollin; pollin.fd = m_server; pollin.events = POLLIN; switch ( poll( &pollin, 1, 30000 ) ) { case -1: qWarning( "Unexpected poll error." ); break; case 0: qWarning( "Remote plugin did not connect." ); break; default: m_socket = accept( m_server, NULL, NULL ); if ( m_socket == -1 ) { qWarning( "Unexpected socket error." ); } } #endif resizeSharedProcessingMemory(); if( waitForInitDoneMsg ) { waitForInitDone(); } unlock(); return failed(); }
void VstPlugin::tryLoad( const QString &remoteVstPluginExecutable ) { init( remoteVstPluginExecutable, false ); lock(); #ifdef LMMS_BUILD_WIN32 QWidget * helper = new QWidget; QHBoxLayout * l = new QHBoxLayout( helper ); QWidget * target = new QWidget( helper ); l->setSpacing( 0 ); l->setMargin( 0 ); l->addWidget( target ); static int k = 0; const QString t = QString( "vst%1%2" ).arg( GetCurrentProcessId()<<10 ). arg( ++k ); helper->setWindowTitle( t ); // we've to call that for making sure, Qt created the windows (void) helper->winId(); (void) target->winId(); sendMessage( message( IdVstPluginWindowInformation ). addString( QSTR_TO_STDSTR( t ) ) ); #endif VstHostLanguages hlang = LanguageEnglish; switch( QLocale::system().language() ) { case QLocale::French: hlang = LanguageFrench; break; case QLocale::German: hlang = LanguageGerman; break; case QLocale::Italian: hlang = LanguageItalian; break; case QLocale::Japanese: hlang = LanguageJapanese; break; case QLocale::Korean: hlang = LanguageKorean; break; case QLocale::Spanish: hlang = LanguageSpanish; break; default: break; } sendMessage( message( IdVstSetLanguage ).addInt( hlang ) ); QString p = m_plugin; if( QFileInfo( p ).dir().isRelative() ) { p = ConfigManager::inst()->vstDir() + p; } sendMessage( message( IdVstLoadPlugin ).addString( QSTR_TO_STDSTR( p ) ) ); waitForInitDone(); unlock(); #ifdef LMMS_BUILD_WIN32 if( !failed() && m_pluginWindowID ) { target->setFixedSize( m_pluginGeometry ); vstSubWin * sw = new vstSubWin( gui->mainWindow()->workspace() ); sw->setWidget( helper ); helper->setWindowTitle( name() ); m_pluginWidget = helper; } else { delete helper; } #endif }