support multiple listeners based on pid

This commit is contained in:
2026-01-02 15:01:16 +01:00
parent 3a410775b5
commit 16dd10f9a6
6 changed files with 24 additions and 13 deletions

View File

@@ -40,3 +40,8 @@ void ExternalTexture::unbind() const
{ {
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
} }
GLuint ExternalTexture::texture_id() const
{
return texture;
}

View File

@@ -11,4 +11,5 @@ public:
void destroy(); void destroy();
void bind() const; void bind() const;
void unbind() const; void unbind() const;
GLuint texture_id() const;
}; };

View File

@@ -23,10 +23,12 @@ void Kernel::main_loop()
return; return;
} }
m_render_target->bind(); m_render_target->bind();
m_listener->onServiceInitialized(true); for (const auto& [pid, l] : m_listeners)
l->onServiceInitialized(true);
m_aidl_buffer = std::make_unique<HardwareBuffer>(); m_aidl_buffer = std::make_unique<HardwareBuffer>();
m_aidl_buffer->reset(m_render_target->hardware_buffer()); 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) while (true)
{ {
@@ -37,23 +39,25 @@ void Kernel::main_loop()
glFinish(); glFinish();
{ {
std::lock_guard _lock(m_mutex); 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)); std::this_thread::sleep_for(std::chrono::milliseconds(100));
} }
} }
Kernel::Kernel(const std::shared_ptr<IMosisListener> &listener) : m_listener(listener) Kernel::Kernel(const std::shared_ptr<IMosisListener> &listener)
{ {
m_listeners.emplace(AIBinder_getCallingPid(), listener);
m_main_loop_thread = std::thread(&Kernel::main_loop, this); m_main_loop_thread = std::thread(&Kernel::main_loop, this);
} }
void Kernel::set_listener(const std::shared_ptr<IMosisListener> &listener) void Kernel::add_listener(const std::shared_ptr<IMosisListener> &listener)
{ {
std::lock_guard _lock(m_mutex); std::lock_guard _lock(m_mutex);
m_listener = listener; m_listeners.emplace(AIBinder_getCallingPid(), listener);
m_listener->onServiceInitialized(true); listener->onServiceInitialized(true);
m_listener->onBufferAvailable(*m_aidl_buffer); listener->onBufferAvailable(*m_aidl_buffer);
} }
Kernel::~Kernel() = default; Kernel::~Kernel() = default;

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <memory> #include <memory>
#include <unordered_map>
#include <thread> #include <thread>
class RenderTarget; class RenderTarget;
@@ -12,7 +13,7 @@ class Kernel
{ {
std::unique_ptr<egl::Context> m_egl_context; std::unique_ptr<egl::Context> m_egl_context;
std::unique_ptr<RenderTarget> m_render_target; std::unique_ptr<RenderTarget> m_render_target;
std::shared_ptr<aidl::com::omixlab::mosis::IMosisListener> m_listener; std::unordered_map<pid_t, std::shared_ptr<aidl::com::omixlab::mosis::IMosisListener>> m_listeners;
std::unique_ptr<aidl::android::hardware::HardwareBuffer> m_aidl_buffer; std::unique_ptr<aidl::android::hardware::HardwareBuffer> m_aidl_buffer;
std::mutex m_mutex; std::mutex m_mutex;
std::thread m_main_loop_thread; std::thread m_main_loop_thread;
@@ -20,5 +21,5 @@ class Kernel
public: public:
explicit Kernel(const std::shared_ptr<aidl::com::omixlab::mosis::IMosisListener>& listener); explicit Kernel(const std::shared_ptr<aidl::com::omixlab::mosis::IMosisListener>& listener);
virtual ~Kernel(); virtual ~Kernel();
void set_listener(const std::shared_ptr<aidl::com::omixlab::mosis::IMosisListener>& listener); void add_listener(const std::shared_ptr<aidl::com::omixlab::mosis::IMosisListener>& listener);
}; };

View File

@@ -44,7 +44,7 @@ public:
} }
else else
{ {
m_kernel->set_listener(listener); m_kernel->add_listener(listener);
*_aidl_return = true; *_aidl_return = true;
} }
return ndk::ScopedAStatus::ok(); return ndk::ScopedAStatus::ok();

View File

@@ -39,7 +39,7 @@ class NativeService : Service() {
val serviceChannel = NotificationChannel( val serviceChannel = NotificationChannel(
CHANNEL_ID, CHANNEL_ID,
"Mosis Service Channel", "Mosis Service Channel",
NotificationManager.IMPORTANCE_LOW NotificationManager.IMPORTANCE_DEFAULT
) )
val manager = getSystemService(NotificationManager::class.java) val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(serviceChannel) manager.createNotificationChannel(serviceChannel)