cmake_minimum_required(VERSION 3.6)

project (iamf-ahal)
message(STATUS "start build iamf")

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -Werror=unused-variable")
SET(CMAKE_POSITION_INDEPENDENT_CODE ON)

option(BUILD_SHARED_LIBS "Build shared library" ON)
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(arm)")
set(CODEC_LIB_DIR  "${PROJECT_SOURCE_DIR}/dep_codecs/lib")
message(WARNING "linux 32 bit!!!")
else ()
set(CODEC_LIB_DIR  "${PROJECT_SOURCE_DIR}/dep_codecs/lib64")
message(WARNING "linux 64 bit!!!")
endif ()

set(CODEC_INCLUDE_DIR  "${PROJECT_SOURCE_DIR}/dep_codecs/include")
set(EXTER_LIB_DIR  "${PROJECT_SOURCE_DIR}/dep_external/lib")
set(EXTER_INCLUDE_DIR  "${PROJECT_SOURCE_DIR}/dep_external/include")

option(SUPPORT_VERIFIER "Output vlogging file" OFF)
if (SUPPORT_VERIFIER)
  message(STATUS "Output vlogging file")
  add_definitions(-DSUPPORT_VERIFIER=1)
endif()

option(CODEC_CAP "Codec capability check" ON)
option(MULTICHANNEL_BINAURALIZER "Enable multichannel binaural rendering" OFF)
option(HOA_BINAURALIZER "Enable HOA binaural rendering" OFF)

if (CMAKE_BUILD_TYPE)
  string(TOLOWER ${CMAKE_BUILD_TYPE} BUILD_TYPE)
  if ("${BUILD_TYPE}" STREQUAL "debug")
    add_definitions(-DIA_DBG)
    message(STATUS "Debug mode.")
  endif()
endif()

if(MULTICHANNEL_BINAURALIZER)
  message(STATUS "Enable multichannel binaural rendering")
  add_definitions(-DENABLE_MULTICHANNEL_TO_BINAURAL=1)
endif()

if(HOA_BINAURALIZER)
  message(STATUS "Enable HOA binaural rendering")
  add_definitions(-DENABLE_HOA_TO_BINAURAL=1)
endif()

message(STATUS "CODEC_LIB_DIR: ${CODEC_LIB_DIR}")

if(CODEC_CAP)
  set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
  unset(find_opus CACHE)
  find_library(find_opus NAMES opus PATHS ${CODEC_LIB_DIR} NO_DEFAULT_PATH)
  if(${find_opus} STREQUAL "find_opus-NOTFOUND")
      message(WARNING "the opus library was not found")
  else()
      add_definitions(-DCONFIG_OPUS_CODEC)
  endif()

  unset(find_aac CACHE)
  find_library(find_aac NAMES fdk-aac PATHS ${CODEC_LIB_DIR} NO_DEFAULT_PATH)
  if(${find_aac} STREQUAL "find_aac-NOTFOUND")
      message(WARNING "the fdk-aac library was not found")
  else()
      add_definitions(-DCONFIG_AAC_CODEC)
  endif()

  unset(find_flac CACHE)
  find_library(find_flac NAMES FLAC PATHS ${CODEC_LIB_DIR} NO_DEFAULT_PATH)
  if(${find_flac} STREQUAL "find_flac-NOTFOUND")
      message(WARNING "the FLAC library was not found")
  else()
      add_definitions(-DCONFIG_FLAC_CODEC)
      if(CMAKE_SYSTEM_NAME MATCHES "Windows")
        add_definitions(-DFLAC__NO_DLL)
      endif()
  endif()
endif()

include_directories (include)
aux_source_directory (dep_external/src/wav DIR_DEP_EXTERNAL_WAV)
aux_source_directory (src/common DIR_IAMF_COMMON)
aux_source_directory (src/iamf_dec DIR_IAMF_DEC)
aux_source_directory (src/iamf_dec/arch DIR_IAMF_DEC_ARCH)
aux_source_directory (src/iamf_dec/arch/arm DIR_IAMF_DEC_ARCH_ARM)
aux_source_directory (src/iamf_dec/arch/x86 DIR_IAMF_DEC_ARCH_X86)
if(NOT ${find_opus} STREQUAL "find_opus-NOTFOUND")
  aux_source_directory (src/iamf_dec/opus DIR_IAMF_DEC_OPUS)
endif()
if(NOT ${find_aac} STREQUAL "find_aac-NOTFOUND")
  aux_source_directory (src/iamf_dec/aac DIR_IAMF_DEC_AAC)
