Integrate Setsu in GUI

This commit is contained in:
Florian Märkl 2020-07-02 22:34:57 +02:00
commit f3be4ed22a
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
5 changed files with 124 additions and 6 deletions

View file

@ -83,6 +83,10 @@ if(CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER)
target_link_libraries(chiaki SDL2::SDL2) target_link_libraries(chiaki SDL2::SDL2)
target_compile_definitions(chiaki PRIVATE CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER) target_compile_definitions(chiaki PRIVATE CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER)
endif() endif()
if(CHIAKI_ENABLE_SETSU)
target_link_libraries(chiaki setsu)
target_compile_definitions(chiaki PRIVATE CHIAKI_GUI_ENABLE_SETSU)
endif()
set_target_properties(chiaki PROPERTIES set_target_properties(chiaki PROPERTIES
MACOSX_BUNDLE TRUE MACOSX_BUNDLE TRUE

View file

@ -21,6 +21,10 @@
#include <chiaki/session.h> #include <chiaki/session.h>
#include <chiaki/opusdecoder.h> #include <chiaki/opusdecoder.h>
#if CHIAKI_GUI_ENABLE_SETSU
#include <setsu.h>
#endif
#include "videodecoder.h" #include "videodecoder.h"
#include "exception.h" #include "exception.h"
#include "sessionlog.h" #include "sessionlog.h"
@ -69,6 +73,11 @@ class StreamSession : public QObject
ChiakiOpusDecoder opus_decoder; ChiakiOpusDecoder opus_decoder;
Controller *controller; Controller *controller;
#if CHIAKI_GUI_ENABLE_SETSU
Setsu *setsu;
QMap<QPair<QString, SetsuTrackingId>, uint8_t> setsu_ids;
ChiakiControllerState setsu_state;
#endif
ChiakiControllerState keyboard_state; ChiakiControllerState keyboard_state;
@ -83,6 +92,9 @@ class StreamSession : public QObject
void PushAudioFrame(int16_t *buf, size_t samples_count); void PushAudioFrame(int16_t *buf, size_t samples_count);
void PushVideoSample(uint8_t *buf, size_t buf_size); void PushVideoSample(uint8_t *buf, size_t buf_size);
void Event(ChiakiEvent *event); void Event(ChiakiEvent *event);
#if CHIAKI_GUI_ENABLE_SETSU
void HandleSetsuEvent(SetsuEvent *event);
#endif
private slots: private slots:
void InitAudio(unsigned int channels, unsigned int rate); void InitAudio(unsigned int channels, unsigned int rate);

View file

@ -199,7 +199,8 @@ QString Controller::GetName()
ChiakiControllerState Controller::GetState() ChiakiControllerState Controller::GetState()
{ {
ChiakiControllerState state = {}; ChiakiControllerState state;
chiaki_controller_state_set_idle(&state);
#ifdef CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER #ifdef CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
if(!controller) if(!controller)
return state; return state;

View file

@ -27,6 +27,8 @@
#include <cstring> #include <cstring>
#include <chiaki/session.h> #include <chiaki/session.h>
#define SETSU_UPDATE_INTERVAL_MS 4
StreamSessionConnectInfo::StreamSessionConnectInfo(Settings *settings, QString host, QByteArray regist_key, QByteArray morning) StreamSessionConnectInfo::StreamSessionConnectInfo(Settings *settings, QString host, QByteArray regist_key, QByteArray morning)
{ {
key_map = settings->GetControllerMappingForDecoding(); key_map = settings->GetControllerMappingForDecoding();
@ -44,6 +46,7 @@ static void AudioSettingsCb(uint32_t channels, uint32_t rate, void *user);
static void AudioFrameCb(int16_t *buf, size_t samples_count, void *user); static void AudioFrameCb(int16_t *buf, size_t samples_count, void *user);
static bool VideoSampleCb(uint8_t *buf, size_t buf_size, void *user); static bool VideoSampleCb(uint8_t *buf, size_t buf_size, void *user);
static void EventCb(ChiakiEvent *event, void *user); static void EventCb(ChiakiEvent *event, void *user);
static void SessionSetsuCb(SetsuEvent *event, void *user);
StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent) StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent)
: QObject(parent), : QObject(parent),
@ -70,7 +73,7 @@ StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObje
throw ChiakiException("Morning invalid"); throw ChiakiException("Morning invalid");
memcpy(chiaki_connect_info.morning, connect_info.morning.constData(), sizeof(chiaki_connect_info.morning)); memcpy(chiaki_connect_info.morning, connect_info.morning.constData(), sizeof(chiaki_connect_info.morning));
memset(&keyboard_state, 0, sizeof(keyboard_state)); chiaki_controller_state_set_idle(&keyboard_state);
ChiakiErrorCode err = chiaki_session_init(&session, &chiaki_connect_info, log.GetChiakiLog()); ChiakiErrorCode err = chiaki_session_init(&session, &chiaki_connect_info, log.GetChiakiLog());
if(err != CHIAKI_ERR_SUCCESS) if(err != CHIAKI_ERR_SUCCESS)
@ -88,6 +91,16 @@ StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObje
connect(ControllerManager::GetInstance(), &ControllerManager::AvailableControllersUpdated, this, &StreamSession::UpdateGamepads); connect(ControllerManager::GetInstance(), &ControllerManager::AvailableControllersUpdated, this, &StreamSession::UpdateGamepads);
#endif #endif
#if CHIAKI_GUI_ENABLE_SETSU
chiaki_controller_state_set_idle(&setsu_state);
setsu = setsu_new();
auto timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, [this]{
setsu_poll(setsu, SessionSetsuCb, this);
});
timer->start(SETSU_UPDATE_INTERVAL_MS);
#endif
key_map = connect_info.key_map; key_map = connect_info.key_map;
UpdateGamepads(); UpdateGamepads();
} }
@ -100,6 +113,9 @@ StreamSession::~StreamSession()
#if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER #if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
delete controller; delete controller;
#endif #endif
#if CHIAKI_GUI_ENABLE_SETSU
setsu_free(setsu);
#endif
} }
void StreamSession::Start() void StreamSession::Start()
@ -217,13 +233,18 @@ void StreamSession::UpdateGamepads()
void StreamSession::SendFeedbackState() void StreamSession::SendFeedbackState()
{ {
ChiakiControllerState state = {}; ChiakiControllerState state;
chiaki_controller_state_set_idle(&state);
#if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER #if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
if(controller) if(controller)
state = controller->GetState(); state = controller->GetState();
#endif #endif
#if CHIAKI_GUI_ENABLE_SETSU
chiaki_controller_state_or(&state, &state, &setsu_state);
#endif
chiaki_controller_state_or(&state, &state, &keyboard_state); chiaki_controller_state_or(&state, &state, &keyboard_state);
chiaki_session_set_controller_state(&session, &state); chiaki_session_set_controller_state(&session, &state);
} }
@ -275,6 +296,8 @@ void StreamSession::Event(ChiakiEvent *event)
{ {
switch(event->type) switch(event->type)
{ {
case CHIAKI_EVENT_CONNECTED:
break;
case CHIAKI_EVENT_QUIT: case CHIAKI_EVENT_QUIT:
emit SessionQuit(event->quit.reason, event->quit.reason_str ? QString::fromUtf8(event->quit.reason_str) : QString()); emit SessionQuit(event->quit.reason, event->quit.reason_str ? QString::fromUtf8(event->quit.reason_str) : QString());
break; break;
@ -284,6 +307,63 @@ void StreamSession::Event(ChiakiEvent *event)
} }
} }
#if CHIAKI_GUI_ENABLE_SETSU
void StreamSession::HandleSetsuEvent(SetsuEvent *event)
{
if(!setsu)
return;
switch(event->type)
{
case SETSU_EVENT_DEVICE_ADDED:
setsu_connect(setsu, event->path);
break;
case SETSU_EVENT_DEVICE_REMOVED:
for(auto it=setsu_ids.begin(); it!=setsu_ids.end();)
{
if(it.key().first == event->path)
{
chiaki_controller_state_stop_touch(&setsu_state, it.value());
setsu_ids.erase(it++);
}
else
it++;
}
SendFeedbackState();
break;
case SETSU_EVENT_DOWN:
break;
case SETSU_EVENT_UP:
for(auto it=setsu_ids.begin(); it!=setsu_ids.end(); it++)
{
if(it.key().first == setsu_device_get_path(event->dev) && it.key().second == event->tracking_id)
{
chiaki_controller_state_stop_touch(&setsu_state, it.value());
setsu_ids.erase(it);
break;
}
}
SendFeedbackState();
break;
case SETSU_EVENT_POSITION: {
QPair<QString, SetsuTrackingId> k = { setsu_device_get_path(event->dev), event->tracking_id };
auto it = setsu_ids.find(k);
if(it == setsu_ids.end())
{
int8_t cid = chiaki_controller_state_start_touch(&setsu_state, event->x, event->y);
if(cid >= 0)
setsu_ids[k] = (uint8_t)cid;
else
break;
}
else
chiaki_controller_state_set_touch_pos(&setsu_state, it.value(), event->x, event->y);
SendFeedbackState();
break;
}
}
}
#endif
class StreamSessionPrivate class StreamSessionPrivate
{ {
public: public:
@ -295,6 +375,9 @@ class StreamSessionPrivate
static void PushAudioFrame(StreamSession *session, int16_t *buf, size_t samples_count) { session->PushAudioFrame(buf, samples_count); } static void PushAudioFrame(StreamSession *session, int16_t *buf, size_t samples_count) { session->PushAudioFrame(buf, samples_count); }
static void PushVideoSample(StreamSession *session, uint8_t *buf, size_t buf_size) { session->PushVideoSample(buf, buf_size); } static void PushVideoSample(StreamSession *session, uint8_t *buf, size_t buf_size) { session->PushVideoSample(buf, buf_size); }
static void Event(StreamSession *session, ChiakiEvent *event) { session->Event(event); } static void Event(StreamSession *session, ChiakiEvent *event) { session->Event(event); }
#if CHIAKI_GUI_ENABLE_SETSU
static void HandleSetsuEvent(StreamSession *session, SetsuEvent *event) { session->HandleSetsuEvent(event); }
#endif
}; };
static void AudioSettingsCb(uint32_t channels, uint32_t rate, void *user) static void AudioSettingsCb(uint32_t channels, uint32_t rate, void *user)
@ -321,3 +404,11 @@ static void EventCb(ChiakiEvent *event, void *user)
auto session = reinterpret_cast<StreamSession *>(user); auto session = reinterpret_cast<StreamSession *>(user);
StreamSessionPrivate::Event(session, event); StreamSessionPrivate::Event(session, event);
} }
#if CHIAKI_GUI_ENABLE_SETSU
static void SessionSetsuCb(SetsuEvent *event, void *user)
{
auto session = reinterpret_cast<StreamSession *>(user);
StreamSessionPrivate::HandleSetsuEvent(session, event);
}
#endif

