support multiple listeners based on pid
This commit is contained in:
@@ -40,3 +40,8 @@ void ExternalTexture::unbind() const
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
}
|
||||
|
||||
GLuint ExternalTexture::texture_id() const
|
||||
{
|
||||
return texture;
|
||||
}
|
||||
|
||||
@@ -11,4 +11,5 @@ public:
|
||||
void destroy();
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
GLuint texture_id() const;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -44,7 +44,7 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
m_kernel->set_listener(listener);
|
||||
m_kernel->add_listener(listener);
|
||||
*_aidl_return = true;
|
||||
}
|
||||
return ndk::ScopedAStatus::ok();
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user