Skip to content

Commit

Permalink
+ Gamepad support
Browse files Browse the repository at this point in the history
  • Loading branch information
UMU618 committed Dec 15, 2020
1 parent 69d7191 commit 5d02bf0
Show file tree
Hide file tree
Showing 14 changed files with 449 additions and 61 deletions.
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 鎏光云游戏引擎
# Regame - Cloud Gaming Engine

[简体中文](README.zh-CN.md) | English

Expand Down Expand Up @@ -44,6 +44,7 @@ control-port: 8080
donot-present: false
enable-nvenc: true
keyboard-replay: none
gamepad-replay: none
stream-port: 8080
video-bitrate: 1000000
video-codec: h264
Expand Down Expand Up @@ -188,7 +189,9 @@ Assume you want to test USF4.

- Install `cgvhid` on server. [Details](src/cgvhid/cgvhid/)

- Run `cge --keyboard-replay=cgvhid` on server.
- If you prefer gamepad to keyboard, install `ViGEmBus` on server. [Download](https://github.com/ViGEm/ViGEmBus/releases)

- Run `cge --keyboard-replay=cgvhid --gamepad-replay=vigem` on server.

- Run `cgi -d true -e SSFIV.exe -i SSFIV.exe --lx86 .\captureyuv.dll` on server.

Expand Down
7 changes: 5 additions & 2 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ control-port: 8080
donot-present: false
enable-nvenc: true
keyboard-replay: none
gamepad-replay: none
stream-port: 8080
video-bitrate: 1000000
video-codec: h264
Expand Down Expand Up @@ -186,9 +187,11 @@ Boost 的编译命令,参考:

假设您要测试 USF4。

- 服务器上安装 `cgvhid` [详情](src/cgvhid/cgvhid/)
- 服务器上安装 `cgvhid`[详情](src/cgvhid/cgvhid/)

- 服务器上运行 `cge --keyboard-replay=cgvhid`
- 如果您更喜欢使用手柄而非键盘,请在服务器上安装 `ViGEmBus`[下载](https://github.com/ViGEm/ViGEmBus/releases)

- 服务器上运行 `cge --keyboard-replay=cgvhid --gamepad-replay=vigem`

- 服务器上运行 `cgi -d true -e SSFIV.exe -i SSFIV.exe --lx86 .\captureyuv.dll`,其中 `-e SSFIV.exe` 处要填好正确的路径名。

Expand Down
29 changes: 27 additions & 2 deletions src/cge/cge/cge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,17 @@ constexpr std::array<std::string_view, 3> kValidAudioCodecs = {
kDefaultAudioCodec, "aac", "opus"};
constexpr uint16_t kDefaultControlPort = 8080;
constexpr bool kDefaultDonotPresent = false;

constexpr std::string_view kDefaultKeyboardReplay{"none"};
// Should be the same order with KeyboardReplay
constexpr std::array<std::string_view, 2> kValidKeyboardReplayMethods = {
kDefaultKeyboardReplay, "cgvhid"};

constexpr std::string_view kDefaultGamepadReplay{"none"};
// Should be the same order with GamepadReplay
constexpr std::array<std::string_view, 3> kValidGamepadReplayMethods = {
kDefaultGamepadReplay, "cgvhid", "vigem"};

constexpr uint16_t kDefaultStreamPort = 8080;
constexpr uint64_t kDefaultVideoBitrate = 1'000'000;
constexpr std::string_view kDefaultVideoCodec{"h264"};
Expand Down Expand Up @@ -89,6 +96,7 @@ int main(int argc, char* argv[]) {
bool donot_present = false;
bool enable_nvenc = true;
KeyboardReplay keyboard_replay;
GamepadReplay gamepad_replay;
uint16_t stream_port = 0;
uint64_t video_bitrate = 0;
AVCodecID video_codec_id = AV_CODEC_ID_NONE;
Expand All @@ -98,6 +106,7 @@ int main(int argc, char* argv[]) {

try {
std::string keyboard_replay_string;
std::string gamepad_replay_string;
std::string video_codec;

po::options_description desc("Usage");
Expand All @@ -124,6 +133,9 @@ int main(int argc, char* argv[]) {
("keyboard-replay",
po::value<std::string>(&keyboard_replay_string)->default_value(kDefaultKeyboardReplay.data()),
"keyboard replay method, can be one of {none, cgvhid}")
("gamepad-replay",
po::value<std::string>(&gamepad_replay_string)->default_value(kDefaultGamepadReplay.data()),
"gamepad replay method, can be one of {none, cgvhid, vigem}")
("stream-port",
po::value<uint16_t>(&stream_port)->default_value(kDefaultStreamPort),
"set the websocket port for streaming, if port is 0, disable stream "
Expand Down Expand Up @@ -168,6 +180,7 @@ int main(int argc, char* argv[]) {
if (0 == control_port) {
control_port = kDefaultControlPort;
}

auto keyboard_replay_pos =
std::find(kValidKeyboardReplayMethods.cbegin(),
kValidKeyboardReplayMethods.cend(), keyboard_replay_string);
Expand All @@ -176,6 +189,16 @@ int main(int argc, char* argv[]) {
}
keyboard_replay = static_cast<KeyboardReplay>(std::distance(
kValidKeyboardReplayMethods.cbegin(), keyboard_replay_pos));

auto gamepad_replay_pos =
std::find(kValidGamepadReplayMethods.cbegin(),
kValidGamepadReplayMethods.cend(), gamepad_replay_string);
if (kValidGamepadReplayMethods.cend() == gamepad_replay_pos) {
throw std::invalid_argument("unsupported gamepad-replay!");
}
gamepad_replay = static_cast<GamepadReplay>(
std::distance(kValidGamepadReplayMethods.cbegin(), gamepad_replay_pos));

if (video_bitrate < kMinVideoBitrate) {
throw std::out_of_range("video-bitrate too low!");
}
Expand Down Expand Up @@ -218,6 +241,7 @@ int main(int argc, char* argv[]) {
<< "donot-present: " << std::boolalpha << donot_present << '\n'
<< "enable-nvenc: " << std::boolalpha << enable_nvenc << '\n'
<< "keyboard-replay: " << keyboard_replay_string << '\n'
<< "gamepad-replay: " << gamepad_replay_string << '\n'
<< "stream-port: " << stream_port << '\n'
<< "video-bitrate: " << video_bitrate << '\n'
<< "video-codec: " << video_codec << '\n'
Expand Down Expand Up @@ -257,8 +281,9 @@ int main(int argc, char* argv[]) {
Engine::GetInstance().Run(tcp::endpoint(kAddress, stream_port),
udp::endpoint(kAddress, control_port),
std::move(audio_codec), audio_bitrate, enable_nvenc,
keyboard_replay, video_bitrate, video_codec_id,
video_gop, std::move(video_preset), video_quality);
keyboard_replay, gamepad_replay, video_bitrate,
video_codec_id, video_gop, std::move(video_preset),
video_quality);
Engine::GetInstance().EncoderStop();
return EXIT_SUCCESS;
}
22 changes: 16 additions & 6 deletions src/cge/cge/cge.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;..\..\deps\ViGEmClient\include</AdditionalIncludeDirectories>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
Expand All @@ -190,7 +190,7 @@
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;..\..\deps\ViGEmClient\include</AdditionalIncludeDirectories>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
Expand All @@ -211,7 +211,7 @@
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;..\..\deps\ViGEmClient\include</AdditionalIncludeDirectories>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
Expand All @@ -231,7 +231,7 @@
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;..\..\deps\ViGEmClient\include</AdditionalIncludeDirectories>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
Expand All @@ -250,7 +250,7 @@
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;..\..\deps\ViGEmClient\include</AdditionalIncludeDirectories>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
Expand All @@ -271,7 +271,7 @@
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\include;..\..\deps\include;..\..\cgvhid\include;..\..\deps\ViGEmClient\include</AdditionalIncludeDirectories>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
Expand Down Expand Up @@ -301,6 +301,14 @@
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='MTRelease|x64'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="..\..\deps\ViGEmClient\src\ViGEmClient.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='MTRelease|Win32'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='MTRelease|x64'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
</ClCompile>
<ClCompile Include="audio_encoder.cpp" />
<ClCompile Include="audio_resampler.cpp" />
<ClCompile Include="cge.cpp" />
Expand All @@ -317,6 +325,7 @@
<ClCompile Include="sound_capturer.cpp" />
<ClCompile Include="udp_server.cpp" />
<ClCompile Include="video_encoder.cpp" />
<ClCompile Include="vigem_client.cpp" />
<ClCompile Include="ws_server.cpp" />
</ItemGroup>
<ItemGroup>
Expand All @@ -333,6 +342,7 @@
<ClInclude Include="sound_capturer.h" />
<ClInclude Include="udp_server.h" />
<ClInclude Include="video_encoder.h" />
<ClInclude Include="vigem_client.h" />
<ClInclude Include="ws_server.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
Expand Down
12 changes: 12 additions & 0 deletions src/cge/cge/cge.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
<Filter Include="Source Files\cgvhid_client">
<UniqueIdentifier>{c769d11b-4cba-400d-b2d6-9b77a26f3966}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\ViGEmClient">
<UniqueIdentifier>{7e2b5123-8702-4ca2-a9ec-80552fa09b12}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="cge.cpp">
Expand Down Expand Up @@ -54,6 +57,12 @@
<ClCompile Include="..\..\cgvhid\cgvhid_client\cgvhid_client.cpp">
<Filter>Source Files\cgvhid_client</Filter>
</ClCompile>
<ClCompile Include="vigem_client.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\deps\ViGEmClient\src\ViGEmClient.cpp">
<Filter>Source Files\ViGEmClient</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="engine.h">
Expand Down Expand Up @@ -98,5 +107,8 @@
<ClInclude Include="..\include\control.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="vigem_client.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
4 changes: 3 additions & 1 deletion src/cge/cge/engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ void Engine::Run(tcp::endpoint ws_endpoint,
uint64_t audio_bitrate,
bool enable_nvenc,
KeyboardReplay keyboard_replay,
GamepadReplay gamepad_replay,
uint64_t video_bitrate,
AVCodecID video_codec_id,
int video_gop,
Expand All @@ -51,7 +52,8 @@ void Engine::Run(tcp::endpoint ws_endpoint,
ws_server_->Run();
}
udp_server_ = std::make_shared<UdpServer>(*this, udp_endpoint,
std::move(keyboard_replay));
std::move(keyboard_replay),
std::move(gamepad_replay));
std::cout << "UDP Server on: " << udp_endpoint << '\n';
udp_server_->Run();
} catch (std::exception& e) {
Expand Down
10 changes: 5 additions & 5 deletions src/cge/cge/engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@

#include "encoder.h"

class WsServer;
class UdpServer;

enum class KeyboardReplay { NONE = 0, CGVHID };

enum class GamepadReplay { NONE = 0, CGVHID, VIGEM };

struct NetPacketHeader {
uint32_t type : 8;
uint32_t ts : 24;
Expand Down Expand Up @@ -37,6 +36,7 @@ class Engine {
uint64_t audio_bitrate,
bool enable_nvenc,
KeyboardReplay keyboard_replay,
GamepadReplay gamepad_replay,
uint64_t video_bitrate,
AVCodecID video_codec_id,
int video_gop,
Expand All @@ -63,8 +63,8 @@ class Engine {
bool running_ = false;

net::io_context ioc_{2};
std::shared_ptr<WsServer> ws_server_;
std::shared_ptr<UdpServer> udp_server_;
std::shared_ptr<class WsServer> ws_server_;
std::shared_ptr<class UdpServer> udp_server_;
Encoder encoder_;

CHandle donot_present_event_;
Expand Down
Loading

0 comments on commit 5d02bf0

Please sign in to comment.