View file

@ -22,10 +22,19 @@
CHIAKI_EXPORT void chiaki_controller_state_set_idle(ChiakiControllerState *state) CHIAKI_EXPORT void chiaki_controller_state_set_idle(ChiakiControllerState *state)
{ {
state->buttons = 0; state->buttons = 0;
state->l2_state = 0;
state->r2_state = 0;
state->left_x = 0; state->left_x = 0;
state->left_y = 0; state->left_y = 0;
state->right_x = 0; state->right_x = 0;
state->right_y = 0; state->right_y = 0;
state->touch_id_next = 0;
for(size_t i=0; i<CHIAKI_CONTROLLER_TOUCHES_MAX; i++)
{
state->touches[i].id = -1;
state->touches[i].x = 0;
state->touches[i].y = 0;
}
} }
CHIAKI_EXPORT int8_t chiaki_controller_state_start_touch(ChiakiControllerState *state, uint16_t x, uint16_t y) CHIAKI_EXPORT int8_t chiaki_controller_state_start_touch(ChiakiControllerState *state, uint16_t x, uint16_t y)
@ -38,7 +47,7 @@ CHIAKI_EXPORT int8_t chiaki_controller_state_start_touch(ChiakiControllerState *
state->touch_id_next = (state->touch_id_next + 1) & TOUCH_ID_MASK; state->touch_id_next = (state->touch_id_next + 1) & TOUCH_ID_MASK;
state->touches[i].x = x; state->touches[i].x = x;
state->touches[i].y = y; state->touches[i].y = y;
break; return state->touches[i].id;
} }
} }
return -1; return -1;
@ -87,13 +96,14 @@ CHIAKI_EXPORT void chiaki_controller_state_or(ChiakiControllerState *out, Chiaki
out->touch_id_next = 0; out->touch_id_next = 0;
for(size_t i=0; i<CHIAKI_CONTROLLER_TOUCHES_MAX; i++) for(size_t i=0; i<CHIAKI_CONTROLLER_TOUCHES_MAX; i++)
{ {
ChiakiControllerTouch *touch = a->touches[i].id >= 0 ? &a->touches[i] : b->touches[i].id >= 0 ? &b->touches[i] : NULL; ChiakiControllerTouch *touch = a->touches[i].id >= 0 ? &a->touches[i] : (b->touches[i].id >= 0 ? &b->touches[i] : NULL);
if(!touch) if(!touch)
{ {
out->touches[i].id = -1; out->touches[i].id = -1;
out->touches[i].x = out->touches[i].y = 0; out->touches[i].x = out->touches[i].y = 0;
continue; continue;
} }
out->touches[i] = *touch; if(touch != &out->touches[i])
out->touches[i] = *touch;
} }
} }