# SPDX-License-Identifier: GPL-3.0-only
# MuseScore-CLA-applies
#
# MuseScore
# Music Composition & Notation
#
# Copyright (C) 2021 MuseScore BVBA and others
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

# This module stores global state
declare_module(au3wrap)

set(MODULE_SRC
    ${CMAKE_CURRENT_LIST_DIR}/au3wrapmodule.cpp
    ${CMAKE_CURRENT_LIST_DIR}/au3wrapmodule.h
    ${CMAKE_CURRENT_LIST_DIR}/au3types.h
    ${CMAKE_CURRENT_LIST_DIR}/iau3project.h
    ${CMAKE_CURRENT_LIST_DIR}/au3projectcontext.h

    ${CMAKE_CURRENT_LIST_DIR}/internal/au3audiometer.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/au3audiometer.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/au3audiometerfactory.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/au3audiometerfactory.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/wxtypes_convert.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/wxlogwrap.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/wxlogwrap.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/domconverter.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/domconverter.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/progressdialog.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/progressdialog.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/domaccessor.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/domaccessor.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/au3project.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/au3project.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/au3projectcontext.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/au3commonsettings.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/au3commonsettings.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/au3basicui.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/au3basicui.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/projectsnap.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/projectsnap.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/projectthumbnail.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/projectthumbnail.h
    ${CMAKE_CURRENT_LIST_DIR}/internal/trackcolor.cpp
    ${CMAKE_CURRENT_LIST_DIR}/internal/trackcolor.h
    )

# ==================================
# === AU3 ===
# ==================================

# Include AU3 wrap definitions
include(${CMAKE_CURRENT_LIST_DIR}/au3wrapDefs.cmake)

# Third-party libraries (not part of au3/libraries)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/sqlite au3-sqlite)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/soxr au3-soxr)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/pffft au3-pffft)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/portmixer au3-portmixer)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/twolame au3-twolame)
tft_add_to_build()
list(APPEND AU3_LINK twolame)

# Conditional time-stretching and pitch-shifting libraries
if (AU_USE_SOUNDTOUCH)
    add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/soundtouch au3-soundtouch)
endif()

if (AU_USE_SBSMS)
    add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/sbsms au3-sbsms)
endif()

# Conditional third-party SDKs (must be set up before AU3 libraries)
if (AU_MODULE_EFFECTS_LV2)
    add_subdirectory(lv2sdk)
endif()

if(AU_MODULE_EFFECTS_VST)
    add_subdirectory(vst3)
endif()

# RapidJSON (header-only, used by au3-musehub, au3-cloud-audiocom, au3-import-export, au3-sentry-reporting)
rapidjson_add_to_build()

# Include AU3 libraries - this will add all library subdirectories
# and set AU3_LIBRARIES_LIST in this scope
add_subdirectory(${AU3_LIBRARIES} au3-libraries)

# Additional linking setup for conditional libraries
if (AU_MODULE_EFFECTS_LV2)
    set(AU3_LINK ${AU3_LINK} lv2sdk)
endif()

