diff --git a/src/main/cpp/external_texture.cpp b/src/main/cpp/external_texture.cpp index 75e8daf..65337c4 100644 --- a/src/main/cpp/external_texture.cpp +++ b/src/main/cpp/external_texture.cpp @@ -9,7 +9,7 @@ bool ExternalTexture::create(AHardwareBuffer *hardwareBuffer) AHardwareBuffer_describe(hardwareBuffer, &desc); EGLClientBuffer clientBuffer = eglGetNativeClientBufferANDROID(hardwareBuffer); EGLImageKHR eglImage = eglCreateImageKHR(eglGetCurrentDisplay(), EGL_NO_CONTEXT, - EGL_NATIVE_BUFFER_ANDROID, clientBuffer, nullptr); + EGL_NATIVE_BUFFER_ANDROID, clientBuffer, nullptr); if (eglImage == EGL_NO_IMAGE_KHR) { Logger::Log("Failed to create EGL image"); @@ -40,3 +40,8 @@ void ExternalTexture::unbind() const { glBindTexture(GL_TEXTURE_2D, 0); } + +GLuint ExternalTexture::texture_id() const +{ + return texture; +} diff --git a/src/main/cpp/external_texture.h b/src/main/cpp/external_texture.h index 1dd9583..d31a88e 100644 --- a/src/main/cpp/external_texture.h +++ b/src/main/cpp/external_texture.h @@ -11,4 +11,5 @@ public: void destroy(); void bind() const; void unbind() const; + GLuint texture_id() const; }; diff --git a/src/main/cpp/kernel.cpp b/src/main/cpp/kernel.cpp index 779f3a2..c92300b 100644 --- a/src/main/cpp/kernel.cpp +++ b/src/main/cpp/kernel.cpp @@ -23,10 +23,12 @@ void Kernel::main_loop() return; } m_render_target->bind(); - m_listener->onServiceInitialized(true); + for (const auto& [pid, l] : m_listeners) + l->onServiceInitialized(true); m_aidl_buffer = std::make_unique(); m_aidl_buffer->reset(m_render_target->hardware_buffer()); - m_listener->onBufferAvailable(*m_aidl_buffer); + for (const auto& [pid, l] : m_listeners) + l->onBufferAvailable(*m_aidl_buffer); while (true) { @@ -37,23 +39,25 @@ void Kernel::main_loop() glFinish(); { std::lock_guard _lock(m_mutex); - m_listener->onFrameAvailable(); + for (const auto& [pid, l] : m_listeners) + l->onFrameAvailable(); } std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } -Kernel::Kernel(const std::shared_ptr &listener) : m_listener(listener) +Kernel::Kernel(const std::shared_ptr &listener) { + m_listeners.emplace(AIBinder_getCallingPid(), listener); m_main_loop_thread = std::thread(&Kernel::main_loop, this); } -void Kernel::set_listener(const std::shared_ptr &listener) +void Kernel::add_listener(const std::shared_ptr &listener) { std::lock_guard _lock(m_mutex); - m_listener = listener; - m_listener->onServiceInitialized(true); - m_listener->onBufferAvailable(*m_aidl_buffer); + m_listeners.emplace(AIBinder_getCallingPid(), listener); + listener->onServiceInitialized(true); + listener->onBufferAvailable(*m_aidl_buffer); } Kernel::~Kernel() = default; diff --git a/src/main/cpp/kernel.h b/src/main/cpp/kernel.h index 647aad7..22f0c59 100644 --- a/src/main/cpp/kernel.h +++ b/src/main/cpp/kernel.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include class RenderTarget; @@ -12,7 +13,7 @@ class Kernel { std::unique_ptr m_egl_context; std::unique_ptr m_render_target; - std::shared_ptr m_listener; + std::unordered_map> m_listeners; std::unique_ptr m_aidl_buffer; std::mutex m_mutex; std::thread m_main_loop_thread; @@ -20,5 +21,5 @@ class Kernel public: explicit Kernel(const std::shared_ptr& listener); virtual ~Kernel(); - void set_listener(const std::shared_ptr& listener); + void add_listener(const std::shared_ptr& listener); }; diff --git a/src/main/cpp/mosis-service.cpp b/src/main/cpp/mosis-service.cpp index ae402db..cf08714 100644 --- a/src/main/cpp/mosis-service.cpp +++ b/src/main/cpp/mosis-service.cpp @@ -44,7 +44,7 @@ public: } else { - m_kernel->set_listener(listener); + m_kernel->add_listener(listener); *_aidl_return = true; } return ndk::ScopedAStatus::ok(); diff --git a/src/main/java/com/omixlab/mosis/NativeService.kt b/src/main/java/com/omixlab/mosis/NativeService.kt index a0be45e..ba0597a 100644 --- a/src/main/java/com/omixlab/mosis/NativeService.kt +++ b/src/main/java/com/omixlab/mosis/NativeService.kt @@ -39,7 +39,7 @@ class NativeService : Service() { val serviceChannel = NotificationChannel( CHANNEL_ID, "Mosis Service Channel", - NotificationManager.IMPORTANCE_LOW + NotificationManager.IMPORTANCE_DEFAULT ) val manager = getSystemService(NotificationManager::class.java) manager.createNotificationChannel(serviceChannel)