endif()
if(NOT ${find_flac} STREQUAL "find_flac-NOTFOUND")
  aux_source_directory (src/iamf_dec/flac DIR_IAMF_DEC_FLAC)
endif()
aux_source_directory (src/iamf_dec/pcm DIR_IAMF_DEC_PCM)



include_directories(
    ${CODEC_INCLUDE_DIR}
    ${EXTER_INCLUDE_DIR}
    ${PROJECT_SOURCE_DIR}/src/common
    ${PROJECT_SOURCE_DIR}/src/iamf_dec
    ${PROJECT_SOURCE_DIR}/src/iamf_dec/arch
    ${PROJECT_SOURCE_DIR}/src/iamf_dec/arch/arm
    ${PROJECT_SOURCE_DIR}/src/iamf_dec/arch/x86
    ${PROJECT_SOURCE_DIR}/src/iamf_dec/opus
    ${PROJECT_SOURCE_DIR}/src/iamf_dec/aac
    ${PROJECT_SOURCE_DIR}/src/iamf_dec/flac
)
link_directories (
    ${CODEC_LIB_DIR}
)

if(MULTICHANNEL_BINAURALIZER OR HOA_BINAURALIZER)
link_directories(
  ${EXTER_LIB_DIR}/binaural
)
endif()

if(BUILD_SHARED_LIBS)
  add_library(${PROJECT_NAME} SHARED ${DIR_DEP_EXTERNAL_WAV} ${DIR_IAMF_COMMON}
    ${DIR_IAMF_DEC_OPUS} ${DIR_IAMF_DEC_AAC} ${DIR_IAMF_DEC_FLAC} ${DIR_IAMF_DEC_PCM} ${DIR_IAMF_DEC}
    ${DIR_IAMF_DEC_ARCH} ${DIR_IAMF_DEC_ARCH_ARM} ${DIR_IAMF_DEC_ARCH_X86}
    src/aml_decoder.c)

  if(NOT ${find_opus} STREQUAL "find_opus-NOTFOUND")
    target_link_libraries (${PROJECT_NAME} opus)
  endif()

  if(NOT ${find_aac} STREQUAL "find_aac-NOTFOUND")
    target_link_libraries (${PROJECT_NAME} fdk-aac)
  endif()

  if(NOT ${find_flac} STREQUAL "find_flac-NOTFOUND")
    target_link_libraries (${PROJECT_NAME} FLAC)
  endif()

  if(MULTICHANNEL_BINAURALIZER)
    target_link_libraries (${PROJECT_NAME} iamf2bear)
  endif()
  if(HOA_BINAURALIZER)
    target_link_libraries (${PROJECT_NAME} iamf2resonance)
  endif()
  target_link_libraries (${PROJECT_NAME} m)
else()
  add_library(${PROJECT_NAME} STATIC ${DIR_DEP_EXTERNAL_WAV} ${DIR_IAMF_COMMON}
    ${DIR_IAMF_DEC_OPUS} ${DIR_IAMF_DEC_AAC} ${DIR_IAMF_DEC_PCM}
    ${DIR_IAMF_DEC_FLAC} ${DIR_IAMF_DEC} ${DIR_IAMF_DEC_ARCH} ${DIR_IAMF_DEC_ARCH_ARM}
    ${DIR_IAMF_DEC_ARCH_X86})
endif()



set(IAMF_PUBLIC_HEADER
    ${CMAKE_CURRENT_SOURCE_DIR}/include/IAMF_decoder.h
    ${CMAKE_CURRENT_SOURCE_DIR}/include/IAMF_defines.h
    ${CMAKE_CURRENT_SOURCE_DIR}/include/vlogging_tool_sr.h
    )
set_target_properties(iamf-ahal PROPERTIES PUBLIC_HEADER "${IAMF_PUBLIC_HEADER}")


set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
set(libdir ${CMAKE_INSTALL_PREFIX}/lib)
set(includedir ${CMAKE_INSTALL_PREFIX}/include)
configure_file(iamf.pc.in iamf.pc)
#install(FILES ${CMAKE_CURRENT_BINARY_DIR}/iamf.pc
#        DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig)

if(BUILD_SHARED_LIBS)
  install(TARGETS ${PROJECT_NAME}
    LIBRARY DESTINATION lib)
else()
  install(TARGETS ${PROJECT_NAME}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_PREFIX}/include/iamf)
endif()

if(MULTICHANNEL_BINAURALIZER OR HOA_BINAURALIZER)
  install(DIRECTORY ${EXTER_LIB_DIR}/binaural
        DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
endif()

