Add Basic Keyboard Input

This commit is contained in:
Florian Märkl 2019-07-10 09:58:01 +02:00
commit bf17d81d25
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
4 changed files with 64 additions and 0 deletions

View file

@ -31,6 +31,7 @@ class QGamepad;
class QAudioOutput;
class QIODevice;
class QKeyEvent;
class StreamSession : public QObject
{
@ -45,6 +46,8 @@ class StreamSession : public QObject
QGamepad *gamepad;
#endif
ChiakiControllerState keyboard_state;
VideoDecoder video_decoder;
QAudioOutput *audio_output;
@ -62,6 +65,8 @@ class StreamSession : public QObject
#endif
VideoDecoder *GetVideoDecoder() { return &video_decoder; }
void HandleKeyboardEvent(QKeyEvent *event);
signals:
void CurrentImageUpdated();

View file

@ -38,6 +38,10 @@ class StreamWindow: public QMainWindow
void SetImage(const QImage &image);
protected:
void keyPressEvent(QKeyEvent *event) override;
void keyReleaseEvent(QKeyEvent *event) override;
private slots:
void FramesAvailable();
};

View file

@ -24,9 +24,11 @@
#include <QGamepad>
#endif
#include <QKeyEvent>
#include <QAudioOutput>
#include <QDebug>
#include <cstring>
static void AudioFrameCb(int16_t *buf, size_t samples_count, void *user);
static void VideoSampleCb(uint8_t *buf, size_t buf_size, void *user);
@ -88,6 +90,8 @@ StreamSession::StreamSession(const QString &host, const QString &registkey, cons
audio_output = new QAudioOutput(audio_format, this);
audio_io = audio_output->start();
memset(&keyboard_state, 0, sizeof(keyboard_state));
chiaki_session_init(&session, &connect_info);
chiaki_session_set_audio_frame_cb(&session, AudioFrameCb, this);
chiaki_session_set_video_sample_cb(&session, VideoSampleCb, this);
@ -108,6 +112,42 @@ StreamSession::~StreamSession()
chiaki_session_fini(&session);
}
void StreamSession::HandleKeyboardEvent(QKeyEvent *event)
{
uint64_t button_mask;
switch(event->key())
{
case Qt::Key::Key_Left:
button_mask = CHIAKI_CONTROLLER_BUTTON_DPAD_LEFT;
break;
case Qt::Key::Key_Right:
button_mask = CHIAKI_CONTROLLER_BUTTON_DPAD_RIGHT;
break;
case Qt::Key::Key_Up:
button_mask = CHIAKI_CONTROLLER_BUTTON_DPAD_UP;
break;
case Qt::Key::Key_Down:
button_mask = CHIAKI_CONTROLLER_BUTTON_DPAD_DOWN;
break;
case Qt::Key::Key_Return:
button_mask = CHIAKI_CONTROLLER_BUTTON_CROSS;
break;
case Qt::Key::Key_Backspace:
button_mask = CHIAKI_CONTROLLER_BUTTON_MOON;
break;
default:
// not interested
return;
}
if(event->type() == QEvent::KeyPress)
keyboard_state.buttons |= button_mask;
else
keyboard_state.buttons &= ~button_mask;
SendFeedbackState();
}
#if CHIAKI_GUI_ENABLE_QT_GAMEPAD
void StreamSession::UpdateGamepads()
{
@ -183,6 +223,8 @@ void StreamSession::SendFeedbackState()
}
#endif
state.buttons |= keyboard_state.buttons;
chiaki_session_set_controller_state(&session, &state);
}

View file

@ -33,6 +33,8 @@ StreamWindow::StreamWindow(StreamSession *session, QWidget *parent)
connect(session->GetVideoDecoder(), &VideoDecoder::FramesAvailable, this, &StreamWindow::FramesAvailable);
FramesAvailable();
grabKeyboard();
}
StreamWindow::~StreamWindow()
@ -44,6 +46,17 @@ void StreamWindow::SetImage(const QImage &image)
imageLabel->setPixmap(QPixmap::fromImage(image));
}
void StreamWindow::keyPressEvent(QKeyEvent *event)
{
session->HandleKeyboardEvent(event);
}
void StreamWindow::keyReleaseEvent(QKeyEvent *event)
{
session->HandleKeyboardEvent(event);
}
void StreamWindow::FramesAvailable()
{
QImage prev;