mirror of
https://github.com/Lorenzooone/cc3dsfs.git
synced 2025-06-18 16:45:39 -04:00
Create Windows ARM64 build
This commit is contained in:
parent
fcef91d886
commit
8d76e38a37
2
.github/workflows/cd_main.yml
vendored
2
.github/workflows/cd_main.yml
vendored
@ -17,6 +17,7 @@ jobs:
|
||||
matrix:
|
||||
platform:
|
||||
- { name: Windows VS2022, os: windows-2022 }
|
||||
- { name: Windows VS2022 ARM, os: windows-2022, flags: -A ARM64}
|
||||
- { name: Linux GCC, os: ubuntu-latest }
|
||||
- { name: macOS Apple Silicon, os: macos-14 }
|
||||
config:
|
||||
@ -79,6 +80,7 @@ jobs:
|
||||
tag: "nightly-latest"
|
||||
replace: true
|
||||
files: >
|
||||
cc3dsfs_windows_arm64.zip
|
||||
cc3dsfs_windows_x86_64.zip
|
||||
cc3dsfs_linux_x86_64.zip
|
||||
cc3dsfs_macos.zip
|
||||
|
13
.github/workflows/cd_pr.yml
vendored
13
.github/workflows/cd_pr.yml
vendored
@ -12,8 +12,8 @@ jobs:
|
||||
matrix:
|
||||
platform:
|
||||
- { name: Windows VS2022, os: windows-2022 }
|
||||
- { name: Windows VS2022 ARM, os: windows-2022, flags: -A ARM64}
|
||||
- { name: Linux GCC, os: ubuntu-latest }
|
||||
- { name: macOS x64, os: macos-13 }
|
||||
- { name: macOS Apple Silicon, os: macos-14 }
|
||||
config:
|
||||
- { name: Static, flags: -DBUILD_SHARED_LIBS=FALSE }
|
||||
@ -44,15 +44,10 @@ jobs:
|
||||
shell: bash
|
||||
run: cd build && cpack -G ZIP
|
||||
|
||||
- name: Unpack Codesign Repack x64
|
||||
if: (runner.os == 'macOS') && (runner.arch == 'x64')
|
||||
- name: Unpack Codesign Repack
|
||||
if: runner.os == 'macOS'
|
||||
shell: bash
|
||||
run: setup_scripts/macos_bundle_signature.sh cc3dsfs_macos_x86_64
|
||||
|
||||
- name: Unpack Codesign Repack Arm64
|
||||
if: (runner.os == 'macOS') && (runner.arch == 'ARM64')
|
||||
shell: bash
|
||||
run: setup_scripts/macos_bundle_signature.sh cc3dsfs_macos_arm64
|
||||
run: setup_scripts/macos_bundle_signature.sh cc3dsfs_macos
|
||||
|
||||
- name: Archive resulting artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
|
@ -4,6 +4,7 @@ set(CMAKE_OSX_DEPLOYMENT_TARGET "11" CACHE STRING "Minimum OS X deployment versi
|
||||
project(cc3dsfs VERSION 1.0.0 LANGUAGES CXX)
|
||||
include(ExternalProject)
|
||||
|
||||
set(WINDOWS_ARM64 0)
|
||||
set(FETCHCONTENT_UPDATES_DISCONNECTED ON)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
||||
@ -26,6 +27,10 @@ if (RASPBERRY_PI_COMPILATION)
|
||||
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS}-DRASPI 1 ")
|
||||
endif()
|
||||
|
||||
if((${CMAKE_SYSTEM_NAME} STREQUAL "Windows") AND ((${CMAKE_GENERATOR_PLATFORM} MATCHES "ARM64") OR ("${CMAKE_GENERATOR_PLATFORM}" STREQUAL "" AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES "ARM64")))
|
||||
set(WINDOWS_ARM64 1)
|
||||
endif()
|
||||
|
||||
# Avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24:
|
||||
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
|
||||
cmake_policy(SET CMP0135 NEW)
|
||||
@ -34,7 +39,7 @@ endif()
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(SFML
|
||||
GIT_REPOSITORY https://github.com/SFML/SFML.git
|
||||
GIT_TAG 2.6.1)
|
||||
GIT_TAG 2.6.x)
|
||||
|
||||
FetchContent_Declare(libusb1
|
||||
GIT_REPOSITORY https://github.com/libusb/libusb-cmake.git
|
||||
@ -58,15 +63,32 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||
if(${WINDOWS_FTD3XX_USE_SHARED_LIB})
|
||||
set(FTD3XX_WINDOWS_PATH_SPECIFIER DLL)
|
||||
set(FTD3XX_LIB FTD3XX.dll)
|
||||
if(WINDOWS_ARM64)
|
||||
set(FTD3XX_WINDOWS_PATH_SPECIFIER Dynamic)
|
||||
set(FTD3XX_LIB FTD3XXWU.dll)
|
||||
endif()
|
||||
else()
|
||||
set(FTD3XX_WINDOWS_PATH_SPECIFIER Static_Lib)
|
||||
set(FTD3XX_LIB FTD3XX.lib)
|
||||
if(WINDOWS_ARM64)
|
||||
set(FTD3XX_WINDOWS_PATH_SPECIFIER Static)
|
||||
set(FTD3XX_LIB FTD3XXWU.lib)
|
||||
endif()
|
||||
endif()
|
||||
if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
|
||||
if(WINDOWS_ARM64)
|
||||
set(FTD3XX_URL_TIME 2024/06)
|
||||
set(FTD3XX_BUILD_COMMAND ${SETUP_SCRIPTS_DIR}/windows_setup_ftd3xx_winusb.bat)
|
||||
set(FTD3XX_ARCHIVE FTD3XX_WinUSB_Package.zip)
|
||||
set(FTD3XX_PATH_WINDOWS_ARCH ARM64)
|
||||
elseif("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
|
||||
set(FTD3XX_PATH_WINDOWS_ARCH Win32)
|
||||
else ()
|
||||
set(FTD3XX_PATH_WINDOWS_ARCH x64)
|
||||
endif()
|
||||
set(FTD3XX_PRE_WINDOWS_PATH ${FTD3XX_PATH_WINDOWS_ARCH}/${FTD3XX_WINDOWS_PATH_SPECIFIER})
|
||||
if(WINDOWS_ARM64)
|
||||
set(FTD3XX_PRE_WINDOWS_PATH ${FTD3XX_WINDOWS_PATH_SPECIFIER}/${FTD3XX_PATH_WINDOWS_ARCH})
|
||||
endif()
|
||||
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
|
||||
set(FTD3XX_BUILD_COMMAND ${SETUP_SCRIPTS_DIR}/macos_setup_ftd3xx.sh)
|
||||
set(FTD3XX_URL_TIME 2023/03)
|
||||
@ -106,9 +128,13 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||
set(FTD2XX_VOL CDM-v${FTD2XX_VER})
|
||||
set(FTD2XX_ARCHIVE ${FTD2XX_VOL}.zip)
|
||||
set(FTD2XX_SUBFOLDER win)
|
||||
set(FTD2XX_HEADER_PATH ftd2xx.h)
|
||||
if(${WINDOWS_FTD2XX_USE_SHARED_LIB})
|
||||
set(FTD2XX_WINDOWS_PATH_SPECIFIER "")
|
||||
if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
|
||||
if(WINDOWS_ARM64)
|
||||
set(FTD2XX_WINDOWS_PATH_SPECIFIER Release)
|
||||
set(FTD2XX_LIB FTD2XX.dll)
|
||||
elseif("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
|
||||
set(FTD2XX_LIB ftd2xx.dll)
|
||||
else()
|
||||
set(FTD2XX_LIB ftd2xx64.dll)
|
||||
@ -116,12 +142,27 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||
else()
|
||||
set(FTD2XX_WINDOWS_PATH_SPECIFIER Static)
|
||||
set(FTD2XX_LIB ftd2xx.lib)
|
||||
if(WINDOWS_ARM64)
|
||||
set(FTD2XX_WINDOWS_PATH_SPECIFIER Release)
|
||||
set(FTD2XX_LIB FTD2XXstatic.lib)
|
||||
endif()
|
||||
endif()
|
||||
if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
|
||||
if(WINDOWS_ARM64)
|
||||
set(FTD2XX_URL_TIME 2022/02)
|
||||
set(FTD2XX_VER 2.12.36.4-for-ARM64-Signed-Distributable)
|
||||
set(FTD2XX_VOL CDM-v${FTD2XX_VER})
|
||||
set(FTD2XX_ARCHIVE ${FTD2XX_VOL}.zip)
|
||||
set(FTD2XX_PATH_WINDOWS_ARCH ARM64)
|
||||
set(FTD2XX_HEADER_PATH x86/FTD2XX.H)
|
||||
elseif("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
|
||||
set(FTD2XX_PATH_WINDOWS_ARCH i386)
|
||||
else ()
|
||||
set(FTD2XX_PATH_WINDOWS_ARCH amd64)
|
||||
endif()
|
||||
set(FTD2XX_PRE_WINDOWS_PATH ${FTD2XX_WINDOWS_PATH_SPECIFIER}/${FTD2XX_PATH_WINDOWS_ARCH})
|
||||
if(WINDOWS_ARM64)
|
||||
set(FTD2XX_PRE_WINDOWS_PATH ${FTD2XX_PATH_WINDOWS_ARCH}/${FTD2XX_WINDOWS_PATH_SPECIFIER})
|
||||
endif()
|
||||
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
|
||||
set(FTD2XX_BUILD_COMMAND ${SETUP_SCRIPTS_DIR}/macos_setup_ftd2xx.sh)
|
||||
set(FTD2XX_URL_TIME 2024/04)
|
||||
@ -210,7 +251,7 @@ elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||
ExternalProject_Add(FTD3XX_BUILD_PROJECT
|
||||
SOURCE_DIR ${ftd3xx_SOURCE_DIR}
|
||||
BINARY_DIR ${ftd3xx_BINARY_DIR}
|
||||
BUILD_COMMAND ${FTD3XX_BUILD_COMMAND} ${ftd3xx_SOURCE_DIR} ${ftd3xx_BINARY_DIR}/${FTD3XX_SUBFOLDER} ${FTD3XX_PATH_WINDOWS_ARCH}/${FTD3XX_WINDOWS_PATH_SPECIFIER}/${FTD3XX_LIB}
|
||||
BUILD_COMMAND ${FTD3XX_BUILD_COMMAND} ${ftd3xx_SOURCE_DIR} ${ftd3xx_BINARY_DIR}/${FTD3XX_SUBFOLDER} ${FTD3XX_PRE_WINDOWS_PATH}/${FTD3XX_LIB}
|
||||
UPDATE_COMMAND ""
|
||||
CONFIGURE_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
@ -218,7 +259,7 @@ ExternalProject_Add(FTD3XX_BUILD_PROJECT
|
||||
ExternalProject_Add(FTD2XX_BUILD_PROJECT
|
||||
SOURCE_DIR ${ftd2xx_SOURCE_DIR}
|
||||
BINARY_DIR ${ftd2xx_BINARY_DIR}
|
||||
BUILD_COMMAND ${FTD2XX_BUILD_COMMAND} ${ftd2xx_SOURCE_DIR} ${ftd2xx_BINARY_DIR}/${FTD2XX_SUBFOLDER} ${FTD2XX_WINDOWS_PATH_SPECIFIER}/${FTD2XX_PATH_WINDOWS_ARCH}/${FTD2XX_LIB}
|
||||
BUILD_COMMAND ${FTD2XX_BUILD_COMMAND} ${ftd2xx_SOURCE_DIR} ${ftd2xx_BINARY_DIR}/${FTD2XX_SUBFOLDER} ${FTD2XX_PRE_WINDOWS_PATH}/${FTD2XX_LIB} ${FTD2XX_HEADER_PATH}
|
||||
UPDATE_COMMAND ""
|
||||
CONFIGURE_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
@ -250,32 +291,42 @@ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||
set(TOOLS_DATA_DIR ${CMAKE_BINARY_DIR}/tools_and_data)
|
||||
file(MAKE_DIRECTORY ${TOOLS_DATA_DIR})
|
||||
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -B ${TOOLS_DATA_DIR} ${CMAKE_SOURCE_DIR}/tools)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} --build ${TOOLS_DATA_DIR})
|
||||
|
||||
set(OUTPUT_NAME cc3dsfs)
|
||||
|
||||
add_executable(CMakeBin2C tools/bin2c.cpp)
|
||||
add_executable(${OUTPUT_NAME} source/cc3dsfs.cpp source/utils.cpp source/audio_data.cpp source/audio.cpp source/frontend.cpp source/TextRectangle.cpp source/WindowScreen.cpp source/WindowScreen_Menu.cpp source/3dscapture_ftd3.cpp source/dscapture_ftd2.cpp source/usb_ds_3ds_capture.cpp source/devicecapture.cpp source/conversions.cpp source/ExtraButtons.cpp source/Menus/ConnectionMenu.cpp source/Menus/OptionSelectionMenu.cpp source/Menus/MainMenu.cpp source/Menus/VideoMenu.cpp source/Menus/CropMenu.cpp source/Menus/PARMenu.cpp source/Menus/RotationMenu.cpp source/Menus/OffsetMenu.cpp source/Menus/AudioMenu.cpp source/Menus/BFIMenu.cpp source/Menus/RelativePositionMenu.cpp source/Menus/ResolutionMenu.cpp source/Menus/FileConfigMenu.cpp source/Menus/ExtraSettingsMenu.cpp source/Menus/StatusMenu.cpp source/Menus/LicenseMenu.cpp source/WindowCommands.cpp source/Menus/ShortcutMenu.cpp source/Menus/ActionSelectionMenu.cpp source/Menus/ScalingRatioMenu.cpp ${TOOLS_DATA_DIR}/font_ttf.cpp)
|
||||
add_dependencies(${OUTPUT_NAME} FTD3XX_BUILD_PROJECT FTD2XX_BUILD_PROJECT CMakeBin2C)
|
||||
add_dependencies(${OUTPUT_NAME} FTD3XX_BUILD_PROJECT FTD2XX_BUILD_PROJECT)
|
||||
target_link_libraries(${OUTPUT_NAME} PRIVATE sfml-graphics sfml-audio sfml-window sfml-system usb-1.0 ${ftd3xx_BINARY_DIR}/${FTD3XX_SUBFOLDER}/${FTD3XX_LIB} ${ftd2xx_BINARY_DIR}/${FTD2XX_SUBFOLDER}/${FTD2XX_LIB} ${EXTRA_LIBRARIES})
|
||||
target_link_directories(${OUTPUT_NAME} PRIVATE ${ftd3xx_BINARY_DIR}/${FTD3XX_SUBFOLDER} ${ftd2xx_BINARY_DIR}/${FTD2XX_SUBFOLDER})
|
||||
target_include_directories(${OUTPUT_NAME} PRIVATE ${ftd3xx_BINARY_DIR}/${FTD3XX_SUBFOLDER} ${ftd2xx_BINARY_DIR}/${FTD2XX_SUBFOLDER} ${TOOLS_DATA_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/include/Menus)
|
||||
target_compile_features(${OUTPUT_NAME} PRIVATE cxx_std_20)
|
||||
target_compile_options(${OUTPUT_NAME} PRIVATE ${EXTRA_CXX_FLAGS})
|
||||
target_compile_features(CMakeBin2C PRIVATE cxx_std_17)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${TOOLS_DATA_DIR}/font_ttf.cpp
|
||||
COMMENT "Convert font to binary"
|
||||
COMMAND $<TARGET_FILE:CMakeBin2C> ${CMAKE_SOURCE_DIR}/data/font.ttf ${TOOLS_DATA_DIR} font_ttf font_ttf
|
||||
DEPENDS ${CMAKE_SOURCE_DIR}/data/font.ttf CMakeBin2C
|
||||
COMMAND ${TOOLS_DATA_DIR}/CMakeBin2C${FINAL_EXTENSION} ${CMAKE_SOURCE_DIR}/data/font.ttf ${TOOLS_DATA_DIR} font_ttf font_ttf
|
||||
DEPENDS ${CMAKE_SOURCE_DIR}/data/font.ttf ${TOOLS_DATA_DIR}/CMakeBin2C${FINAL_EXTENSION}
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
add_custom_command(
|
||||
TARGET ${OUTPUT_NAME}
|
||||
COMMENT "Copy OpenAL DLL"
|
||||
PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${sfml_SOURCE_DIR}/extlibs/bin/$<IF:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>,x64,x86>/openal32.dll ${CMAKE_SOURCE_DIR}
|
||||
VERBATIM
|
||||
)
|
||||
if(WINDOWS_ARM64)
|
||||
add_custom_command(
|
||||
TARGET ${OUTPUT_NAME}
|
||||
COMMENT "Copy OpenAL DLL"
|
||||
PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${sfml_SOURCE_DIR}/extlibs/bin/ARM64/openal32.dll ${CMAKE_SOURCE_DIR}
|
||||
VERBATIM
|
||||
)
|
||||
else()
|
||||
add_custom_command(
|
||||
TARGET ${OUTPUT_NAME}
|
||||
COMMENT "Copy OpenAL DLL"
|
||||
PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${sfml_SOURCE_DIR}/extlibs/bin/$<IF:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>,x64,x86>/openal32.dll ${CMAKE_SOURCE_DIR}
|
||||
VERBATIM
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_custom_command(
|
||||
@ -331,7 +382,9 @@ set(CPACK_VERBATIM_VARIABLES TRUE)
|
||||
if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
|
||||
set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}_macos)
|
||||
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||
if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64")
|
||||
if(WINDOWS_ARM64)
|
||||
set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}_windows_arm64)
|
||||
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64")
|
||||
set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}_windows_x86_64)
|
||||
else()
|
||||
set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}_windows_${CMAKE_SYSTEM_PROCESSOR})
|
||||
|
@ -16,6 +16,7 @@
|
||||
#define FIX_PARTIAL_FIRST_FRAME_NUM 3
|
||||
|
||||
#define EXTRA_DATA_BUFFER_USB_SIZE (1 << 9)
|
||||
#define EXTRA_DATA_BUFFER_FTD3XX_SIZE (1 << 10)
|
||||
|
||||
enum CaptureConnectionType { CAPTURE_CONN_FTD3, CAPTURE_CONN_USB, CAPTURE_CONN_FTD2 };
|
||||
|
||||
@ -46,11 +47,13 @@ struct PACKED USBOldDSVideoInputData {
|
||||
struct PACKED FTD3_3DSCaptureReceived {
|
||||
RGB83DSVideoInputData video_in;
|
||||
uint16_t audio_data[N3DSXL_SAMPLES_IN];
|
||||
uint8_t unused_buffer[EXTRA_DATA_BUFFER_FTD3XX_SIZE];
|
||||
};
|
||||
|
||||
struct PACKED FTD3_3DSCaptureReceived_3D {
|
||||
RGB83DSVideoInputData_3D video_in;
|
||||
uint16_t audio_data[N3DSXL_SAMPLES_IN];
|
||||
uint8_t unused_buffer[EXTRA_DATA_BUFFER_FTD3XX_SIZE];
|
||||
};
|
||||
|
||||
struct PACKED USB3DSCaptureReceived {
|
||||
|
@ -1,8 +1,10 @@
|
||||
set "a=%~1"
|
||||
set "b=%~2"
|
||||
set "c=%~3"
|
||||
set "d=%~4"
|
||||
set "a=%a:/=\%"
|
||||
set "b=%b:/=\%"
|
||||
set "c=%c:/=\%"
|
||||
set "d=%d:/=\%"
|
||||
copy %a%\%c% %b%\
|
||||
copy %a%\ftd2xx.h %b%\
|
||||
copy %a%\%d% %b%\ftd2xx.h
|
||||
|
@ -5,4 +5,4 @@ set "a=%a:/=\%"
|
||||
set "b=%b:/=\%"
|
||||
set "c=%c:/=\%"
|
||||
copy %a%\%c% %b%\
|
||||
copy %a%\FTD3XX.h %b%\
|
||||
copy %a%\FTD3XX.h %b%\ftd3xx.h
|
||||
|
9
setup_scripts/windows_setup_ftd3xx_winusb.bat
Normal file
9
setup_scripts/windows_setup_ftd3xx_winusb.bat
Normal file
@ -0,0 +1,9 @@
|
||||
set "a=%~1"
|
||||
set "b=%~2"
|
||||
set "c=%~3"
|
||||
set "a=%a:/=\%"
|
||||
set "b=%b:/=\%"
|
||||
set "c=%c:/=\%"
|
||||
unzip %a%\WU_FTD3XXLib.zip -d %a%
|
||||
copy %a%\WU_FTD3XXLib\Lib\%c% %b%\
|
||||
copy %a%\WU_FTD3XXLib\Lib\FTD3XX.h %b%\ftd3xx.h
|
@ -1,14 +1,13 @@
|
||||
#include "3dscapture_ftd3.hpp"
|
||||
#include "devicecapture.hpp"
|
||||
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
#ifdef _WIN32
|
||||
#define FTD3XX_STATIC
|
||||
#include <FTD3XX.h>
|
||||
#define FT_ASYNC_CALL FT_ReadPipeEx
|
||||
#else
|
||||
#include <ftd3xx.h>
|
||||
#define FT_ASYNC_CALL FT_ReadPipeAsync
|
||||
#endif
|
||||
#include <ftd3xx.h>
|
||||
|
||||
#include <cstring>
|
||||
#include <thread>
|
||||
@ -18,7 +17,7 @@
|
||||
#define BULK_OUT 0x02
|
||||
#define BULK_IN 0x82
|
||||
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
#ifdef _WIN32
|
||||
#define FIFO_CHANNEL 0x82
|
||||
#else
|
||||
#define FIFO_CHANNEL 0
|
||||
@ -28,15 +27,21 @@
|
||||
#define SERIAL_NUMBER_SIZE (REAL_SERIAL_NUMBER_SIZE+1)
|
||||
|
||||
static bool get_is_bad_ftd3xx();
|
||||
static bool get_skip_initial_pipe_abort();
|
||||
|
||||
static OVERLAPPED overlap[NUM_CONCURRENT_DATA_BUFFERS];
|
||||
static bool is_bad_ftd3xx = get_is_bad_ftd3xx();
|
||||
static bool skip_initial_pipe_abort = get_skip_initial_pipe_abort();
|
||||
static ULONG read_buffers[NUM_CONCURRENT_DATA_BUFFERS];
|
||||
|
||||
static bool get_is_bad_ftd3xx() {
|
||||
#if (defined(_WIN32) || defined(_WIN64))
|
||||
#ifdef _WIN32
|
||||
#ifdef _M_ARM64
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
bool is_bad_ftd3xx = false;
|
||||
DWORD ftd3xx_lib_version;
|
||||
@ -44,12 +49,29 @@ static bool get_is_bad_ftd3xx() {
|
||||
if(FT_FAILED(FT_GetLibraryVersion(&ftd3xx_lib_version))) {
|
||||
ftd3xx_lib_version = 0;
|
||||
}
|
||||
if(ftd3xx_lib_version == 0x0100001A) {
|
||||
if(ftd3xx_lib_version >= 0x0100001A) {
|
||||
is_bad_ftd3xx = true;
|
||||
}
|
||||
return is_bad_ftd3xx;
|
||||
}
|
||||
|
||||
static bool get_skip_initial_pipe_abort() {
|
||||
#ifdef _WIN32
|
||||
return false;
|
||||
#endif
|
||||
|
||||
bool skip_initial_pipe_abort = false;
|
||||
DWORD ftd3xx_lib_version;
|
||||
|
||||
if(FT_FAILED(FT_GetLibraryVersion(&ftd3xx_lib_version))) {
|
||||
ftd3xx_lib_version = 0;
|
||||
}
|
||||
if(ftd3xx_lib_version >= 0x0100001A) {
|
||||
skip_initial_pipe_abort = true;
|
||||
}
|
||||
return skip_initial_pipe_abort;
|
||||
}
|
||||
|
||||
void list_devices_ftd3(std::vector<CaptureDevice> &devices_list) {
|
||||
FT_STATUS ftStatus;
|
||||
DWORD numDevs = 0;
|
||||
@ -90,8 +112,8 @@ uint64_t ftd3_get_video_in_size(CaptureData* capture_data) {
|
||||
|
||||
static uint64_t get_capture_size(CaptureData* capture_data) {
|
||||
if(!capture_data->status.enabled_3d)
|
||||
return sizeof(FTD3_3DSCaptureReceived);
|
||||
return sizeof(FTD3_3DSCaptureReceived_3D);
|
||||
return sizeof(FTD3_3DSCaptureReceived) & (~(EXTRA_DATA_BUFFER_FTD3XX_SIZE - 1));
|
||||
return sizeof(FTD3_3DSCaptureReceived_3D) & (~(EXTRA_DATA_BUFFER_FTD3XX_SIZE - 1));
|
||||
}
|
||||
|
||||
static void preemptive_close_connection(CaptureData* capture_data) {
|
||||
@ -132,7 +154,7 @@ bool connect_ftd3(bool print_failed, CaptureData* capture_data, CaptureDevice* d
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!get_is_bad_ftd3xx()) {
|
||||
if(!skip_initial_pipe_abort) {
|
||||
if(FT_AbortPipe(capture_data->handle, BULK_IN)) {
|
||||
capture_error_print(print_failed, capture_data, "Abort failed");
|
||||
preemptive_close_connection(capture_data);
|
||||
@ -149,6 +171,23 @@ bool connect_ftd3(bool print_failed, CaptureData* capture_data, CaptureDevice* d
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline void data_output_update(CaptureData* capture_data, int &inner_curr_in, std::chrono::time_point<std::chrono::high_resolution_clock> &base_time, bool inc_inner_curr_in) {
|
||||
const auto curr_time = std::chrono::high_resolution_clock::now();
|
||||
const std::chrono::duration<double> diff = curr_time - base_time;
|
||||
base_time = curr_time;
|
||||
capture_data->time_in_buf[inner_curr_in] = diff.count();
|
||||
capture_data->read[inner_curr_in] = read_buffers[inner_curr_in];
|
||||
|
||||
if(capture_data->status.cooldown_curr_in)
|
||||
capture_data->status.cooldown_curr_in = capture_data->status.cooldown_curr_in - 1;
|
||||
capture_data->status.curr_in = (inner_curr_in + 1) % NUM_CONCURRENT_DATA_BUFFERS;
|
||||
if(inc_inner_curr_in)
|
||||
inner_curr_in = (inner_curr_in + 1) % NUM_CONCURRENT_DATA_BUFFERS;
|
||||
// Signal that there is data available
|
||||
capture_data->status.video_wait.unlock();
|
||||
capture_data->status.audio_wait.unlock();
|
||||
}
|
||||
|
||||
static void fast_capture_call(CaptureData* capture_data, OVERLAPPED overlap[NUM_CONCURRENT_DATA_BUFFERS]) {
|
||||
int inner_curr_in = 0;
|
||||
FT_STATUS ftStatus;
|
||||
@ -187,61 +226,38 @@ static void fast_capture_call(CaptureData* capture_data, OVERLAPPED overlap[NUM_
|
||||
capture_error_print(true, capture_data, "Disconnected: USB error");
|
||||
return;
|
||||
}
|
||||
const auto curr_time = std::chrono::high_resolution_clock::now();
|
||||
const std::chrono::duration<double> diff = curr_time - clock_start;
|
||||
capture_data->time_in_buf[inner_curr_in] = diff.count();
|
||||
capture_data->read[inner_curr_in] = read_buffers[inner_curr_in];
|
||||
clock_start = curr_time;
|
||||
|
||||
if(capture_data->status.cooldown_curr_in)
|
||||
capture_data->status.cooldown_curr_in = capture_data->status.cooldown_curr_in - 1;
|
||||
capture_data->status.curr_in = (inner_curr_in + 1) % NUM_CONCURRENT_DATA_BUFFERS;
|
||||
// Signal that there is data available
|
||||
capture_data->status.video_wait.unlock();
|
||||
capture_data->status.audio_wait.unlock();
|
||||
data_output_update(capture_data, inner_curr_in, clock_start, false);
|
||||
}
|
||||
}
|
||||
|
||||
#if !(defined(_WIN32) || defined(_WIN64))
|
||||
static bool safe_capture_call(CaptureData* capture_data) {
|
||||
int inner_curr_in = 0;
|
||||
auto clock_start = std::chrono::high_resolution_clock::now();
|
||||
|
||||
while(capture_data->status.connected && capture_data->status.running) {
|
||||
|
||||
auto clock_start = std::chrono::high_resolution_clock::now();
|
||||
|
||||
#ifdef _WIN32
|
||||
FT_STATUS ftStatus = FT_ReadPipeEx(capture_data->handle, FIFO_CHANNEL, (UCHAR*)&capture_data->capture_buf[inner_curr_in], get_capture_size(capture_data), &read_buffers[inner_curr_in], NULL);
|
||||
#else
|
||||
FT_STATUS ftStatus = FT_ReadPipeEx(capture_data->handle, FIFO_CHANNEL, (UCHAR*)&capture_data->capture_buf[inner_curr_in], get_capture_size(capture_data), &read_buffers[inner_curr_in], 1000);
|
||||
#endif
|
||||
if(FT_FAILED(ftStatus)) {
|
||||
capture_error_print(true, capture_data, "Disconnected: Read failed");
|
||||
return true;
|
||||
}
|
||||
|
||||
const auto curr_time = std::chrono::high_resolution_clock::now();
|
||||
const std::chrono::duration<double> diff = curr_time - clock_start;
|
||||
capture_data->time_in_buf[inner_curr_in] = diff.count();
|
||||
capture_data->read[inner_curr_in] = read_buffers[inner_curr_in];
|
||||
|
||||
inner_curr_in = (inner_curr_in + 1) % NUM_CONCURRENT_DATA_BUFFERS;
|
||||
if(capture_data->status.cooldown_curr_in)
|
||||
capture_data->status.cooldown_curr_in = capture_data->status.cooldown_curr_in - 1;
|
||||
capture_data->status.curr_in = inner_curr_in;
|
||||
capture_data->status.video_wait.unlock();
|
||||
capture_data->status.audio_wait.unlock();
|
||||
data_output_update(capture_data, inner_curr_in, clock_start, true);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
void ftd3_capture_main_loop(CaptureData* capture_data) {
|
||||
#if !(defined(_WIN32) || defined(_WIN64))
|
||||
if(!is_bad_ftd3xx)
|
||||
fast_capture_call(capture_data, overlap);
|
||||
else
|
||||
safe_capture_call(capture_data);
|
||||
#else
|
||||
fast_capture_call(capture_data, overlap);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ftd3_capture_cleanup(CaptureData* capture_data) {
|
||||
|
@ -455,7 +455,10 @@ void WindowScreen::post_texture_conversion_processing(out_rect_data &rect_data,
|
||||
sf::Shader* chosen_shader = this->in_top_shader;
|
||||
if(!is_top)
|
||||
chosen_shader = this->in_bot_shader;
|
||||
rect_data.out_tex.draw(in_rect, chosen_shader);
|
||||
if(sf::Shader::isAvailable())
|
||||
rect_data.out_tex.draw(in_rect, chosen_shader);
|
||||
else
|
||||
rect_data.out_tex.draw(in_rect);
|
||||
//Place postprocessing effects here
|
||||
}
|
||||
}
|
||||
@ -476,10 +479,18 @@ void WindowScreen::display_data_to_window(bool actually_draw, bool is_debug) {
|
||||
this->m_win.clear();
|
||||
this->window_bg_processing();
|
||||
if(this->loaded_menu != CONNECT_MENU_TYPE) {
|
||||
if(this->m_stype != ScreenType::BOTTOM)
|
||||
this->m_win.draw(this->m_out_rect_top.out_rect, this->top_shader);
|
||||
if(this->m_stype != ScreenType::TOP)
|
||||
this->m_win.draw(this->m_out_rect_bot.out_rect, this->bot_shader);
|
||||
if (this->m_stype != ScreenType::BOTTOM) {
|
||||
if (sf::Shader::isAvailable())
|
||||
this->m_win.draw(this->m_out_rect_top.out_rect, this->top_shader);
|
||||
else
|
||||
this->m_win.draw(this->m_out_rect_top.out_rect);
|
||||
}
|
||||
if (this->m_stype != ScreenType::TOP) {
|
||||
if (sf::Shader::isAvailable())
|
||||
this->m_win.draw(this->m_out_rect_bot.out_rect, this->bot_shader);
|
||||
else
|
||||
this->m_win.draw(this->m_out_rect_bot.out_rect);
|
||||
}
|
||||
}
|
||||
this->execute_menu_draws();
|
||||
this->notification->draw(this->m_win);
|
||||
|
12
tools/CMakeLists.txt
Normal file
12
tools/CMakeLists.txt
Normal file
@ -0,0 +1,12 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(CMakeBin2C VERSION 1.0.0 LANGUAGES CXX)
|
||||
|
||||
add_executable(CMakeBin2C bin2c.cpp)
|
||||
target_compile_features(CMakeBin2C PRIVATE cxx_std_17)
|
||||
|
||||
add_custom_command(
|
||||
TARGET CMakeBin2C
|
||||
COMMENT "Copy Output"
|
||||
POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:CMakeBin2C> ${CMAKE_BINARY_DIR}
|
||||
VERBATIM
|
||||
)
|
Loading…
Reference in New Issue
Block a user