# Copyright (c) 2025 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build/ohos.gni")
import("../../audio_framework_test_sources.gni")
import("../../config.gni")

group("audio_suite_packages") {
  deps = [
    ":audio_pcm_process",
    ":audio_suite",
    ":audio_suite_capabilities",
  ]

  if (audio_framework_feature_audiosuite_support) {
    deps += [
        ":audio_suite_service",
        "../../sa_profile:audio_suite_sa_profile",
        ":audio_suite_init",
      ]
  }
}

config("audio_suite_public_config") {
  include_dirs = [
    "client/manager/include",
    "client/converter/include",
    "client/config/include",
    "client/node/include",
    "client/utils/include",
    "../../frameworks/native/audioutils/include",
    "../audio_engine/utils/",
    "../audio_engine/plugin/channel_converter/include/",
    "../../interfaces/inner_api/native/audiocommon/include",
    "../../interfaces/inner_api/native/audiosuite/include",
    "../../interfaces/inner_api/native/audiomanager/include",
    "../../interfaces/kits/c/common",
  ]
}

audio_ohos_library("audio_suite") {
  branch_protector_ret = "pac_ret"
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    cfi_vcall_icall_only = true
    debug = false
    integer_overflow = true
    ubsan = true
    boundary_sanitize = true
  }
  install_enable = true

  public_configs = [ ":audio_suite_public_config" ]

  include_dirs = [
    "client/manager/include",
    "client/converter/include",
    "client/stub/include",
    "../../frameworks/native/audioutils/include",
    "../../frameworks/native/audioschedule/include",
    "../../frameworks/native/offlineaudioeffect/include",
    "../../interfaces/inner_api/native/offlineaudioeffect/include",
    "../audio_engine/buffer",
    "../audio_engine/plugin/resample/include",
    "../audio_service/common/include/limiter",
    "../../interfaces/inner_api/native/audiocommon/include/",
    "../../interfaces/kits/c/audio_suite/",
    "../audio_service/common/include/dfx",
  ]

  public_configs += [
    "idl:audio_suite_idl_config",
  ]

  deps = [
    "../audio_engine:audio_engine_utils",
    "../audio_engine:audio_engine_plugins",
    "../../frameworks/native/audioutils:audio_utils",
    "../../frameworks/native/audioschedule:audio_schedule",
    "../../frameworks/native/offlineaudioeffect:offline_audio_effect",
    "../audio_service:audio_common",
    "../../frameworks/native/audioutils:audio_xml_utils",
    "../audio_service:audio_engine_manager",
    "../audio_service:audio_policy_manager",
    "../audio_service:audio_client",
    "idl:audio_suite_idl_headers",
  ]

  external_deps = [
    "bounds_checking_function:libsec_shared",
    "c_utils:utils",
    "hilog:libhilog",
    "ipc:ipc_single",
    "bounds_checking_function:libsec_shared",
    "media_foundation:media_monitor_client",
    "media_foundation:media_monitor_common",
    "samgr:samgr_proxy",
  ]

  cflags_cc = [
    "-Wall",
    "-Werror",
    "-Os",
    "-ffunction-sections",
    "-fdata-sections",
    "-fvisibility-inlines-hidden",
    "-fno-ident",
    "-fno-exceptions",
    "-fno-rtti",
  ]

  ldflags = [
    "-flto=full",
    "-Wl,-gc-sections",
    "-Wl,--exclude-libs,ALL",
    "-Wl,--hash-style=gnu",
    "-Wl,--strip-debug",
  ]

  if (audio_framework_feature_audiosuite_support || audio_framework_feature_audiosuite_format_convert_support) {
    sources = []
    if (audio_framework_feature_audiosuite_support) { 
      sources += [
        "client/manager/src/audio_suite_engine.cpp",
        "client/manager/src/audio_suite_manager.cpp",
        "client/manager/src/audio_suite_pipeline.cpp",
        "client/manager/src/audio_suite_client_download_manager.cpp",
        "client/manager/src/audio_suite_client_policy.cpp",
        "client/manager/src/audio_suite_mixer_processor.cpp",
        "client/manager/src/audio_suite_download_callback_stub_impl.cpp",
        "client/manager/src/audio_suite_status_callback_stub_impl.cpp",
        "client/node/src/audio_suite_input_node.cpp",
        "client/node/src/audio_suite_output_node.cpp",
        "client/node/src/audio_suite_process_node.cpp",
        "client/node/src/audio_suite_aiss_node.cpp",
        "client/node/src/audio_suite_env_node.cpp",
        "client/node/src/audio_suite_eq_node.cpp",
        "client/node/src/audio_suite_mixer_node.cpp",
        "client/node/src/audio_suite_nr_node.cpp",
        "client/node/src/audio_suite_soundfield_node.cpp",
        "client/node/src/audio_suite_tempo_pitch_node.cpp",
        "client/node/src/audio_suite_node.cpp",
        "client/node/src/audio_suite_space_render_node.cpp",
        "client/node/src/audio_suite_hoa_render_node.cpp",
        "client/node/src/audio_suite_mixer_processor_node.cpp",
        "client/node/src/audio_suite_system_node.cpp",
        "client/utils/src/audio_suite_manager_thread.cpp",
        "client/utils/src/audio_suite_common.cpp",
        "client/utils/src/audio_suite_algo_interface.cpp",
        "client/utils/src/audio_suite_serializer.cpp",
        "client/utils/src/audio_suite_eq_algo_interface_impl.cpp",
        "client/utils/src/audio_suite_env_algo_interface_impl.cpp",
        "client/utils/src/audio_suite_nr_algo_interface_impl.cpp",
        "client/utils/src/audio_suite_soundfield_algo_interface_impl.cpp",
        "client/utils/src/audio_suite_aiss_algo_interface_impl.cpp",
        "client/node/src/audio_suite_general_voice_change_node.cpp",
        "client/utils/src/audio_suite_voice_morphing_algo_interface_impl.cpp",
        "client/node/src/audio_suite_voice_beautifier_node.cpp",
        "client/utils/src/audio_suite_pure_voice_change_algo_interface_impl.cpp",
        "client/node/src/audio_suite_pure_voice_change_node.cpp",
        "client/utils/src/audio_suite_tempo_pitch_algo_interface_impl.cpp",
        "client/utils/src/audio_suite_space_render_algo_interface_impl.cpp",
        "client/utils/src/audio_suite_hoa_render_algo_interface_impl.cpp",
        "client/config/src/audio_suite_capabilities_parser.cpp",
        "client/config/src/audio_suite_capabilities.cpp",
      ]

      deps += [
        "idl:audio_suite_client_idl",
      ]
    } else {
      sources += [
        "client/manager/src/audio_suite_client_download_manager_stub.cpp",
      ]
    }

    if (audio_framework_feature_audiosuite_support || audio_framework_feature_audiosuite_format_convert_support) {
      sources += [
        "client/converter/src/audio_format_converter_impl.cpp",
        "client/utils/src/audio_suite_pcm_buffer.cpp",
        "client/utils/src/audio_suite_format_conversion.cpp",
        "client/converter/src/audio_suite_raw_format_conversion.cpp",
      ]
    }
  } else {
    sources = [
      "client/manager/src/audio_suite_client_download_manager_stub.cpp",
    ]
  }

  version_script = "libaudio_suite.versionscript"

  subsystem_name = "multimedia"
  part_name = "audio_framework"
}

