# Copyright 2026 Mocktail Project Authors # Licensed under the Apache License, Version 2.0. include_guard(GLOBAL) get_filename_component(MOCKTAIL_AUDIO_ROOT "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE ) # SDL 3.4 provides the callback needed for OpenSL buffer completion. find_package(SDL3 3.4 REQUIRED CONFIG) find_package(Threads REQUIRED) add_library(mocktail_audio_core STATIC ${MOCKTAIL_AUDIO_ROOT}/src/audio/audio_sink.cc ) target_include_directories(mocktail_audio_core PUBLIC ${MOCKTAIL_AUDIO_ROOT}/include ) target_compile_features(mocktail_audio_core PUBLIC cxx_std_17) set_target_properties(mocktail_audio_core PROPERTIES POSITION_INDEPENDENT_CODE ON ) add_library(Mocktail::AudioCore ALIAS mocktail_audio_core) add_library(mocktail_audio_sdl SHARED ${MOCKTAIL_AUDIO_ROOT}/src/audio/sdl_audio_capture.cc ${MOCKTAIL_AUDIO_ROOT}/src/audio/sdl_audio_sink.cc ) target_include_directories(mocktail_audio_sdl PUBLIC ${MOCKTAIL_AUDIO_ROOT}/include ) target_link_libraries(mocktail_audio_sdl PUBLIC Mocktail::AudioCore SDL3::SDL3 ) target_compile_features(mocktail_audio_sdl PUBLIC cxx_std_17) set_target_properties(mocktail_audio_sdl PROPERTIES POSITION_INDEPENDENT_CODE ON BUILD_RPATH_USE_ORIGIN TRUE BUILD_RPATH "\$ORIGIN" INSTALL_RPATH "\$ORIGIN" ) add_library(Mocktail::AudioSdl ALIAS mocktail_audio_sdl) add_library(mocktail_audio_fmod_java_runtime STATIC ${MOCKTAIL_AUDIO_ROOT}/src/audio/fmod_java_audio_runtime.cc ) target_include_directories(mocktail_audio_fmod_java_runtime PUBLIC ${MOCKTAIL_AUDIO_ROOT}/include ) target_link_libraries(mocktail_audio_fmod_java_runtime PUBLIC Mocktail::AudioSdl Threads::Threads ) target_compile_features(mocktail_audio_fmod_java_runtime PUBLIC cxx_std_17) set_target_properties(mocktail_audio_fmod_java_runtime PROPERTIES POSITION_INDEPENDENT_CODE ON ) add_library(Mocktail::FmodJavaAudioRuntime ALIAS mocktail_audio_fmod_java_runtime ) add_library(mocktail_fmod_jni_audio_bridge STATIC ${MOCKTAIL_AUDIO_ROOT}/src/audio/fmod_jni_audio_bridge.cc ${MOCKTAIL_AUDIO_ROOT}/src/audio/webrtc_jni_audio_bridge.cc ) target_include_directories(mocktail_fmod_jni_audio_bridge PUBLIC ${MOCKTAIL_AUDIO_ROOT}/include ) target_link_libraries(mocktail_fmod_jni_audio_bridge PUBLIC Mocktail::FmodJavaAudioRuntime Mocktail::LegacyJni ) target_compile_features(mocktail_fmod_jni_audio_bridge PUBLIC cxx_std_17) set_target_properties(mocktail_fmod_jni_audio_bridge PROPERTIES POSITION_INDEPENDENT_CODE ON ) add_library(Mocktail::FmodJniAudioBridge ALIAS mocktail_fmod_jni_audio_bridge ) add_library(mocktail_audio_opensl_adapter STATIC ${MOCKTAIL_AUDIO_ROOT}/src/audio/opensl_simple_buffer_queue.cc ) target_include_directories(mocktail_audio_opensl_adapter PUBLIC ${MOCKTAIL_AUDIO_ROOT}/include ) target_link_libraries(mocktail_audio_opensl_adapter PUBLIC Mocktail::AudioCore Threads::Threads ) target_compile_features(mocktail_audio_opensl_adapter PUBLIC cxx_std_17) set_target_properties(mocktail_audio_opensl_adapter PROPERTIES POSITION_INDEPENDENT_CODE ON ) add_library(Mocktail::AudioOpenSlAdapter ALIAS mocktail_audio_opensl_adapter ) add_library(mocktail_audio INTERFACE) target_link_libraries(mocktail_audio INTERFACE Mocktail::AudioSdl Mocktail::AudioOpenSlAdapter ) add_library(Mocktail::Audio ALIAS mocktail_audio) # Desktop builds use opensl_abi.h when NDK headers are unavailable. find_path(MOCKTAIL_OPENSL_CORE_INCLUDE_DIR SLES/OpenSLES.h) find_path(MOCKTAIL_OPENSL_ANDROID_INCLUDE_DIR SLES/OpenSLES_Android.h) if(MOCKTAIL_OPENSL_CORE_INCLUDE_DIR AND MOCKTAIL_OPENSL_ANDROID_INCLUDE_DIR) target_include_directories(mocktail_audio_opensl_adapter PUBLIC ${MOCKTAIL_OPENSL_CORE_INCLUDE_DIR} ${MOCKTAIL_OPENSL_ANDROID_INCLUDE_DIR} ) target_compile_definitions(mocktail_audio_opensl_adapter PUBLIC MOCKTAIL_USE_SYSTEM_OPENSL_HEADERS=1 ) message(STATUS "Mocktail audio: using system Android OpenSL headers") else() message(STATUS "Mocktail audio: Android OpenSL headers unavailable; using minimal queue ABI boundary" ) endif() add_library(mocktail_opensles SHARED ${MOCKTAIL_AUDIO_ROOT}/src/audio/opensl_playback_runtime.cc ) target_include_directories(mocktail_opensles PUBLIC ${MOCKTAIL_AUDIO_ROOT}/include ) target_link_libraries(mocktail_opensles PRIVATE Mocktail::Audio ) target_compile_features(mocktail_opensles PRIVATE cxx_std_17) set_target_properties(mocktail_opensles PROPERTIES OUTPUT_NAME OpenSLES PREFIX "lib" SUFFIX ".so" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN YES BUILD_RPATH_USE_ORIGIN TRUE BUILD_RPATH "\$ORIGIN" INSTALL_RPATH "\$ORIGIN" ) target_link_options(mocktail_opensles PRIVATE "-Wl,-soname,libOpenSLES.so" "-Wl,--exclude-libs,ALL" ) if(BUILD_TESTING AND TARGET GTest::gtest_main) add_executable(audio_foundation_test ${MOCKTAIL_AUDIO_ROOT}/tests/audio_foundation_test.cc ${MOCKTAIL_AUDIO_ROOT}/stubs/libopensl_stub.cc ) target_link_libraries(audio_foundation_test PRIVATE Mocktail::Audio GTest::gtest_main ) target_compile_features(audio_foundation_test PRIVATE cxx_std_17) include(GoogleTest) gtest_discover_tests(audio_foundation_test PROPERTIES ENVIRONMENT "SDL_AUDIODRIVER=dummy" ) add_executable(opensl_playback_runtime_test ${MOCKTAIL_AUDIO_ROOT}/tests/opensl_playback_runtime_test.cc ) target_link_libraries(opensl_playback_runtime_test PRIVATE mocktail_opensles Mocktail::AudioSdl GTest::gtest_main ) target_compile_features(opensl_playback_runtime_test PRIVATE cxx_std_17) gtest_discover_tests(opensl_playback_runtime_test PROPERTIES ENVIRONMENT "SDL_AUDIODRIVER=dummy" ) add_executable(fmod_java_audio_runtime_test ${MOCKTAIL_AUDIO_ROOT}/tests/fmod_java_audio_runtime_test.cc ) target_link_libraries(fmod_java_audio_runtime_test PRIVATE Mocktail::FmodJavaAudioRuntime GTest::gtest_main Threads::Threads ) target_compile_features(fmod_java_audio_runtime_test PRIVATE cxx_std_17) gtest_discover_tests(fmod_java_audio_runtime_test PROPERTIES ENVIRONMENT "SDL_AUDIODRIVER=dummy" ) add_executable(fmod_jni_audio_bridge_test ${MOCKTAIL_AUDIO_ROOT}/tests/fmod_jni_audio_bridge_test.cc ) target_link_libraries(fmod_jni_audio_bridge_test PRIVATE Mocktail::FmodJniAudioBridge GTest::gtest_main ) target_compile_features(fmod_jni_audio_bridge_test PRIVATE cxx_std_17) gtest_discover_tests(fmod_jni_audio_bridge_test PROPERTIES ENVIRONMENT "SDL_AUDIODRIVER=dummy" ) endif()