Add oboe-wrapper local vcpkg port
... because we switched to unmodified oboe. The wrapper is built as separate local vcpkg port that depends on oboe. Signed-off-by: Vasyl Gello <vasek.gello@gmail.com>
This commit is contained in:
		
							parent
							
								
									7bafe142ca
								
							
						
					
					
						commit
						0dfb1ae776
					
				
							
								
								
									
										1
									
								
								build.rs
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								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"); | ||||
| } | ||||
|  | ||||
							
								
								
									
										15
									
								
								res/vcpkg/oboe-wrapper/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								res/vcpkg/oboe-wrapper/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @ -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}") | ||||
							
								
								
									
										8
									
								
								res/vcpkg/oboe-wrapper/portfile.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								res/vcpkg/oboe-wrapper/portfile.cmake
									
									
									
									
									
										Normal file
									
								
							| @ -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() | ||||
							
								
								
									
										19
									
								
								res/vcpkg/oboe-wrapper/vcpkg.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								res/vcpkg/oboe-wrapper/vcpkg.json
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
|     } | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										147
									
								
								src/oboe.patch
									
									
									
									
									
								
							
							
						
						
									
										147
									
								
								src/oboe.patch
									
									
									
									
									
								
							| @ -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<AudioStream> &sharedStream
 | ||||
|  } | ||||
|   | ||||
|  } // namespace oboe | ||||
| +
 | ||||
| +#include <oboe/Oboe.h>
 | ||||
| +#include <math.h>
 | ||||
| +#include <deque>
 | ||||
| +#include <pthread.h>
 | ||||
| +
 | ||||
| +// 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<float> 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 *>(player)->push(v, n);
 | ||||
| +    }
 | ||||
| +
 | ||||
| +    void destroy_oboe_player(void *player)
 | ||||
| +    {
 | ||||
| +        delete static_cast<Player *>(player);
 | ||||
| +    }
 | ||||
| +}
 | ||||
| @ -24,6 +24,10 @@ | ||||
|       "name": "oboe", | ||||
|       "platform": "android" | ||||
|     }, | ||||
|     { | ||||
|       "name": "oboe-wrapper", | ||||
|       "platform": "android" | ||||
|     }, | ||||
|     { | ||||
|       "name": "opus", | ||||
|       "host": true | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user