Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mac OS X VST support #2393

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ IF(LMMS_BUILD_APPLE)
SET(WANT_SF2 OFF)
SET(WANT_ALSA OFF)
SET(WANT_PULSEAUDIO OFF)
SET(WANT_VST OFF)
# SET(WANT_VST OFF)
SET(STATUS_ALSA "<not supported on this platform>")
SET(STATUS_PULSEAUDIO "<not supported on this platform>")
SET(STATUS_APPLEMIDI "OK")
Expand Down
4 changes: 4 additions & 0 deletions cmake/apple/install_apple.sh.in
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ install_name_tool -change @rpath/libZynAddSubFxCore.dylib \
@loader_path/../../Frameworks/libZynAddSubFxCore.dylib \
"$APP/Contents/lib/lmms/libzynaddsubfx.so"

install_name_tool -change @rpath/libvstbase.dylib \
@loader_path/libvstbase.dylib \
"$APP/Contents/lib/lmms/libvestige.so"

install_name_tool -change @CMAKE_BINARY_DIR@/plugins/zynaddsubfx/libZynAddSubFxCore.dylib \
@loader_path/../../Frameworks/libZynAddSubFxCore.dylib \
"$APP/Contents/MacOS/RemoteZynAddSubFx"
Expand Down
60 changes: 60 additions & 0 deletions cmake/modules/BuildPlugin.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,63 @@ MACRO(BUILD_PLUGIN PLUGIN_NAME)
SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${ER_H} ${plugin_MOC_out}")
ENDMACRO(BUILD_PLUGIN)

MACRO(BUILD_LIKE_A_PLUGIN PLUGIN_NAME)
CMAKE_PARSE_ARGUMENTS(PLUGIN "" "" "MOCFILES;EMBEDDED_RESOURCES;UICFILES;JUSTALIBRARY" ${ARGN})
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is JUSTALIBRARY? I'm having a hard time finding documentation on this...

Edit: If this is in fact needed, we may want to keep our existing plugin macro and shim this in with an IF statement.

SET(PLUGIN_SOURCES ${PLUGIN_UNPARSED_ARGUMENTS})

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src/gui)

ADD_DEFINITIONS(-DPLUGIN_NAME=${PLUGIN_NAME})

LIST(LENGTH PLUGIN_EMBEDDED_RESOURCES ER_LEN)
IF(ER_LEN)
SET(ER_H ${CMAKE_CURRENT_BINARY_DIR}/embedded_resources.h)
ADD_CUSTOM_COMMAND(OUTPUT ${ER_H}
COMMAND ${BIN2RES}
ARGS ${PLUGIN_EMBEDDED_RESOURCES} > ${ER_H}
DEPENDS bin2res)
ENDIF(ER_LEN)

IF(QT5)
QT5_WRAP_CPP(plugin_MOC_out ${PLUGIN_MOCFILES})
QT5_WRAP_UI(plugin_UIC_out ${PLUGIN_UICFILES})
ELSE()
QT4_WRAP_CPP(plugin_MOC_out ${PLUGIN_MOCFILES})
QT4_WRAP_UI(plugin_UIC_out ${PLUGIN_UICFILES})
ENDIF()

FOREACH(f ${PLUGIN_SOURCES})
ADD_FILE_DEPENDENCIES(${f} ${ER_H} ${plugin_UIC_out})
ENDFOREACH(f)

IF(LMMS_BUILD_APPLE)
LINK_DIRECTORIES(${CMAKE_BINARY_DIR})
LINK_LIBRARIES(${QT_LIBRARIES})
ENDIF(LMMS_BUILD_APPLE)
IF(LMMS_BUILD_WIN32)
LINK_DIRECTORIES(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR})
LINK_LIBRARIES(${QT_LIBRARIES})
ENDIF(LMMS_BUILD_WIN32)

ADD_LIBRARY(${PLUGIN_NAME} SHARED ${PLUGIN_SOURCES} ${plugin_MOC_out})
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably worth keeping our existing macro and add something like:

+ SET(PLUGIN_TYPE "MODULE")
+ # Use shared library for Apple VSTs
+ IF (LMMS_BUILD_APPLE AND "${PLUGIN_NAME}" STREQUAL "vstbase")
+    SET(PLUGIN_TYPE "SHARED")
-    ADD_LIBRARY(${PLUGIN_NAME} MODULE ${PLUGIN_SOURCES} ${plugin_MOC_out})
+    ADD_LIBRARY(${PLUGIN_NAME} ${PLUGIN_TYPE} ${PLUGIN_SOURCES} ${plugin_MOC_out})
+ ENDIF()

