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

@@ -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;
}

View File

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

View File

@@ -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<HardwareBuffer>();
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<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);
}
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);
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;

View File

@@ -1,6 +1,7 @@
#pragma once
#include <memory>
#include <unordered_map>
#include <thread>
class RenderTarget;
@@ -12,7 +13,7 @@ class Kernel
{
std::unique_ptr<egl::Context> m_egl_context;
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::mutex m_mutex;
std::thread m_main_loop_thread;
@@ -20,5 +21,5 @@ class Kernel
public:
explicit Kernel(const std::shared_ptr<aidl::com::omixlab::mosis::IMosisListener>& listener);
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
{
m_kernel->set_listener(listener);
m_kernel->add_listener(listener);
*_aidl_return = true;
}
return ndk::ScopedAStatus::ok();

View File

@@ -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)