audio_ohos_library("audio_pcm_process") {
  branch_protector_ret = "pac_ret"
  cflags = [ "-Os" ]
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    cfi_vcall_icall_only = true
    debug = false
    integer_overflow = true
    ubsan = true
    boundary_sanitize = true
  }
  install_enable = true

  if (audio_framework_feature_audiosuite_support) {
    include_dirs = [
      "client/converter/include",
      "client/manager/include",
      "client/pcm_process/include",
      "client/utils/include",
      "client/node/include",
      "../../interfaces/inner_api/native/audiocommon/include/",
      "../../interfaces/inner_api/native/audiosuite/include",
      "../../interfaces/inner_api/native/audio_pcm_process/include",
      "../audio_engine/utils/",
      "../audio_engine/plugin/channel_converter/include/",
    ]

    sources = [ "client/pcm_process/src/audio_pcm_process_impl.cpp" ]

    deps = [
      ":audio_suite",
      "../audio_engine:audio_engine_plugins",
      "../../frameworks/native/audioutils:audio_utils",
      "../audio_service:audio_common",
    ]

    external_deps = [
      "c_utils:utils",
      "hilog:libhilog",
      "bounds_checking_function:libsec_shared",
    ]
  }

  # innerapi_tags = [ "chipsetsdk" ]

  subsystem_name = "multimedia"
  part_name = "audio_framework"
}