IF(QT5)
TARGET_LINK_LIBRARIES(${PLUGIN_NAME} Qt5::Widgets Qt5::Xml)
ENDIF()
IF(LMMS_BUILD_WIN32)
TARGET_LINK_LIBRARIES(${PLUGIN_NAME} lmms)
ENDIF(LMMS_BUILD_WIN32)

INSTALL(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION "${PLUGIN_DIR}")

IF(LMMS_BUILD_APPLE)
SET_TARGET_PROPERTIES(${PLUGIN_NAME} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, probably worth keeping our existing macro and add something like:

  IF(LMMS_BUILD_APPLE)
+     SET(PLUGIN_LINK_FLAGS "-bundle_loader ${CMAKE_BINARY_DIR}/lmms")
+     # Use special link flags for Apple VSTs
+     IF ("${PLUGIN_NAME}" STREQUAL "vstbase")
+        SET(PLUGIN_LINK_FLAGS "-undefined dynamic_lookup")
+     ENDIF()
-    SET_TARGET_PROPERTIES(${PLUGIN_NAME} PROPERTIES LINK_FLAGS "-bundle_loader ${CMAKE_BINARY_DIR}/lmms")
+    SET_TARGET_PROPERTIES(${PLUGIN_NAME} PROPERTIES LINK_FLAGS "${PLUGIN_LINK_FLAGS}")
  ENDIF(LMMS_BUILD_APPLE)

ADD_DEPENDENCIES(${PLUGIN_NAME} lmms)
ENDIF(LMMS_BUILD_APPLE)
IF(LMMS_BUILD_WIN32)
SET_TARGET_PROPERTIES(${PLUGIN_NAME} PROPERTIES PREFIX "")
ADD_CUSTOM_COMMAND(TARGET ${PLUGIN_NAME} POST_BUILD COMMAND ${STRIP} $<TARGET_FILE:${PLUGIN_NAME}>)
ENDIF(LMMS_BUILD_WIN32)

SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${ER_H} ${plugin_MOC_out}")
ENDMACRO(BUILD_LIKE_A_PLUGIN)

14 changes: 7 additions & 7 deletions plugins/vst_base/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ IF(LMMS_BUILD_WIN32)
ELSE()
TARGET_LINK_LIBRARIES(RemoteVstPlugin -lQtCore4)
ENDIF()
TARGET_LINK_LIBRARIES(RemoteVstPlugin -lpthread -lgdi32 -lws2_32)
TARGET_LINK_LIBRARIES(RemoteVstPlugin -lpthread -lgdi32 -lws2_32 -lstdc++)
SET_TARGET_PROPERTIES(RemoteVstPlugin PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -O0")
ADD_CUSTOM_COMMAND(TARGET RemoteVstPlugin POST_BUILD COMMAND "${STRIP}" "$<TARGET_FILE:RemoteVstPlugin>")
INSTALL(TARGETS RemoteVstPlugin RUNTIME DESTINATION "${PLUGIN_DIR}")
Expand All @@ -23,10 +23,10 @@ IF(LMMS_BUILD_WIN32)
ENDIF(LMMS_BUILD_WIN64)
ENDIF(LMMS_BUILD_WIN32)

BUILD_PLUGIN(vstbase vst_base.cpp VstPlugin.cpp VstPlugin.h communication.h MOCFILES VstPlugin.h)
BUILD_LIKE_A_PLUGIN(vstbase vst_base.cpp VstPlugin.cpp VstPlugin.h communication.h MOCFILES VstPlugin.h)


IF(LMMS_BUILD_LINUX AND NOT WANT_VST_NOWINE)
IF(NOT WANT_VST_NOWINE)

IF(LMMS_HOST_X86_64)
SET(EXTRA_FLAGS -m32)
Expand All @@ -39,17 +39,17 @@ IF(LMMS_HOST_X86_64)
ENDIF(LMMS_HOST_X86_64)

ADD_CUSTOM_COMMAND(
SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/RemoteVstPlugin.cpp"
#SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/RemoteVstPlugin.cpp"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This entire section may be worth breaking out into its own block under IF(LMMS_BUILD_APPLE) (or perhaps IF-clang). Also, a description as to why these changes are needed would go a long way to understanding why these are needed.

COMMAND ${WINE_CXX}
ARGS "-I\"${CMAKE_BINARY_DIR}\"" "-I\"${CMAKE_SOURCE_DIR}/include\"" "-I\"${CMAKE_INSTALL_PREFIX}/include/wine/windows\"" "-I\"${CMAKE_INSTALL_PREFIX}/include\"" -I/usr/include/wine/windows "\"${CMAKE_CURRENT_SOURCE_DIR}/RemoteVstPlugin.cpp\"" -ansi -mwindows -lpthread ${EXTRA_FLAGS} -o RemoteVstPlugin
COMMAND find -name RemoteVstPlugin.exe -exec mv "'{}'" RemoteVstPlugin "';'"
ARGS "-I\"${CMAKE_BINARY_DIR}\"" "-I\"${CMAKE_SOURCE_DIR}/include\"" "-I\"${CMAKE_INSTALL_PREFIX}/include/wine/windows\"" "-I\"${CMAKE_INSTALL_PREFIX}/include\"" -I/usr/include/wine/windows "\"${CMAKE_CURRENT_SOURCE_DIR}/RemoteVstPlugin.cpp\"" -ansi -mwindows -lpthread ${EXTRA_FLAGS} -o RemoteVstPlugin -stdlib=libstdc++ -nostdlib -l stdc++ -l wine -D USE_WS_PREFIX
COMMAND find . -name RemoteVstPlugin.exe -exec mv "'{}'" RemoteVstPlugin "';'"
TARGET vstbase
OUTPUTS RemoteVstPlugin
)

SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES RemoteVstPlugin.exe.so)
INSTALL(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/RemoteVstPlugin" "${CMAKE_CURRENT_BINARY_DIR}/RemoteVstPlugin.exe.so" DESTINATION "${PLUGIN_DIR}")
ENDIF(LMMS_BUILD_LINUX AND NOT WANT_VST_NOWINE)
ENDIF(NOT WANT_VST_NOWINE)


ENDIF(LMMS_SUPPORT_VST)
15 changes: 8 additions & 7 deletions plugins/vst_base/RemoteVstPlugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
#include <fcntl.h>
#endif

#ifdef LMMS_BUILD_LINUX
#ifndef LMMS_BUILD_WIN32

#ifndef O_BINARY
#define O_BINARY 0
Expand All @@ -62,8 +62,9 @@
#ifdef LMMS_BUILD_WIN64
#include "basename.c"
#else
#include <libgen.h>
#endif
#else
#include <libgen.h>
#endif


Expand Down Expand Up @@ -421,7 +422,7 @@ RemoteVstPlugin::~RemoteVstPlugin()
if( m_window != NULL )
{
pluginDispatch( effEditClose );
#ifdef LMMS_BUILD_LINUX
#ifndef LMMS_BUILD_LINUX
CloseWindow( m_window );
#endif
m_window = NULL;
Expand Down Expand Up @@ -651,7 +652,7 @@ void RemoteVstPlugin::initEditor()
return;
}

#ifdef LMMS_BUILD_LINUX
#ifndef LMMS_BUILD_WIN32
//m_window = CreateWindowEx( 0, "LVSL", m_shortName.c_str(),
// ( WS_OVERLAPPEDWINDOW | WS_THICKFRAME ) & ~WS_MAXIMIZEBOX,
// 0, 0, 10, 10, NULL, NULL, hInst, NULL );
Expand Down Expand Up @@ -689,7 +690,7 @@ void RemoteVstPlugin::initEditor()
ShowWindow( m_window, SW_SHOWNORMAL );
UpdateWindow( m_window );

#ifdef LMMS_BUILD_LINUX
#ifndef LMMS_BUILD_WIN32
m_windowID = (intptr_t) GetProp( m_window, "__wine_x11_whole_window" );
#endif
}
Expand Down Expand Up @@ -1867,8 +1868,8 @@ int main( int _argc, char * * _argv )
#endif
#endif

#ifdef LMMS_BUILD_LINUX
#ifdef LMMS_HAVE_SCHED_H
#ifndef LMMS_BUILD_WIN32
#ifdef XXX_ACTUALLY_I_DONT_LMMS_HAVE_SCHED_H
// try to set realtime-priority
struct sched_param sparam;
sparam.sched_priority = ( sched_get_priority_max( SCHED_FIFO ) +
Expand Down
4 changes: 2 additions & 2 deletions plugins/vst_base/VstPlugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
#include <QCloseEvent>
#include <QMdiArea>
#include <QMdiSubWindow>
#ifdef LMMS_BUILD_LINUX
#ifdef __WINE__
#if QT_VERSION < 0x050000
#include <QX11EmbedContainer>
#include <QX11Info>
Expand Down Expand Up @@ -226,7 +226,7 @@ void VstPlugin::showEditor( QWidget * _parent, bool isEffect )
return;
}

#ifdef LMMS_BUILD_LINUX
#ifdef __WINE__
if( m_pluginWindowID == 0 )
{
return;
Expand Down
2 changes: 1 addition & 1 deletion src/core/PluginFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ void PluginFactory::discoverPlugins()
QLibrary* library = new QLibrary(file.absoluteFilePath());

if (! library->load()) {
m_errors[file.baseName()] = library->errorString();
qWarning() << (m_errors[file.baseName()] = library->errorString());
continue;
}
if (library->resolve("lmms_plugin_main") == nullptr) {
Expand Down