diff --git a/CMakeLists.txt b/CMakeLists.txt index 814817a..1de7b40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,10 @@ project(chiaki) option(CHIAKI_ENABLE_TESTS "Enable tests for Chiaki" ON) option(CHIAKI_ENABLE_CLI "Enable CLI for Chiaki" OFF) +option(CHIAKI_ENABLE_GUI "Enable Qt GUI" ON) +option(CHIAKI_ENABLE_ANDROID "Enable Android (Use only as part of the Gradle Project)" OFF) +option(CHIAKI_LIB_ENABLE_OPUS "Use Opus as part of Chiaki Lib" ON) +option(CHIAKI_LIB_OPENSSL_EXTERNAL_PROJECT "Use OpenSSL as CMake external project" OFF) option(CHIAKI_GUI_ENABLE_QT_GAMEPAD "Use QtGamepad for Input" OFF) option(CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER "Use SDL Gamecontroller for Input" ON) option(CHIAKI_CLI_ARGP_STANDALONE "Search for standalone argp lib for CLI" OFF) @@ -20,15 +24,25 @@ add_subdirectory(third-party) add_definitions(-DCHIAKI_VERSION_MAJOR=${CHIAKI_VERSION_MAJOR} -DCHIAKI_VERSION_MINOR=${CHIAKI_VERSION_MINOR} -DCHIAKI_VERSION_PATCH=${CHIAKI_VERSION_PATCH} -DCHIAKI_VERSION=\"${CHIAKI_VERSION}\") +if(CHIAKI_LIB_OPENSSL_EXTERNAL_PROJECT) + include(OpenSSLExternalProject) +endif() + add_subdirectory(lib) if(CHIAKI_ENABLE_CLI) add_subdirectory(cli) endif() -add_subdirectory(gui) +if(CHIAKI_ENABLE_GUI) + add_subdirectory(gui) +endif() if(CHIAKI_ENABLE_TESTS) enable_testing() add_subdirectory(test) endif() + +if(CHIAKI_ENABLE_ANDROID) + add_subdirectory(android/app) +endif() \ No newline at end of file diff --git a/android/app/CMakeLists.txt b/android/app/CMakeLists.txt new file mode 100644 index 0000000..9d755a8 --- /dev/null +++ b/android/app/CMakeLists.txt @@ -0,0 +1,5 @@ + +cmake_minimum_required(VERSION 3.2) + +add_library(chiaki-jni SHARED src/main/cpp/chiaki-jni.c) +target_link_libraries(chiaki-jni chiaki-lib) \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 3f4a170..e58415d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -13,6 +13,23 @@ android { targetSdkVersion 29 versionCode 1 versionName "1.0" + externalNativeBuild { + cmake { + arguments "-DCHIAKI_ENABLE_TESTS=OFF", + "-DCHIAKI_ENABLE_CLI=OFF", + "-DCHIAKI_ENABLE_GUI=OFF", + "-DCHIAKI_ENABLE_ANDROID=ON", + "-DCHIAKI_LIB_ENABLE_OPUS=OFF", + "-DCHIAKI_LIB_OPENSSL_EXTERNAL_PROJECT=ON", + "-DCMAKE_VERBOSE_MAKEFILE=ON" + } + } + } + externalNativeBuild { + cmake { + version "3.10.2+" + path "../../CMakeLists.txt" + } } buildTypes { release { diff --git a/android/app/src/main/cpp/chiaki-jni.c b/android/app/src/main/cpp/chiaki-jni.c new file mode 100644 index 0000000..ff10e06 --- /dev/null +++ b/android/app/src/main/cpp/chiaki-jni.c @@ -0,0 +1,9 @@ + +#include + +#include + +JNIEXPORT jstring JNICALL Java_com_metallic_chiaki_lib_Chiaki_stringFromJNI(JNIEnv* env, jobject thiz) +{ + return (*env)->NewStringUTF(env, chiaki_error_string(CHIAKI_ERR_SUCCESS)); +} diff --git a/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt b/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt index 658b8c4..da93a70 100644 --- a/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt +++ b/android/app/src/main/java/com/metallic/chiaki/MainActivity.kt @@ -2,6 +2,8 @@ package com.metallic.chiaki import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import com.metallic.chiaki.lib.Chiaki +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { @@ -9,5 +11,7 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + testTextView.text = Chiaki.stringFromJNI() } } diff --git a/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt new file mode 100644 index 0000000..bb17e18 --- /dev/null +++ b/android/app/src/main/java/com/metallic/chiaki/lib/Chiaki.kt @@ -0,0 +1,14 @@ +package com.metallic.chiaki.lib + +class Chiaki +{ + companion object + { + init + { + System.loadLibrary("chiaki-jni") + } + + @JvmStatic external fun stringFromJNI(): String + } +} \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml index 4fc2444..145e02f 100644 --- a/android/app/src/main/res/layout/activity_main.xml +++ b/android/app/src/main/res/layout/activity_main.xml @@ -7,6 +7,7 @@ tools:context=".MainActivity"> /Configure" "--prefix=" no-shared ${OPENSSL_CONFIG_EXTRA_ARGS} "${OPENSSL_OS_COMPILER}" + BUILD_COMMAND ${CMAKE_COMMAND} -E env ${OPENSSL_BUILD_ENV} "${MAKE_EXE}" build_libs + INSTALL_COMMAND ${CMAKE_COMMAND} -E env ${OPENSSL_BUILD_ENV} "${MAKE_EXE}" install_dev) + +add_library(OpenSSL_Crypto INTERFACE) +add_dependencies(OpenSSL_Crypto OpenSSL-ExternalProject) +if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") + target_link_directories(OpenSSL_Crypto INTERFACE "${OPENSSL_INSTALL_DIR}/lib") +else() + link_directories("${OPENSSL_INSTALL_DIR}/lib") +endif() +target_link_libraries(OpenSSL_Crypto INTERFACE crypto) +target_include_directories(OpenSSL_Crypto INTERFACE "${OPENSSL_INSTALL_DIR}/include") diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 80ac650..ac6eab0 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -74,8 +74,11 @@ include_directories("${NANOPB_SOURCE_DIR}") set_source_files_properties(${CHIAKI_LIB_PROTO_SOURCE_FILES} ${CHIAKI_LIB_PROTO_HEADER_FILES} PROPERTIES GENERATED TRUE) include_directories("${CHIAKI_LIB_PROTO_INCLUDE_DIR}") -find_package(Opus REQUIRED) -include_directories(${Opus_INCLUDE_DIRS}) +if(CHIAKI_LIB_ENABLE_OPUS) + find_package(Opus REQUIRED) + include_directories(${Opus_INCLUDE_DIRS}) + add_definitions(-DCHIAKI_LIB_ENABLE_OPUS) +endif() add_library(chiaki-lib ${HEADER_FILES} ${SOURCE_FILES} ${CHIAKI_LIB_PROTO_SOURCE_FILES} ${CHIAKI_LIB_PROTO_HEADER_FILES}) add_dependencies(chiaki-lib chiaki-pb) @@ -90,10 +93,16 @@ target_include_directories(chiaki-lib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/includ find_package(Threads REQUIRED) target_link_libraries(chiaki-lib Threads::Threads) -find_package(OpenSSL REQUIRED) -target_link_libraries(chiaki-lib OpenSSL::Crypto) +if(CHIAKI_LIB_OPENSSL_EXTERNAL_PROJECT) + target_link_libraries(chiaki-lib OpenSSL_Crypto) +else() + find_package(OpenSSL REQUIRED) + target_link_libraries(chiaki-lib OpenSSL::Crypto) +endif() target_link_libraries(chiaki-lib protobuf-nanopb-static) target_link_libraries(chiaki-lib jerasure) -target_link_libraries(chiaki-lib ${Opus_LIBRARIES}) +if(CHIAKI_LIB_ENABLE_OPUS) + target_link_libraries(chiaki-lib ${Opus_LIBRARIES}) +endif() \ No newline at end of file diff --git a/lib/src/audioreceiver.c b/lib/src/audioreceiver.c index a34898e..2a2535d 100644 --- a/lib/src/audioreceiver.c +++ b/lib/src/audioreceiver.c @@ -18,7 +18,9 @@ #include #include +#ifdef CHIAKI_LIB_ENABLE_OPUS #include +#endif #include @@ -47,7 +49,9 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_audio_receiver_init(ChiakiAudioReceiver *au CHIAKI_EXPORT void chiaki_audio_receiver_fini(ChiakiAudioReceiver *audio_receiver) { +#ifdef CHIAKI_LIB_ENABLE_OPUS opus_decoder_destroy(audio_receiver->opus_decoder); +#endif chiaki_mutex_fini(&audio_receiver->mutex); free(audio_receiver->pcm_buf); } @@ -65,6 +69,7 @@ CHIAKI_EXPORT void chiaki_audio_receiver_stream_info(ChiakiAudioReceiver *audio_ CHIAKI_LOGI(audio_receiver->log, " unknown = %d", audio_header->unknown); memcpy(&audio_receiver->audio_header, audio_header, sizeof(audio_receiver->audio_header)); +#ifdef CHIAKI_LIB_ENABLE_OPUS opus_decoder_destroy(audio_receiver->opus_decoder); int error; @@ -97,6 +102,9 @@ CHIAKI_EXPORT void chiaki_audio_receiver_stream_info(ChiakiAudioReceiver *audio_ if(audio_receiver->session->audio_settings_cb) audio_receiver->session->audio_settings_cb(audio_header->channels, audio_header->rate, audio_receiver->session->audio_cb_user); +#else + CHIAKI_LOGE(audio_receiver->log, "Opus disabled, not initializing decoder"); +#endif beach: chiaki_mutex_unlock(&audio_receiver->mutex); @@ -160,6 +168,7 @@ CHIAKI_EXPORT void chiaki_audio_receiver_av_packet(ChiakiAudioReceiver *audio_re static void chiaki_audio_receiver_frame(ChiakiAudioReceiver *audio_receiver, ChiakiSeqNum16 frame_index, uint8_t *buf, size_t buf_size) { +#ifdef CHIAKI_LIB_ENABLE_OPUS chiaki_mutex_lock(&audio_receiver->mutex); if(!audio_receiver->opus_decoder) @@ -181,4 +190,5 @@ static void chiaki_audio_receiver_frame(ChiakiAudioReceiver *audio_receiver, Chi beach: chiaki_mutex_unlock(&audio_receiver->mutex); +#endif } \ No newline at end of file diff --git a/lib/src/common.c b/lib/src/common.c index a188a98..5808039 100644 --- a/lib/src/common.c +++ b/lib/src/common.c @@ -72,7 +72,7 @@ CHIAKI_EXPORT void *chiaki_aligned_alloc(size_t alignment, size_t size) { #if defined(_WIN32) return _aligned_malloc(size, alignment); -#elif __APPLE__ +#elif __APPLE__ || __ANDROID__ void *r; if(posix_memalign(&r, alignment, size) == 0) return r;