diff --git a/build.rs b/build.rs index bb115e66d..47526d639 100644 --- a/build.rs +++ b/build.rs @@ -70,6 +70,7 @@ fn install_android_deps() { ); println!("cargo:rustc-link-lib=ndk_compat"); println!("cargo:rustc-link-lib=oboe"); + println!("cargo:rustc-link-lib=oboe_wrapper"); println!("cargo:rustc-link-lib=c++"); println!("cargo:rustc-link-lib=OpenSLES"); } diff --git a/res/vcpkg/oboe-wrapper/CMakeLists.txt b/res/vcpkg/oboe-wrapper/CMakeLists.txt new file mode 100644 index 000000000..9d50a9894 --- /dev/null +++ b/res/vcpkg/oboe-wrapper/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.20) +project(oboe_wrapper CXX) + +include(GNUInstallDirs) + +add_library(oboe_wrapper STATIC + oboe.cc +) + +target_include_directories(oboe_wrapper PRIVATE "${CURRENT_INSTALLED_DIR}/include") + +install(TARGETS oboe_wrapper + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") diff --git a/src/oboe.cc b/res/vcpkg/oboe-wrapper/oboe.cc similarity index 100% rename from src/oboe.cc rename to res/vcpkg/oboe-wrapper/oboe.cc diff --git a/res/vcpkg/oboe-wrapper/portfile.cmake b/res/vcpkg/oboe-wrapper/portfile.cmake new file mode 100644 index 000000000..c83f5bcb1 --- /dev/null +++ b/res/vcpkg/oboe-wrapper/portfile.cmake @@ -0,0 +1,8 @@ +vcpkg_configure_cmake( + SOURCE_PATH "${CMAKE_CURRENT_LIST_DIR}" + OPTIONS + -DCURRENT_INSTALLED_DIR=${CURRENT_INSTALLED_DIR} + PREFER_NINJA +) + +vcpkg_cmake_install() diff --git a/res/vcpkg/oboe-wrapper/vcpkg.json b/res/vcpkg/oboe-wrapper/vcpkg.json new file mode 100644 index 000000000..be497e1bb --- /dev/null +++ b/res/vcpkg/oboe-wrapper/vcpkg.json @@ -0,0 +1,19 @@ +{ + "name": "oboe-wrapper", + "version": "0", + "description": "None", + "dependencies": [ + { + "name": "vcpkg-cmake", + "host": true + }, + { + "name": "vcpkg-cmake-config", + "host": true + }, + { + "name": "oboe", + "host": false + } + ] +} diff --git a/src/oboe.patch b/src/oboe.patch deleted file mode 100644 index 8910afec6..000000000 --- a/src/oboe.patch +++ /dev/null @@ -1,147 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 51a45b2..75be96a 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -60,7 +60,7 @@ set (oboe_sources - src/common/Version.cpp - ) - --add_library(oboe ${oboe_sources}) -+ add_library(oboe STATIC ${oboe_sources}) - - # Specify directories which the compiler should look for headers - target_include_directories(oboe -@@ -91,4 +91,4 @@ install(TARGETS oboe - ARCHIVE DESTINATION lib/${ANDROID_ABI}) - - # Also install the headers --install(DIRECTORY include/oboe DESTINATION include) -\ No newline at end of file -+install(DIRECTORY include/oboe DESTINATION include) -diff --git a/src/common/AudioStreamBuilder.cpp b/src/common/AudioStreamBuilder.cpp -index dffcd75..79984a4 100644 ---- a/src/common/AudioStreamBuilder.cpp -+++ b/src/common/AudioStreamBuilder.cpp -@@ -215,3 +215,122 @@ Result AudioStreamBuilder::openStream(std::shared_ptr &sharedStream - } - - } // namespace oboe -+ -+#include -+#include -+#include -+#include -+ -+// I got link problem with std::mutex, so use pthread instead -+class CThreadLock -+{ -+public: -+ CThreadLock(); -+ virtual ~CThreadLock(); -+ -+ void Lock(); -+ void Unlock(); -+ -+private: -+ pthread_mutex_t mutexlock; -+}; -+ -+CThreadLock::CThreadLock() -+{ -+ // init lock here -+ pthread_mutex_init(&mutexlock, 0); -+} -+ -+CThreadLock::~CThreadLock() -+{ -+ // deinit lock here -+ pthread_mutex_destroy(&mutexlock); -+} -+void CThreadLock::Lock() -+{ -+ // lock -+ pthread_mutex_lock(&mutexlock); -+} -+void CThreadLock::Unlock() -+{ -+ // unlock -+ pthread_mutex_unlock(&mutexlock); -+} -+ -+class Player : public oboe::AudioStreamDataCallback -+{ -+public: -+ ~Player() { -+ outStream->requestStop(); -+ } -+ -+ Player(int channels, int sample_rate) -+ { -+ this->channels = channels; -+ oboe::AudioStreamBuilder builder; -+ // The builder set methods can be chained for convenience. -+ builder.setSharingMode(oboe::SharingMode::Exclusive) -+ ->setPerformanceMode(oboe::PerformanceMode::LowLatency) -+ ->setChannelCount(channels) -+ ->setSampleRate(sample_rate) -+ ->setFormat(oboe::AudioFormat::Float) -+ ->setDataCallback(this) -+ ->openManagedStream(outStream); -+ // Typically, start the stream after querying some stream information, as well as some input from the user -+ outStream->requestStart(); -+ } -+ -+ oboe::DataCallbackResult onAudioReady(oboe::AudioStream *oboeStream, void *audioData, int32_t numFrames) override -+ { -+ float *floatData = (float *)audioData; -+ int i = 0; -+ mtx.Lock(); -+ auto n = channels * numFrames; -+ for (; i < n && i < (int)buffer.size(); ++i, ++floatData) -+ { -+ *floatData = buffer.front(); -+ buffer.pop_front(); -+ } -+ mtx.Unlock(); -+ for (; i < n; ++i, ++floatData) -+ { -+ *floatData = 0; -+ } -+ return oboe::DataCallbackResult::Continue; -+ } -+ -+ void push(const float *v, int n) -+ { -+ mtx.Lock(); -+ for (auto i = 0; i < n; ++i, ++v) -+ buffer.push_back(*v); -+ // in case memory overuse -+ if (buffer.size() > 48 * 1024 * 120) -+ buffer.clear(); -+ mtx.Unlock(); -+ } -+ -+private: -+ oboe::ManagedStream outStream; -+ int channels; -+ std::deque buffer; -+ CThreadLock mtx; -+}; -+ -+extern "C" -+{ -+ void *create_oboe_player(int channels, int sample_rate) -+ { -+ return new Player(channels, sample_rate); -+ } -+ -+ void push_oboe_data(void *player, const float* v, int n) -+ { -+ static_cast(player)->push(v, n); -+ } -+ -+ void destroy_oboe_player(void *player) -+ { -+ delete static_cast(player); -+ } -+} diff --git a/vcpkg.json b/vcpkg.json index 0cf2e1fc2..940783f2d 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -24,6 +24,10 @@ "name": "oboe", "platform": "android" }, + { + "name": "oboe-wrapper", + "platform": "android" + }, { "name": "opus", "host": true