if (audio_framework_feature_audiosuite_support) {
  audio_ohos_library("audio_suite_service") {
    branch_protector_ret = "pac_ret"
    sanitize = {
      cfi = true
      cfi_cross_dso = true
      cfi_vcall_icall_only = true
      debug = false
      integer_overflow = true
      ubsan = true
      boundary_sanitize = true
    }
    install_enable = true

    cflags_cc = [
      "-Werror",
      "-Os",
      "-ffunction-sections",
      "-fdata-sections",
      "-fvisibility-inlines-hidden",
      "-fno-ident",
      "-fno-exceptions",
      "-fno-rtti",
    ]

    ldflags = [
      "-flto=full",
      "-Wl,-gc-sections",
      "-Wl,--exclude-libs,ALL",
      "-Wl,--hash-style=gnu",
      "-Wl,--strip-debug",
    ]
 
    defines = []
 
    public_configs = [
      "idl:audio_suite_idl_config",
    ]
 
    include_dirs = [
      "server/include",
      "server/include",
      "client/utils/include",
      "client/node/include",
      "idl",
      "../../interfaces/inner_api/native/audiocommon/include",
      "../../interfaces/inner_api/native/audiosuite/include",
      "../../frameworks/native/audioutils/include",
      "../audio_service/common/include",
      "${target_gen_dir}",
    ]
 
    sources = [
      "server/src/audio_suite_service.cpp",
      "server/src/download_manager.cpp",
      "server/src/background_download.cpp",
    ]

    shlib_type = "sa"
 
    deps = [
      ":audio_suite",
      "../../frameworks/native/audioutils:audio_utils",
      "../audio_service:audio_common",
      "idl:audio_suite_server_idl",
      "idl:audio_suite_idl_headers",
    ]
 
    external_deps = [
      "c_utils:utils",
      "hilog:libhilog",
      "ipc:ipc_core",
      "samgr:samgr_proxy",
      "safwk:system_ability_fwk",
      "eventhandler:libeventhandler",
      "hisysevent:libhisysevent",
      "hitrace:hitrace_meter",
      "access_token:libaccesstoken_sdk",
      "access_token:libnativetoken_shared",
      "access_token:libtokensetproc_shared",
      "init:libbegetutil",
      "bounds_checking_function:libsec_shared",
      "common_event_service:cesfwk_innerkits",
    ]

    if (defined(global_parts_info) && defined(global_parts_info.communication_netmanager_base)) {
      external_deps += ["netmanager_base:net_conn_manager_if"]
      defines += ["AUDIO_SUITE_ROM_DOWNLOAD_NET_MANAGER"]
    }

    if (defined(global_parts_info) && defined(global_parts_info.powermgr_battery_manager)) {
      external_deps += ["battery_manager:batterysrv_client"]
      defines += ["AUDIO_SUITE_ROM_DOWNLOAD_BATTERY_MANAGER"]
    }

    if (defined(global_parts_info) && defined(global_parts_info.theme_screenlock_mgr)) {
      external_deps += ["screenlock_mgr:screenlock_client"]
      defines += ["AUDIO_SUITE_ROM_DOWNLOAD_SCREENLOCK_MANAGER"]
    }
    subsystem_name = "multimedia"
    part_name = "audio_framework"
  }
}

ohos_prebuilt_etc("audio_suite_capabilities") {
  source = "client/config/file/audio_suite_capabilities.xml"

  subsystem_name = "multimedia"
  relative_install_dir = "audio"
  part_name = "audio_framework"
}

ohos_prebuilt_etc("audio_suite_init") {
  source = "etc/audio_suite_server.cfg"
  relative_install_dir = "init"
  subsystem_name = "multimedia"
  part_name = "audio_framework"
}