Add CLI option to automatically disable conflicting ccs

This commit is contained in:
Lorenzooone 2025-11-21 02:04:13 +01:00
parent 39a6205f91
commit 33c85c04e0
4 changed files with 34 additions and 16 deletions

View File

@ -19,7 +19,7 @@ struct no_access_recap_data {
void capture_init();
void capture_close();
bool connect(bool print_failed, CaptureData* capture_data, FrontendData* frontend_data, bool auto_connect_to_first = false);
bool connect(bool print_failed, CaptureData* capture_data, FrontendData* frontend_data, bool* force_cc_disables, bool auto_connect_to_first = false);
void captureCall(CaptureData* capture_data);
void capture_error_print(bool print_failed, CaptureData* capture_data, std::string error_string);
void capture_error_print(bool print_failed, CaptureData* capture_data, std::string graphical_string, std::string detailed_string);

View File

@ -15,9 +15,10 @@ PROGRAM_NAME=cc3dsfs
BASE_SOURCE_DIR="."
BASE_TARGET_DIR=/boot${FIRMWARE}/${PROGRAM_NAME}
# cage provided as an alternative to startx.
# gldriver-test needed for Raspberry Pi 5... Weirdly enough?!
sudo apt update
sudo apt -y install xterm xserver-xorg xinit libxcursor1 x11-xserver-utils pipewire pipewire-alsa libharfbuzz-icu0 lsb-release cage
sudo apt -y install xterm xserver-xorg xinit libxcursor1 x11-xserver-utils pipewire pipewire-alsa libharfbuzz-icu0 lsb-release cage gldriver-test
if [ $? -ne 0 ]; then
echo "Error while installing required packages! Exiting early!"
exit 1

View File

@ -39,6 +39,8 @@ struct override_all_data {
bool always_prevent_mouse_showing = false;
bool auto_connect_to_first = false;
bool auto_close = false;
bool force_disable_nisetro_ds = false;
bool force_disable_optimize_old_3ds = false;
bool auto_save = true;
int loaded_profile = STARTUP_FILE_INDEX;
bool mono_app = false;
@ -552,6 +554,13 @@ static float get_time_multiplier(CaptureData* capture_data, bool should_ignore_d
}
}
static void populate_force_disable_ccs(bool* force_cc_disables, override_all_data &override_data) {
for(size_t i = 0; i < CC_POSSIBLE_DEVICES_END; i++)
force_cc_disables[i] = false;
force_cc_disables[CC_NISETRO_DS] = override_data.force_disable_nisetro_ds;
force_cc_disables[CC_OPTIMIZE_O3DS] = override_data.force_disable_optimize_old_3ds;
}
static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data, override_all_data &override_data, volatile bool* can_do_output) {
VideoOutputData *out_buf;
double last_frame_time = 0.0;
@ -569,7 +578,9 @@ static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data,
int ret_val = 0;
int poll_timeout = 0;
const bool endianness = is_big_endian();
bool force_cc_disables[CC_POSSIBLE_DEVICES_END];
populate_force_disable_ccs(force_cc_disables, override_data);
out_buf = new VideoOutputData;
memset(out_buf, 0, sizeof(VideoOutputData));
@ -602,7 +613,7 @@ static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data,
std::thread bot_thread(screen_display_thread, bot_screen);
std::thread joint_thread(screen_display_thread, joint_screen);
capture_data->status.connected = connect(true, capture_data, &frontend_data, override_data.auto_connect_to_first);
capture_data->status.connected = connect(true, capture_data, &frontend_data, force_cc_disables, override_data.auto_connect_to_first);
if((override_data.quit_on_first_connection_failure || override_data.auto_close) && (!capture_data->status.connected)) {
capture_data->status.running = false;
ret_val = -3;
@ -706,7 +717,7 @@ static int mainVideoOutputCall(AudioData* audio_data, CaptureData* capture_data,
}
if(top_screen->open_capture() || bot_screen->open_capture() || joint_screen->open_capture()) {
capture_data->status.connected = connect(true, capture_data, &frontend_data);
capture_data->status.connected = connect(true, capture_data, &frontend_data, force_cc_disables);
SuccessConnectionOutTextGenerator(out_text_data, capture_data);
}
@ -889,13 +900,13 @@ int main(int argc, char **argv) {
continue;
if(parse_int_arg(i, argc, argv, override_data.override_top_data.enabled, "--enabled_top"))
continue;
if(parse_int_arg(i, argc, argv, override_data.override_bot_data.pos_x, "--pos_x_bot"))
if(parse_int_arg(i, argc, argv, override_data.override_bot_data.pos_x, "--pos_x_low"))
continue;
if(parse_int_arg(i, argc, argv, override_data.override_bot_data.pos_y, "--pos_y_bot"))
if(parse_int_arg(i, argc, argv, override_data.override_bot_data.pos_y, "--pos_y_low"))
continue;
if(parse_double_arg(i, argc, argv, override_data.override_bot_data.scaling, "--scaling_bot"))
if(parse_double_arg(i, argc, argv, override_data.override_bot_data.scaling, "--scaling_low"))
continue;
if(parse_int_arg(i, argc, argv, override_data.override_bot_data.enabled, "--enabled_bot"))
if(parse_int_arg(i, argc, argv, override_data.override_bot_data.enabled, "--enabled_low"))
continue;
if(parse_int_arg(i, argc, argv, override_data.volume, "--volume"))
continue;
@ -909,6 +920,10 @@ int main(int argc, char **argv) {
continue;
if(parse_existence_arg(i, argv, override_data.quit_on_first_connection_failure, true, "--failure_close"))
continue;
if(parse_existence_arg(i, argv, override_data.force_disable_nisetro_ds, true, "--no_nisetro"))
continue;
if(parse_existence_arg(i, argv, override_data.force_disable_optimize_old_3ds, true, "--no_opt_o3ds_cc"))
continue;
if(parse_int_arg(i, argc, argv, override_data.loaded_profile, "--profile"))
continue;
if(parse_existence_arg(i, argv, override_data.auto_save, false, "--no_auto_save"))
@ -949,10 +964,10 @@ int main(int argc, char **argv) {
ActualConsoleOutText(" --scaling_top Overrides the top screen window's scale factor.");
ActualConsoleOutText(" --enabled_top Overrides the presence of the top screen's window.");
ActualConsoleOutText(" 1 On, 0 Off.");
ActualConsoleOutText(" --pos_x_bot Set default x position for the bottom screen's window.");
ActualConsoleOutText(" --pos_y_bot Set default y position for the bottom screen's window.");
ActualConsoleOutText(" --scaling_bot Overrides the bottom screen window's scale factor.");
ActualConsoleOutText(" --enabled_bot Overrides the presence of the bottom screen's window.");
ActualConsoleOutText(" --pos_x_low Set default x position for the bottom screen's window.");
ActualConsoleOutText(" --pos_y_low Set default y position for the bottom screen's window.");
ActualConsoleOutText(" --scaling_low Overrides the bottom screen window's scale factor.");
ActualConsoleOutText(" --enabled_low Overrides the presence of the bottom screen's window.");
ActualConsoleOutText(" 1 On, 0 Off.");
ActualConsoleOutText(" --no_frame_blend Disables support for frame blending shader.");
ActualConsoleOutText(" May improve compatibility with lower end hardware.");
@ -964,6 +979,8 @@ int main(int argc, char **argv) {
ActualConsoleOutText(" --failure_close Automatically closes the software if the first connection");
ActualConsoleOutText(" doesn't succeed.");
ActualConsoleOutText(" --auto_close Automatically closes the software on disconnect.");
ActualConsoleOutText(" --no_nisetro Force disables Nisetro DS(i) Capture Card.");
ActualConsoleOutText(" --no_opt_o3ds_cc Force disables Optimize Old 3DS Capture Card.");
ActualConsoleOutText(" --profile Loads the profile with the specified ID at startup");
ActualConsoleOutText(" instead of the default one. When the program closes,");
ActualConsoleOutText(" the data is also saved to the specified profile.");

View File

@ -80,7 +80,7 @@ void capture_warning_print(CaptureData* capture_data, std::string warning_string
capture_warning_print(capture_data, warning_string, warning_string);
}
bool connect(bool print_failed, CaptureData* capture_data, FrontendData* frontend_data, bool auto_connect_to_first) {
bool connect(bool print_failed, CaptureData* capture_data, FrontendData* frontend_data, bool* force_cc_disables, bool auto_connect_to_first) {
capture_data->status.new_error_text = false;
if (capture_data->status.connected) {
capture_data->status.close_success = false;
@ -97,8 +97,8 @@ bool connect(bool print_failed, CaptureData* capture_data, FrontendData* fronten
std::vector<CaptureDevice> devices_list;
std::vector<no_access_recap_data> no_access_list;
bool devices_allowed_scan[CC_POSSIBLE_DEVICES_END];
for(int i = 0; i < CC_POSSIBLE_DEVICES_END; i++)
devices_allowed_scan[i] = capture_data->status.devices_allowed_scan[i];
for(size_t i = 0; i < CC_POSSIBLE_DEVICES_END; i++)
devices_allowed_scan[i] = capture_data->status.devices_allowed_scan[i] & (!force_cc_disables[i]);
#ifdef USE_CYNI_USB
list_devices_cyni_device(devices_list, no_access_list, devices_allowed_scan);