diff --git a/gui/include/streamsession.h b/gui/include/streamsession.h index 8c39c3e..5701739 100644 --- a/gui/include/streamsession.h +++ b/gui/include/streamsession.h @@ -43,6 +43,16 @@ class ChiakiException : public std::exception const char *what() const noexcept override { return msg.toLocal8Bit().constData(); } }; +struct StreamSessionConnectInfo +{ + QString host; + QString registkey; + QString ostype; + QString auth; + QString morning; + QString did; +}; + class StreamSession : public QObject { friend class StreamSessionPrivate; @@ -67,7 +77,7 @@ class StreamSession : public QObject void PushVideoSample(uint8_t *buf, size_t buf_size); public: - explicit StreamSession(const QString &host, const QString ®istkey, const QString &ostype, const QString &auth, const QString &morning, const QString &did, QObject *parent = nullptr); + explicit StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent = nullptr); ~StreamSession(); void Stop(); diff --git a/gui/include/streamwindow.h b/gui/include/streamwindow.h index 22e8386..a3d5ac7 100644 --- a/gui/include/streamwindow.h +++ b/gui/include/streamwindow.h @@ -20,15 +20,16 @@ #include +#include "streamsession.h" + class QLabel; -class StreamSession; class StreamWindow: public QMainWindow { Q_OBJECT public: - explicit StreamWindow(StreamSession *session, QWidget *parent = nullptr); + explicit StreamWindow(const StreamSessionConnectInfo &connect_info, QWidget *parent = nullptr); ~StreamWindow(); private: diff --git a/gui/src/main.cpp b/gui/src/main.cpp index 86a64c6..6afa9db 100644 --- a/gui/src/main.cpp +++ b/gui/src/main.cpp @@ -17,7 +17,7 @@ #include -int RunStream(QApplication &app, const QString &host, const QString ®istkey, const QString &ostype, const QString &auth, const QString &morning, const QString &did); +int RunStream(QApplication &app, const StreamSessionConnectInfo &connect_info); int RunMain(QApplication &app); int main(int argc, char *argv[]) @@ -60,14 +60,16 @@ int main(int argc, char *argv[]) if(args[0] == "stream") { - QString registkey = parser.value(regist_key_option); - QString ostype = parser.value(ostype_option); - QString auth = parser.value(auth_option); - QString morning = parser.value(morning_option); - QString did = parser.value(did_option); - if(registkey.isEmpty() || ostype.isEmpty() || auth.isEmpty() || morning.isEmpty() || did.isEmpty()) + StreamSessionConnectInfo connect_info; + connect_info.host = host; + connect_info.registkey = parser.value(regist_key_option); + connect_info.ostype = parser.value(ostype_option); + connect_info.auth = parser.value(auth_option); + connect_info.morning = parser.value(morning_option); + connect_info.did = parser.value(did_option); + if(connect_info.registkey.isEmpty() || connect_info.ostype.isEmpty() || connect_info.auth.isEmpty() || connect_info.morning.isEmpty() || connect_info.did.isEmpty()) parser.showHelp(1); - return RunStream(app, host, registkey, ostype, auth, morning, did); + return RunStream(app, connect_info); } else if(args[0] == "discover") { @@ -88,11 +90,9 @@ int RunMain(QApplication &app) -int RunStream(QApplication &app, const QString &host, const QString ®istkey, const QString &ostype, const QString &auth, const QString &morning, const QString &did) +int RunStream(QApplication &app, const StreamSessionConnectInfo &connect_info) { - StreamSession stream_session(host, registkey, ostype, auth, morning, did); - - StreamWindow window(&stream_session); + StreamWindow window(connect_info); window.resize(640, 360); window.show(); diff --git a/gui/src/streamsession.cpp b/gui/src/streamsession.cpp index 18fa2bd..9150c09 100644 --- a/gui/src/streamsession.cpp +++ b/gui/src/streamsession.cpp @@ -33,39 +33,39 @@ static void AudioFrameCb(int16_t *buf, size_t samples_count, void *user); static void VideoSampleCb(uint8_t *buf, size_t buf_size, void *user); -StreamSession::StreamSession(const QString &host, const QString ®istkey, const QString &ostype, const QString &auth, const QString &morning, const QString &did, QObject *parent) +StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent) : QObject(parent) #if CHIAKI_GUI_ENABLE_QT_GAMEPAD ,gamepad(nullptr) #endif { - QByteArray host_str = host.toUtf8(); - QByteArray registkey_str = registkey.toUtf8(); - QByteArray ostype_str = ostype.toUtf8(); + QByteArray host_str = connect_info.host.toUtf8(); + QByteArray registkey_str = connect_info.registkey.toUtf8(); + QByteArray ostype_str = connect_info.ostype.toUtf8(); - ChiakiConnectInfo connect_info; - connect_info.host = host_str.constData(); - connect_info.regist_key = registkey_str.constData(); - connect_info.ostype = ostype_str.constData(); + ChiakiConnectInfo chiaki_connect_info; + chiaki_connect_info.host = host_str.constData(); + chiaki_connect_info.regist_key = registkey_str.constData(); + chiaki_connect_info.ostype = ostype_str.constData(); - QByteArray auth_str = auth.toUtf8(); + QByteArray auth_str = connect_info.auth.toUtf8(); size_t auth_len = auth_str.length(); - if(auth_len > sizeof(connect_info.auth)) - auth_len = sizeof(connect_info.auth); - memcpy(connect_info.auth, auth_str.constData(), auth_len); - if(auth_len < sizeof(connect_info.auth)) - memset(connect_info.auth + auth_len, 0, sizeof(connect_info.auth) - auth_len); + if(auth_len > sizeof(chiaki_connect_info.auth)) + auth_len = sizeof(chiaki_connect_info.auth); + memcpy(chiaki_connect_info.auth, auth_str.constData(), auth_len); + if(auth_len < sizeof(chiaki_connect_info.auth)) + memset(chiaki_connect_info.auth + auth_len, 0, sizeof(chiaki_connect_info.auth) - auth_len); - size_t morning_size = sizeof(connect_info.morning); - QByteArray morning_str = morning.toUtf8(); - ChiakiErrorCode err = chiaki_base64_decode(morning_str.constData(), morning_str.length(), connect_info.morning, &morning_size); - if(err != CHIAKI_ERR_SUCCESS || morning_size != sizeof(connect_info.morning)) + size_t morning_size = sizeof(chiaki_connect_info.morning); + QByteArray morning_str = connect_info.morning.toUtf8(); + ChiakiErrorCode err = chiaki_base64_decode(morning_str.constData(), morning_str.length(), chiaki_connect_info.morning, &morning_size); + if(err != CHIAKI_ERR_SUCCESS || morning_size != sizeof(chiaki_connect_info.morning)) throw ChiakiException("Morning invalid"); - size_t did_size = sizeof(connect_info.did); - QByteArray did_str = did.toUtf8(); - err = chiaki_base64_decode(did_str.constData(), did_str.length(), connect_info.did, &did_size); - if(err != CHIAKI_ERR_SUCCESS || did_size != sizeof(connect_info.did)) + size_t did_size = sizeof(chiaki_connect_info.did); + QByteArray did_str = connect_info.did.toUtf8(); + err = chiaki_base64_decode(did_str.constData(), did_str.length(), chiaki_connect_info.did, &did_size); + if(err != CHIAKI_ERR_SUCCESS || did_size != sizeof(chiaki_connect_info.did)) throw ChiakiException("Did invalid"); // TODO: move audio init out of here and use values from audio header @@ -87,9 +87,9 @@ StreamSession::StreamSession(const QString &host, const QString ®istkey, cons memset(&keyboard_state, 0, sizeof(keyboard_state)); - err = chiaki_session_init(&session, &connect_info); + err = chiaki_session_init(&session, &chiaki_connect_info); if(err != CHIAKI_ERR_SUCCESS) - throw ChiakiException("Chiaki Session Init failed"); + throw ChiakiException("Chiaki Session Init failed: " + QString::fromLocal8Bit(chiaki_error_string(err))); chiaki_session_set_audio_frame_cb(&session, AudioFrameCb, this); chiaki_session_set_video_sample_cb(&session, VideoSampleCb, this); diff --git a/gui/src/streamwindow.cpp b/gui/src/streamwindow.cpp index f08f59b..7c40080 100644 --- a/gui/src/streamwindow.cpp +++ b/gui/src/streamwindow.cpp @@ -19,10 +19,10 @@ #include #include +#include -StreamWindow::StreamWindow(StreamSession *session, QWidget *parent) - : QMainWindow(parent), - session(session) +StreamWindow::StreamWindow(const StreamSessionConnectInfo &connect_info, QWidget *parent) + : QMainWindow(parent) { imageLabel = new QLabel(this); setCentralWidget(imageLabel); @@ -31,6 +31,8 @@ StreamWindow::StreamWindow(StreamSession *session, QWidget *parent) imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); imageLabel->setScaledContents(true); + session = new StreamSession(connect_info, this); + connect(session->GetVideoDecoder(), &VideoDecoder::FramesAvailable, this, &StreamWindow::FramesAvailable); FramesAvailable(); diff --git a/lib/src/common.c b/lib/src/common.c index 45f34cc..a418211 100644 --- a/lib/src/common.c +++ b/lib/src/common.c @@ -34,6 +34,22 @@ CHIAKI_EXPORT const char *chiaki_error_string(ChiakiErrorCode code) return "Network error"; case CHIAKI_ERR_INVALID_DATA: return "Invalid data"; + case CHIAKI_ERR_BUF_TOO_SMALL: + return "Buffer too small"; + case CHIAKI_ERR_MUTEX_LOCKED: + return "Mutex is locked"; + case CHIAKI_ERR_CANCELED: + return "Canceled"; + case CHIAKI_ERR_TIMEOUT: + return "Timeout"; + case CHIAKI_ERR_INVALID_RESPONSE: + return "Invalid Response"; + case CHIAKI_ERR_INVALID_MAC: + return "Invalid MAC"; + case CHIAKI_ERR_UNINITIALIZED: + return "Uninitialized"; + case CHIAKI_ERR_FEC_FAILED: + return "FEC failed"; default: return "Unknown"; }