diff --git a/.github/workflows/cd_main.yml b/.github/workflows/cd_main.yml index 16e4f3a..9f5aca6 100644 --- a/.github/workflows/cd_main.yml +++ b/.github/workflows/cd_main.yml @@ -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 diff --git a/.github/workflows/cd_pr.yml b/.github/workflows/cd_pr.yml index f5c4aff..fe175c4 100644 --- a/.github/workflows/cd_pr.yml +++ b/.github/workflows/cd_pr.yml @@ -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 diff --git a/CMakeLists.txt b/CMakeLists.txt index 00221c6..cb7a84d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 $ ${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/$,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/$,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}) diff --git a/include/capture_structs.hpp b/include/capture_structs.hpp index e831aa0..1c2988d 100755 --- a/include/capture_structs.hpp +++ b/include/capture_structs.hpp @@ -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 { diff --git a/setup_scripts/windows_setup_ftd2xx.bat b/setup_scripts/windows_setup_ftd2xx.bat index f0ac219..e4c9387 100755 --- a/setup_scripts/windows_setup_ftd2xx.bat +++ b/setup_scripts/windows_setup_ftd2xx.bat @@ -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 diff --git a/setup_scripts/windows_setup_ftd3xx.bat b/setup_scripts/windows_setup_ftd3xx.bat index 4da41ac..2819f3c 100755 --- a/setup_scripts/windows_setup_ftd3xx.bat +++ b/setup_scripts/windows_setup_ftd3xx.bat @@ -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 diff --git a/setup_scripts/windows_setup_ftd3xx_winusb.bat b/setup_scripts/windows_setup_ftd3xx_winusb.bat new file mode 100644 index 0000000..c9c90aa --- /dev/null +++ b/setup_scripts/windows_setup_ftd3xx_winusb.bat @@ -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 diff --git a/source/3dscapture_ftd3.cpp b/source/3dscapture_ftd3.cpp index 6776e93..00a285b 100755 --- a/source/3dscapture_ftd3.cpp +++ b/source/3dscapture_ftd3.cpp @@ -1,14 +1,13 @@ #include "3dscapture_ftd3.hpp" #include "devicecapture.hpp" -#if defined(_WIN32) || defined(_WIN64) +#ifdef _WIN32 #define FTD3XX_STATIC -#include #define FT_ASYNC_CALL FT_ReadPipeEx #else -#include #define FT_ASYNC_CALL FT_ReadPipeAsync #endif +#include #include #include @@ -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 &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 &base_time, bool inc_inner_curr_in) { + const auto curr_time = std::chrono::high_resolution_clock::now(); + const std::chrono::duration 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 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 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) { diff --git a/source/WindowScreen.cpp b/source/WindowScreen.cpp index ba08a7c..7443827 100755 --- a/source/WindowScreen.cpp +++ b/source/WindowScreen.cpp @@ -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); diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 0000000..2db2235 --- /dev/null +++ b/tools/CMakeLists.txt @@ -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 $ ${CMAKE_BINARY_DIR} + VERBATIM +)