# We currently have some AU3 modules that are still compiled as sources (not yet converted to libraries)
set(MODULE_SRC ${MODULE_SRC}
    # AU3 modules that are still compiled as sources (not yet converted to libraries)
    ${IMPORT_EXPORT_MODULE}/RegisterExportPlugins.cpp
    ${IMPORT_EXPORT_MODULE}/RegisterExportPlugins.h
    ${IMPORT_EXPORT_MODULE}/RegisterImportPlugins.cpp
    ${IMPORT_EXPORT_MODULE}/RegisterImportPlugins.h

    ${IMPORT_EXPORT_MODULE}/mod-mp3/ExportMP3.cpp
    ${IMPORT_EXPORT_MODULE}/mod-mp3/ExportMP3.h
    ${IMPORT_EXPORT_MODULE}/mod-mp3/MP3.cpp

    ${IMPORT_EXPORT_MODULE}/mod-mpg123/ImportMP3_MPG123.cpp
    ${IMPORT_EXPORT_MODULE}/mod-mpg123/ImportMP3_MPG123.h

    ${IMPORT_EXPORT_MODULE}/mod-wavpack/ExportWavPack.cpp
    ${IMPORT_EXPORT_MODULE}/mod-wavpack/ExportWavPack.h
    ${IMPORT_EXPORT_MODULE}/mod-wavpack/ImportWavPack.cpp
    ${IMPORT_EXPORT_MODULE}/mod-wavpack/ImportWavPack.h

    ${IMPORT_EXPORT_MODULE}/mod-pcm/ExportPCM.cpp
    ${IMPORT_EXPORT_MODULE}/mod-pcm/ExportPCM.h
    ${IMPORT_EXPORT_MODULE}/mod-pcm/ImportPCM.cpp
    ${IMPORT_EXPORT_MODULE}/mod-pcm/ImportPCM.h

    ${IMPORT_EXPORT_MODULE}/mod-ogg/ExportOGG.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ogg/ExportOGG.h
    ${IMPORT_EXPORT_MODULE}/mod-ogg/ImportOGG.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ogg/ImportOGG.h

    ${IMPORT_EXPORT_MODULE}/mod-flac/ExportFLAC.cpp
    ${IMPORT_EXPORT_MODULE}/mod-flac/ExportFLAC.h
    ${IMPORT_EXPORT_MODULE}/mod-flac/ImportFLAC.cpp
    ${IMPORT_EXPORT_MODULE}/mod-flac/ImportFLAC.h

    ${IMPORT_EXPORT_MODULE}/mod-opus/ExportOpus.cpp
    ${IMPORT_EXPORT_MODULE}/mod-opus/ExportOpus.h
    ${IMPORT_EXPORT_MODULE}/mod-opus/ImportOpus.cpp
    ${IMPORT_EXPORT_MODULE}/mod-opus/ImportOpus.h

    ${IMPORT_EXPORT_MODULE}/mod-mp2/ExportMP2.cpp
    ${IMPORT_EXPORT_MODULE}/mod-mp2/ExportMP2.h

    # FFmpeg support (still compiled as sources, not yet converted to library)
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/ImportFFmpeg.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/ImportFFmpeg.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/ExportFFmpeg.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/ExportFFmpeg.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/FFmpegDefines.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/FFmpeg.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/FFmpeg.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/ExportFFmpegOptions.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/ExportFFmpegOptions.h

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/FFmpegTypes.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/FFmpegFunctions.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/FFmpegFunctions.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/AVCodecFunctions.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/AVCodecID.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/AVFormatFunctions.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/AVUtilFunctions.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/FifoBuffer.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/FifoBuffer.h

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVChannelLayoutWrapper.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVCodecContextWrapper.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVCodecContextWrapper.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVCodecWrapper.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVCodecWrapper.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVDictionaryWrapper.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVDictionaryWrapper.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVFormatContextWrapper.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVFormatContextWrapper.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVFrameWrapper.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVFrameWrapper.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVInputFormatWrapper.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVInputFormatWrapper.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVIOContextWrapper.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVIOContextWrapper.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVOutputFormatWrapper.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVOutputFormatWrapper.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVPacketWrapper.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVPacketWrapper.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVStreamWrapper.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/wrappers/AVStreamWrapper.h

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/DynamicLibraryHelpers.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/DynamicLibraryHelpers.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/FFmpegAPIResolver.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/FFmpegAPIResolver.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/FFmpegLog.h

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/ffmpeg-2.3.6-single-header.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/52/avconfig.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/55/AVCodecIDLookup.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/55/AVCodecImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avformat/55/AVFormatImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/52/AVUtilImpl.cpp

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/ffmpeg-3.4.8-single-header.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/55/avconfig.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/57/AVCodecIDLookup.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/57/AVCodecImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avformat/57/AVFormatImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/55/AVUtilImpl.cpp

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/ffmpeg-4.2.4-single-header.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/56/avconfig.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/58/AVCodecIDLookup.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/58/AVCodecImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avformat/58/AVFormatImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/56/AVUtilImpl.cpp

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/ffmpeg-5.0.1-single-header.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/57/avconfig.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/59/AVCodecIDLookup.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/59/AVCodecImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avformat/59/AVFormatImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/57/AVUtilImpl.cpp

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/ffmpeg-6.0.0-single-header.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/58/avconfig.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/60/AVCodecIDLookup.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/60/AVCodecImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avformat/60/AVFormatImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/58/AVUtilImpl.cpp

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/ffmpeg-7.0.0-single-header.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/59/avconfig.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/61/AVCodecIDLookup.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/61/AVCodecImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avformat/61/AVFormatImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/59/AVUtilImpl.cpp

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/ffmpeg-8.0.0-single-header.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/60/avconfig.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/62/AVCodecIDLookup.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/62/AVCodecImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avformat/62/AVFormatImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/60/AVUtilImpl.cpp

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/ffmpeg-9.0.0-single-header.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/61/avconfig.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/63/AVCodecIDLookup.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/63/AVCodecImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avformat/63/AVFormatImpl.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/61/AVUtilImpl.cpp

    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/AVCodecFunctionsLoader.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avcodec/AVCodecFunctionsLoader.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avformat/AVFormatFunctionsLoader.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avformat/AVFormatFunctionsLoader.h
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/AVUtilFunctionsLoader.cpp
    ${IMPORT_EXPORT_MODULE}/mod-ffmpeg/lib-ffmpeg-support/impl/avutil/AVUtilFunctionsLoader.h
)

# ==================================
# AU3_LIBRARIES_LIST is now set by au3/libraries/CMakeLists.txt
# ==================================
set(MODULE_INCLUDE ${AU3_INCLUDE})
set(MODULE_DEF ${AU3_DEF})
set(MODULE_SRC ${MODULE_SRC})
set(MODULE_LINK ${AU3_LINK}
        project # required for projectconfiguration and projecterrors
        audio # required for audiometer
        sqlite # static Factory init HACK for au3-project-file-io/SqliteSampleBlock.cpp included in au3project.cpp
        # TODO: fix Hack and remove sqlite dependency from au3wrap
        rapidjson::rapidjson # this is a temporary solution and we would need to fix this see: https://github.com/audacity/audacity/issues/10452
)
set(MODULE_LINK_PUBLIC ${AU3_LIBRARIES_LIST})

set(MODULE_USE_PCH OFF)
set(MODULE_USE_UNITY OFF)

setup_module()

target_no_warning(${MODULE} -w)

if (CC_IS_CLANG)
    set_property(TARGET ${MODULE} APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
endif()

if (AU_BUILD_PROJECT_TESTS)
    add_subdirectory(tests)
endif()
