Merge branch 'stable-1.2'
# Conflicts: # .travis/osx..install.sh # CMakeLists.txt # cmake/apple/install_apple.sh.in # doc/lmms.1 # include/VstSyncController.h # plugins/carlabase/carla.h # plugins/vestige/vestige.cpp # plugins/vst_base/CMakeLists.txt # plugins/vst_base/RemoteVstPlugin.cpp # plugins/vst_base/Win64/CMakeLists.txt # plugins/zynaddsubfx/zynaddsubfx # plugins/zynaddsubfx/zynaddsubfx/src/Misc/QtXmlWrapper.cpp # src/core/Song.cpp # src/core/main.cpp
This commit is contained in:
@@ -80,7 +80,7 @@ private slots:
|
||||
{
|
||||
const float opl = getPeak_L();
|
||||
const float opr = getPeak_R();
|
||||
const float fall_off = 1.2;
|
||||
const float fallOff = 1.07;
|
||||
if( *m_lPeak > opl )
|
||||
{
|
||||
setPeak_L( *m_lPeak );
|
||||
@@ -88,7 +88,7 @@ private slots:
|
||||
}
|
||||
else
|
||||
{
|
||||
setPeak_L( opl/fall_off );
|
||||
setPeak_L( opl/fallOff );
|
||||
}
|
||||
|
||||
if( *m_rPeak > opr )
|
||||
@@ -98,7 +98,7 @@ private slots:
|
||||
}
|
||||
else
|
||||
{
|
||||
setPeak_R( opr/fall_off );
|
||||
setPeak_R( opr/fallOff );
|
||||
}
|
||||
update();
|
||||
}
|
||||
|
||||
@@ -223,7 +223,7 @@ void EqSpectrumView::paintEvent(QPaintEvent *event)
|
||||
float peak;
|
||||
m_path.moveTo( 0, height() );
|
||||
m_peakSum = 0;
|
||||
float fallOff = 1.2;
|
||||
const float fallOff = 1.07;
|
||||
for( int x = 0; x < MAX_BANDS; ++x, ++bands )
|
||||
{
|
||||
peak = ( fh * 2.0 / 3.0 * ( 20 * ( log10( *bands / energy ) ) - LOWER_Y ) / ( - LOWER_Y ) );
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "TrackContainer.h"
|
||||
#include "BBTrack.h"
|
||||
#include "InstrumentTrack.h"
|
||||
#include "LocaleHelper.h"
|
||||
|
||||
#include "plugin_export.h"
|
||||
|
||||
@@ -134,7 +135,7 @@ bool MidiExport::tryExport(const TrackContainer::TrackList &tracks,
|
||||
{
|
||||
base_pitch += masterPitch;
|
||||
}
|
||||
base_volume = it.attribute("volume", "100").toDouble()/100.0;
|
||||
base_volume = LocaleHelper::toDouble(it.attribute("volume", "100"))/100.0;
|
||||
}
|
||||
|
||||
if (n.nodeName() == "pattern")
|
||||
@@ -205,7 +206,7 @@ bool MidiExport::tryExport(const TrackContainer::TrackList &tracks,
|
||||
{
|
||||
base_pitch += masterPitch;
|
||||
}
|
||||
base_volume = it.attribute("volume", "100").toDouble() / 100.0;
|
||||
base_volume = LocaleHelper::toDouble(it.attribute("volume", "100")) / 100.0;
|
||||
}
|
||||
|
||||
if (n.nodeName() == "pattern")
|
||||
@@ -274,7 +275,7 @@ void MidiExport::writePattern(MidiNoteVector &pat, QDomNode n,
|
||||
// TODO interpret pan="0" fxch="0" pitchrange="1"
|
||||
MidiNote mnote;
|
||||
mnote.pitch = qMax(0, qMin(127, note.attribute("key", "0").toInt() + base_pitch));
|
||||
mnote.volume = qMin(qRound(base_volume * note.attribute("vol", "100").toDouble()), 127);
|
||||
mnote.volume = qMin(qRound(base_volume * LocaleHelper::toDouble(note.attribute("vol", "100"))), 127);
|
||||
mnote.time = base_time + note.attribute("pos", "0").toInt();
|
||||
mnote.duration = note.attribute("len", "0").toInt();
|
||||
pat.push_back(mnote);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "VstEffectControls.h"
|
||||
#include "VstEffect.h"
|
||||
|
||||
#include "LocaleHelper.h"
|
||||
#include "MainWindow.h"
|
||||
#include "GuiApplication.h"
|
||||
#include <QMdiArea>
|
||||
@@ -85,8 +86,8 @@ void VstEffectControls::loadSettings( const QDomElement & _this )
|
||||
if( !( knobFModel[ i ]->isAutomated() ||
|
||||
knobFModel[ i ]->controllerConnection() ) )
|
||||
{
|
||||
knobFModel[ i ]->setValue( (s_dumpValues.at( 2 ) ).toFloat() );
|
||||
knobFModel[ i ]->setInitValue( (s_dumpValues.at( 2 ) ).toFloat() );
|
||||
knobFModel[ i ]->setValue(LocaleHelper::toFloat(s_dumpValues.at(2)));
|
||||
knobFModel[ i ]->setInitValue(LocaleHelper::toFloat(s_dumpValues.at(2)));
|
||||
}
|
||||
|
||||
connect( knobFModel[i], SIGNAL( dataChanged() ), this, SLOT( setParameter() ) );
|
||||
@@ -373,7 +374,7 @@ manageVSTEffectView::manageVSTEffectView( VstEffect * _eff, VstEffectControls *
|
||||
if( !hasKnobModel )
|
||||
{
|
||||
sprintf( paramStr, "%d", i);
|
||||
m_vi->knobFModel[ i ] = new FloatModel( ( s_dumpValues.at( 2 ) ).toFloat(),
|
||||
m_vi->knobFModel[ i ] = new FloatModel( LocaleHelper::toFloat(s_dumpValues.at(2)),
|
||||
0.0f, 1.0f, 0.01f, _eff, tr( paramStr ) );
|
||||
}
|
||||
connect( m_vi->knobFModel[ i ], SIGNAL( dataChanged() ), this,
|
||||
@@ -437,7 +438,7 @@ void manageVSTEffectView::syncPlugin( void )
|
||||
{
|
||||
sprintf( paramStr, "param%d", i );
|
||||
s_dumpValues = dump[ paramStr ].split( ":" );
|
||||
f_value = ( s_dumpValues.at( 2 ) ).toFloat();
|
||||
f_value = LocaleHelper::toFloat(s_dumpValues.at(2));
|
||||
m_vi2->knobFModel[ i ]->setAutomatedValue( f_value );
|
||||
m_vi2->knobFModel[ i ]->setInitValue( f_value );
|
||||
}
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
# For MacOS, use "OLD" RPATH install_name behavior
|
||||
# This can be changed to "NEW" safely if install_apple.sh.in
|
||||
# is updated to relink libcarlabase.dylib. MacOS 10.8 uses
|
||||
# cmake 3.9.6, so this can be done at any time.
|
||||
IF(NOT CMAKE_VERSION VERSION_LESS 3.9)
|
||||
CMAKE_POLICY(SET CMP0068 OLD)
|
||||
ENDIF()
|
||||
|
||||
if(LMMS_HAVE_CARLA)
|
||||
INCLUDE(BuildPlugin)
|
||||
INCLUDE_DIRECTORIES(${CARLA_INCLUDE_DIRS})
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* carla.cpp - Carla for LMMS
|
||||
*
|
||||
* Copyright (C) 2014 Filipe Coelho <falktx@falktx.com>
|
||||
* Copyright (C) 2014-2018 Filipe Coelho <falktx@falktx.com>
|
||||
*
|
||||
* This file is part of LMMS - https://lmms.io
|
||||
*
|
||||
@@ -24,9 +24,6 @@
|
||||
|
||||
#include "carla.h"
|
||||
|
||||
#define REAL_BUILD // FIXME this shouldn't be needed
|
||||
#include "CarlaHost.h"
|
||||
|
||||
#include "Engine.h"
|
||||
#include "Song.h"
|
||||
#include "gui_templates.h"
|
||||
@@ -132,14 +129,6 @@ static const char* host_ui_save_file(NativeHostHandle, bool isDir, const char* t
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
CARLA_EXPORT
|
||||
const NativePluginDescriptor* carla_get_native_patchbay_plugin();
|
||||
|
||||
CARLA_EXPORT
|
||||
const NativePluginDescriptor* carla_get_native_rack_plugin();
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const Descriptor* const descriptor, const bool isPatchbay)
|
||||
: Instrument(instrumentTrack, descriptor),
|
||||
kIsPatchbay(isPatchbay),
|
||||
@@ -161,8 +150,9 @@ CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const D
|
||||
path.cdUp();
|
||||
resourcesPath = path.absolutePath() + "/share/carla/resources";
|
||||
#elif defined(CARLA_OS_MAC)
|
||||
// assume standard install location
|
||||
resourcesPath = "/Applications/Carla.app/Contents/MacOS/resources";
|
||||
// parse prefix from dll filename
|
||||
QDir path = QFileInfo(dllName).dir();
|
||||
resourcesPath = path.absolutePath() + "/resources";
|
||||
#elif defined(CARLA_OS_WIN32) || defined(CARLA_OS_WIN64)
|
||||
// not yet supported
|
||||
#endif
|
||||
@@ -254,7 +244,7 @@ void CarlaInstrument::handleUiClosed()
|
||||
emit uiClosed();
|
||||
}
|
||||
|
||||
intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opcode, const int32_t index, const intptr_t value, void* const ptr, const float opt)
|
||||
intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opcode, const int32_t, const intptr_t, void* const, const float)
|
||||
{
|
||||
intptr_t ret = 0;
|
||||
|
||||
@@ -267,13 +257,10 @@ intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opco
|
||||
qApp->processEvents();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
// unused for now
|
||||
(void)index; (void)value; (void)ptr; (void)opt;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
@@ -448,9 +435,12 @@ bool CarlaInstrument::handleMidiEvent(const MidiEvent& event, const MidiTime&, f
|
||||
|
||||
PluginView* CarlaInstrument::instantiateView(QWidget* parent)
|
||||
{
|
||||
// Disable plugin focus per https://bugreports.qt.io/browse/QTBUG-30181
|
||||
#ifndef CARLA_OS_MAC
|
||||
if (QWidget* const window = parent->window())
|
||||
fHost.uiParentId = window->winId();
|
||||
else
|
||||
#endif
|
||||
fHost.uiParentId = 0;
|
||||
|
||||
std::free((char*)fHost.uiName);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* carla.h - Carla for LMMS
|
||||
*
|
||||
* Copyright (C) 2014 Filipe Coelho <falktx@falktx.com>
|
||||
* Copyright (C) 2014-2018 Filipe Coelho <falktx@falktx.com>
|
||||
*
|
||||
* This file is part of LMMS - https://lmms.io
|
||||
*
|
||||
@@ -29,6 +29,20 @@
|
||||
#include "plugin_export.h"
|
||||
|
||||
#include "CarlaNative.h"
|
||||
#define REAL_BUILD // FIXME this shouldn't be needed
|
||||
#if CARLA_VERSION_HEX >= 0x010911
|
||||
#include "CarlaNativePlugin.h"
|
||||
#else
|
||||
#include "CarlaBackend.h"
|
||||
#include "CarlaNative.h"
|
||||
#include "CarlaUtils.h"
|
||||
CARLA_EXPORT
|
||||
const NativePluginDescriptor* carla_get_native_patchbay_plugin();
|
||||
|
||||
CARLA_EXPORT
|
||||
const NativePluginDescriptor* carla_get_native_rack_plugin();
|
||||
#endif
|
||||
|
||||
#include "Instrument.h"
|
||||
#include "InstrumentView.h"
|
||||
|
||||
@@ -44,7 +58,7 @@ public:
|
||||
CarlaInstrument(InstrumentTrack* const instrumentTrack, const Descriptor* const descriptor, const bool isPatchbay);
|
||||
virtual ~CarlaInstrument();
|
||||
|
||||
// CarlaNative functions
|
||||
// Carla NativeHostDescriptor functions
|
||||
uint32_t handleGetBufferSize() const;
|
||||
double handleGetSampleRate() const;
|
||||
bool handleIsOffline() const;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* carlapatchbay.cpp - Carla for LMMS (Patchbay)
|
||||
*
|
||||
* Copyright (C) 2014 Filipe Coelho <falktx@falktx.com>
|
||||
* Copyright (C) 2014-2018 Filipe Coelho <falktx@falktx.com>
|
||||
*
|
||||
* This file is part of LMMS - https://lmms.io
|
||||
*
|
||||
@@ -36,7 +36,7 @@ Plugin::Descriptor PLUGIN_EXPORT carlapatchbay_plugin_descriptor =
|
||||
QT_TRANSLATE_NOOP( "pluginBrowser",
|
||||
"Carla Patchbay Instrument" ),
|
||||
"falkTX <falktx/at/falktx.com>",
|
||||
0x0195,
|
||||
CARLA_VERSION_HEX,
|
||||
Plugin::Instrument,
|
||||
new PluginPixmapLoader( "logo" ),
|
||||
NULL,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* carlarack.cpp - Carla for LMMS (Rack)
|
||||
*
|
||||
* Copyright (C) 2014 Filipe Coelho <falktx@falktx.com>
|
||||
* Copyright (C) 2014-2018 Filipe Coelho <falktx@falktx.com>
|
||||
*
|
||||
* This file is part of LMMS - https://lmms.io
|
||||
*
|
||||
@@ -36,7 +36,7 @@ Plugin::Descriptor PLUGIN_EXPORT carlarack_plugin_descriptor =
|
||||
QT_TRANSLATE_NOOP( "pluginBrowser",
|
||||
"Carla Rack Instrument" ),
|
||||
"falkTX <falktx/at/falktx.com>",
|
||||
0x0195,
|
||||
CARLA_VERSION_HEX,
|
||||
Plugin::Instrument,
|
||||
new PluginPixmapLoader( "logo" ),
|
||||
NULL,
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
#include "gui_templates.h"
|
||||
#include "InstrumentPlayHandle.h"
|
||||
#include "InstrumentTrack.h"
|
||||
|
||||
#include "LocaleHelper.h"
|
||||
#include "MainWindow.h"
|
||||
#include "Mixer.h"
|
||||
#include "GuiApplication.h"
|
||||
@@ -209,8 +209,8 @@ void vestigeInstrument::loadSettings( const QDomElement & _this )
|
||||
|
||||
if( !( knobFModel[ i ]->isAutomated() || knobFModel[ i ]->controllerConnection() ) )
|
||||
{
|
||||
knobFModel[ i ]->setValue( ( s_dumpValues.at( 2 )).toFloat() );
|
||||
knobFModel[ i ]->setInitValue( ( s_dumpValues.at( 2 )).toFloat() );
|
||||
knobFModel[ i ]->setValue(LocaleHelper::toFloat(s_dumpValues.at(2)));
|
||||
knobFModel[ i ]->setInitValue(LocaleHelper::toFloat(s_dumpValues.at(2)));
|
||||
}
|
||||
|
||||
connect( knobFModel[i], SIGNAL( dataChanged() ), this, SLOT( setParameter() ) );
|
||||
@@ -965,7 +965,7 @@ manageVestigeInstrumentView::manageVestigeInstrumentView( Instrument * _instrume
|
||||
if( !hasKnobModel )
|
||||
{
|
||||
sprintf( paramStr, "%d", i);
|
||||
m_vi->knobFModel[ i ] = new FloatModel( (s_dumpValues.at( 2 )).toFloat(),
|
||||
m_vi->knobFModel[ i ] = new FloatModel( LocaleHelper::toFloat(s_dumpValues.at(2)),
|
||||
0.0f, 1.0f, 0.01f, castModel<vestigeInstrument>(), tr( paramStr ) );
|
||||
}
|
||||
connect( m_vi->knobFModel[i], SIGNAL( dataChanged() ), this, SLOT( setParameter() ) );
|
||||
@@ -1026,7 +1026,7 @@ void manageVestigeInstrumentView::syncPlugin( void )
|
||||
{
|
||||
sprintf( paramStr, "param%d", i );
|
||||
s_dumpValues = dump[ paramStr ].split( ":" );
|
||||
f_value = ( s_dumpValues.at( 2 ) ).toFloat();
|
||||
f_value = LocaleHelper::toFloat(s_dumpValues.at(2));
|
||||
m_vi->knobFModel[ i ]->setAutomatedValue( f_value );
|
||||
m_vi->knobFModel[ i ]->setInitValue( f_value );
|
||||
}
|
||||
|
||||
@@ -120,6 +120,7 @@ class RemoteVstPlugin;
|
||||
RemoteVstPlugin * __plugin = NULL;
|
||||
|
||||
HWND __MessageHwnd = NULL;
|
||||
DWORD __processingThreadId = 0;
|
||||
|
||||
|
||||
//Returns the last Win32 error, in string format. Returns an empty string if there is no error.
|
||||
@@ -168,6 +169,7 @@ public:
|
||||
// set given sample-rate for plugin
|
||||
virtual void updateSampleRate()
|
||||
{
|
||||
SuspendPlugin suspend( this );
|
||||
pluginDispatch( effSetSampleRate, 0, 0,
|
||||
NULL, (float) sampleRate() );
|
||||
}
|
||||
@@ -175,9 +177,20 @@ public:
|
||||
// set given buffer-size for plugin
|
||||
virtual void updateBufferSize()
|
||||
{
|
||||
SuspendPlugin suspend( this );
|
||||
pluginDispatch( effSetBlockSize, 0, bufferSize() );
|
||||
}
|
||||
|
||||
void setResumed( bool resumed )
|
||||
{
|
||||
m_resumed = resumed;
|
||||
pluginDispatch( effMainsChanged, 0, resumed ? 1 : 0 );
|
||||
}
|
||||
|
||||
inline bool isResumed() const
|
||||
{
|
||||
return m_resumed;
|
||||
}
|
||||
|
||||
inline bool isInitialized() const
|
||||
{
|
||||
@@ -260,7 +273,7 @@ public:
|
||||
}
|
||||
|
||||
// has to be called as soon as input- or output-count changes
|
||||
void updateInOutCount();
|
||||
int updateInOutCount();
|
||||
|
||||
inline void lockShm()
|
||||
{
|
||||
@@ -330,6 +343,24 @@ private:
|
||||
ClosePlugin
|
||||
} ;
|
||||
|
||||
struct SuspendPlugin {
|
||||
SuspendPlugin( RemoteVstPlugin * plugin ) :
|
||||
m_plugin( plugin ),
|
||||
m_resumed( plugin->isResumed() )
|
||||
{
|
||||
if( m_resumed ) { m_plugin->setResumed( false ); }
|
||||
}
|
||||
|
||||
~SuspendPlugin()
|
||||
{
|
||||
if( m_resumed ) { m_plugin->setResumed( true ); }
|
||||
}
|
||||
|
||||
private:
|
||||
RemoteVstPlugin * m_plugin;
|
||||
bool m_resumed;
|
||||
};
|
||||
|
||||
// callback used by plugin for being able to communicate with it's host
|
||||
static intptr_t VST_CALL_CONV hostCallback( AEffect * _effect, int32_t _opcode,
|
||||
int32_t _index, intptr_t _value,
|
||||
@@ -360,6 +391,7 @@ private:
|
||||
int m_windowHeight;
|
||||
|
||||
bool m_initialized;
|
||||
bool m_resumed;
|
||||
|
||||
bool m_processing;
|
||||
|
||||
@@ -385,6 +417,7 @@ private:
|
||||
{
|
||||
float lastppqPos;
|
||||
float m_Timestamp;
|
||||
int32_t m_lastFlags;
|
||||
} ;
|
||||
|
||||
in * m_in;
|
||||
@@ -411,6 +444,7 @@ RemoteVstPlugin::RemoteVstPlugin( const char * socketPath ) :
|
||||
m_windowWidth( 0 ),
|
||||
m_windowHeight( 0 ),
|
||||
m_initialized( false ),
|
||||
m_resumed( false ),
|
||||
m_processing( false ),
|
||||
m_messageList(),
|
||||
m_shouldGiveIdle( false ),
|
||||
@@ -463,12 +497,14 @@ RemoteVstPlugin::RemoteVstPlugin( const char * socketPath ) :
|
||||
m_vstSyncData->ppqPos = 0;
|
||||
m_vstSyncData->isCycle = false;
|
||||
m_vstSyncData->hasSHM = false;
|
||||
m_vstSyncData->m_playbackJumped = false;
|
||||
m_vstSyncData->m_sampleRate = sampleRate();
|
||||
}
|
||||
|
||||
m_in = ( in* ) new char[ sizeof( in ) ];
|
||||
m_in->lastppqPos = 0;
|
||||
m_in->m_Timestamp = -1;
|
||||
m_in->m_lastFlags = 0;
|
||||
|
||||
// process until we have loaded the plugin
|
||||
while( 1 )
|
||||
@@ -488,7 +524,7 @@ RemoteVstPlugin::RemoteVstPlugin( const char * socketPath ) :
|
||||
RemoteVstPlugin::~RemoteVstPlugin()
|
||||
{
|
||||
destroyEditor();
|
||||
pluginDispatch( effMainsChanged, 0, 0 );
|
||||
setResumed( false );
|
||||
pluginDispatch( effClose );
|
||||
#ifndef USE_QT_SHMEM
|
||||
// detach shared memory segment
|
||||
@@ -664,7 +700,7 @@ void RemoteVstPlugin::init( const std::string & _plugin_file )
|
||||
pluginDispatch( effSetProgram, 0, 0 ); */
|
||||
// request rate and blocksize
|
||||
|
||||
pluginDispatch( effMainsChanged, 0, 1 );
|
||||
setResumed( true );
|
||||
|
||||
debugMessage( "creating editor\n" );
|
||||
initEditor();
|
||||
@@ -1419,8 +1455,21 @@ void RemoteVstPlugin::loadChunkFromFile( const std::string & _file, int _len )
|
||||
|
||||
|
||||
|
||||
void RemoteVstPlugin::updateInOutCount()
|
||||
int RemoteVstPlugin::updateInOutCount()
|
||||
{
|
||||
if( inputCount() == RemotePluginClient::inputCount() &&
|
||||
outputCount() == RemotePluginClient::outputCount() )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if( GetCurrentThreadId() == __processingThreadId )
|
||||
{
|
||||
debugMessage( "Plugin requested I/O change from processing "
|
||||
"thread. Request denied; stability may suffer.\n" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
lockShm();
|
||||
|
||||
setShmIsValid( false );
|
||||
@@ -1448,6 +1497,8 @@ void RemoteVstPlugin::updateInOutCount()
|
||||
{
|
||||
m_outputs = new float * [outputCount()];
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -1553,7 +1604,6 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode,
|
||||
__plugin->m_in->m_Timestamp )
|
||||
{
|
||||
_timeInfo.ppqPos = __plugin->m_vstSyncData->ppqPos;
|
||||
_timeInfo.flags |= kVstTransportChanged;
|
||||
__plugin->m_in->lastppqPos = __plugin->m_vstSyncData->ppqPos;
|
||||
__plugin->m_in->m_Timestamp = __plugin->m_vstSyncData->ppqPos;
|
||||
}
|
||||
@@ -1580,6 +1630,14 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode,
|
||||
|
||||
_timeInfo.flags |= kVstBarsValid;
|
||||
|
||||
if( ( _timeInfo.flags & ( kVstTransportPlaying | kVstTransportCycleActive ) ) !=
|
||||
( __plugin->m_in->m_lastFlags & ( kVstTransportPlaying | kVstTransportCycleActive ) )
|
||||
|| __plugin->m_vstSyncData->m_playbackJumped )
|
||||
{
|
||||
_timeInfo.flags |= kVstTransportChanged;
|
||||
}
|
||||
__plugin->m_in->m_lastFlags = _timeInfo.flags;
|
||||
|
||||
return (intptr_t) &_timeInfo;
|
||||
|
||||
case audioMasterProcessEvents:
|
||||
@@ -1588,10 +1646,9 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode,
|
||||
return 0;
|
||||
|
||||
case audioMasterIOChanged:
|
||||
__plugin->updateInOutCount();
|
||||
SHOW_CALLBACK( "amc: audioMasterIOChanged\n" );
|
||||
// numInputs and/or numOutputs has changed
|
||||
return 0;
|
||||
// numInputs, numOutputs, and/or latency has changed
|
||||
return __plugin->updateInOutCount();
|
||||
|
||||
#ifdef OLD_VST_SDK
|
||||
case audioMasterWantMidi:
|
||||
@@ -1678,6 +1735,7 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode,
|
||||
#endif
|
||||
|
||||
case audioMasterSizeWindow:
|
||||
{
|
||||
SHOW_CALLBACK( "amc: audioMasterSizeWindow\n" );
|
||||
if( __plugin->m_window == 0 )
|
||||
{
|
||||
@@ -1685,8 +1743,13 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode,
|
||||
}
|
||||
__plugin->m_windowWidth = _index;
|
||||
__plugin->m_windowHeight = _value;
|
||||
SetWindowPos( __plugin->m_window, 0, 0, 0,
|
||||
_index + 8, _value + 26,
|
||||
HWND window = __plugin->m_window;
|
||||
DWORD dwStyle = GetWindowLongPtr( window, GWL_STYLE );
|
||||
RECT windowSize = { 0, 0, (int) _index, (int) _value };
|
||||
AdjustWindowRect( &windowSize, dwStyle, false );
|
||||
SetWindowPos( window, 0, 0, 0,
|
||||
windowSize.right - windowSize.left,
|
||||
windowSize.bottom - windowSize.top,
|
||||
SWP_NOACTIVATE | SWP_NOMOVE |
|
||||
SWP_NOOWNERZORDER | SWP_NOZORDER );
|
||||
__plugin->sendMessage(
|
||||
@@ -1694,6 +1757,7 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode,
|
||||
addInt( __plugin->m_windowWidth ).
|
||||
addInt( __plugin->m_windowHeight ) );
|
||||
return 1;
|
||||
}
|
||||
|
||||
case audioMasterGetSampleRate:
|
||||
SHOW_CALLBACK( "amc: audioMasterGetSampleRate\n" );
|
||||
@@ -1874,6 +1938,8 @@ void RemoteVstPlugin::processUIThreadMessages()
|
||||
|
||||
DWORD WINAPI RemoteVstPlugin::processingThread( LPVOID _param )
|
||||
{
|
||||
__processingThreadId = GetCurrentThreadId();
|
||||
|
||||
RemoteVstPlugin * _this = static_cast<RemoteVstPlugin *>( _param );
|
||||
|
||||
RemotePluginClient::message m;
|
||||
@@ -2004,6 +2070,7 @@ int main( int _argc, char * * _argv )
|
||||
return -1;
|
||||
}
|
||||
|
||||
OleInitialize(nullptr);
|
||||
#ifdef LMMS_BUILD_LINUX
|
||||
#ifdef LMMS_HAVE_SCHED_H
|
||||
// try to set realtime-priority
|
||||
@@ -2111,6 +2178,7 @@ int main( int _argc, char * * _argv )
|
||||
|
||||
delete __plugin;
|
||||
|
||||
OleUninitialize();
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
@@ -26,10 +26,12 @@ FOREACH( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
|
||||
ENDFOREACH()
|
||||
|
||||
set(EXE_NAME RemoteVstPlugin${BITNESS})
|
||||
add_executable(${EXE_NAME}
|
||||
add_executable(${EXE_NAME} WIN32
|
||||
../RemoteVstPlugin.cpp
|
||||
)
|
||||
|
||||
target_link_libraries(${EXE_NAME} ole32)
|
||||
|
||||
target_include_directories(${EXE_NAME}
|
||||
PRIVATE
|
||||
"${LMMS_SOURCE_DIR}/plugins/vst_base/common"
|
||||
@@ -37,6 +39,15 @@ target_include_directories(${EXE_NAME}
|
||||
"${LMMS_BINARY_DIR}"
|
||||
)
|
||||
|
||||
# Workaround for missing WinMain
|
||||
if(MSVC)
|
||||
set_property(TARGET ${EXE_NAME}
|
||||
APPEND
|
||||
PROPERTY LINK_FLAGS "/entry:mainCRTStartup"
|
||||
)
|
||||
endif()
|
||||
|
||||
|
||||
if(WIN32)
|
||||
find_package(Qt5Core REQUIRED)
|
||||
target_link_libraries(${EXE_NAME} Qt5::Core)
|
||||
|
||||
@@ -45,7 +45,7 @@ ELSEIF(LMMS_BUILD_LINUX)
|
||||
CMAKE_ARGS
|
||||
"${EXTERNALPROJECT_CMAKE_ARGS}"
|
||||
"-DCMAKE_CXX_COMPILER=${WINEGCC}"
|
||||
"-DCMAKE_CXX_FLAGS=-m32 -mwindows"
|
||||
"-DCMAKE_CXX_FLAGS=-m32"
|
||||
)
|
||||
ELSEIF(CMAKE_TOOLCHAIN_FILE_32)
|
||||
ExternalProject_Add(RemoteVstPlugin32
|
||||
|
||||
@@ -7,7 +7,7 @@ ELSEIF(LMMS_BUILD_LINUX)
|
||||
CMAKE_ARGS
|
||||
"${EXTERNALPROJECT_CMAKE_ARGS}"
|
||||
"-DCMAKE_CXX_COMPILER=${WINEGCC}"
|
||||
"-DCMAKE_CXX_FLAGS=-m64 -mwindows"
|
||||
"-DCMAKE_CXX_FLAGS=-m64"
|
||||
)
|
||||
INSTALL(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin64" "${CMAKE_CURRENT_BINARY_DIR}/../RemoteVstPlugin64.exe.so" DESTINATION "${PLUGIN_DIR}")
|
||||
ENDIF()
|
||||
|
||||
@@ -46,12 +46,17 @@
|
||||
#include <QDomDocument>
|
||||
|
||||
#ifdef LMMS_BUILD_WIN32
|
||||
# ifndef NOMINMAX
|
||||
# define NOMINMAX
|
||||
# endif
|
||||
|
||||
# include <windows.h>
|
||||
# include <QLayout>
|
||||
#endif
|
||||
|
||||
#include "ConfigManager.h"
|
||||
#include "GuiApplication.h"
|
||||
#include "LocaleHelper.h"
|
||||
#include "MainWindow.h"
|
||||
#include "Mixer.h"
|
||||
#include "Song.h"
|
||||
@@ -214,6 +219,11 @@ void VstPlugin::tryLoad( const QString &remoteVstPluginExecutable )
|
||||
|
||||
void VstPlugin::loadSettings( const QDomElement & _this )
|
||||
{
|
||||
if( _this.hasAttribute( "program" ) )
|
||||
{
|
||||
setProgram( _this.attribute( "program" ).toInt() );
|
||||
}
|
||||
|
||||
const int num_params = _this.attribute( "numparams" ).toInt();
|
||||
// if it exists try to load settings chunk
|
||||
if( _this.hasAttribute( "chunk" ) )
|
||||
@@ -233,11 +243,6 @@ void VstPlugin::loadSettings( const QDomElement & _this )
|
||||
}
|
||||
setParameterDump( dump );
|
||||
}
|
||||
|
||||
if( _this.hasAttribute( "program" ) )
|
||||
{
|
||||
setProgram( _this.attribute( "program" ).toInt() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -356,7 +361,7 @@ void VstPlugin::setParameterDump( const QMap<QString, QString> & _pdump )
|
||||
{
|
||||
( *it ).section( ':', 0, 0 ).toInt(),
|
||||
"",
|
||||
( *it ).section( ':', 2, -1 ).toFloat()
|
||||
LocaleHelper::toFloat((*it).section(':', 2, -1))
|
||||
} ;
|
||||
m.addInt( item.index );
|
||||
m.addString( item.shortLabel );
|
||||
|
||||
@@ -239,7 +239,6 @@ void ZynAddSubFxInstrument::loadSettings( const QDomElement & _this )
|
||||
doc.appendChild( doc.importNode( data, true ) );
|
||||
|
||||
QTemporaryFile tf;
|
||||
tf.setAutoRemove( false );
|
||||
if( tf.open() )
|
||||
{
|
||||
QByteArray a = doc.toString( 0 ).toUtf8();
|
||||
|
||||
Reference in New Issue
Block a user