{"results":{"result":{"added-files":{"code-health":0.0,"old-code-health":0.0,"files":[]},"external-review-url":"https://github.com/hathach/tinyusb/pull/3322","old-code-health":5.096016990240983,"modified-files":{"code-health":5.11979363004293,"old-code-health":5.096016990240983,"files":[{"file":"src/class/video/video_device.c","loc":1090,"old-loc":1079,"code-health":4.055227268985362,"old-code-health":4.055227268985362},{"file":"examples/device/video_capture/src/main.c","loc":254,"old-loc":229,"code-health":9.6882083290695,"old-code-health":10.0}]},"removed-files":{"code-health":0.0,"old-code-health":0.0,"files":[]},"external-review-id":"3322","analysis-time":"2025-10-30T13:18:23Z","negative-impact-count":1,"suppressions":{"number-of-types":0,"number-of-files-touched":0,"findings":[]},"affected-hotspots":0,"commits":["032de0b0df92162aa579eda986145e3756a29a6c","b8cea4ad766ea40de88fdaa28c19e69f5bc25f9d"],"is-negative-review":true,"negative-findings":{"number-of-types":1,"number-of-files-touched":1,"findings":[{"method":"tud_video_prepare_payload_cb","why-it-occurs":"Functions with many arguments indicate either a) low cohesion where the function has too many responsibilities, or b) a missing abstraction that encapsulates those arguments.\n\nThe threshold for the C language is 4 function arguments.","name":"Excess Number of Function Arguments","file":"examples/device/video_capture/src/main.c","refactoring-examples":[{"architectural-component-id":null,"author-name":"hathach","training-data":{"loc-added":"8","loc-deleted":"4","delta-cc-mean":"0.0","delta-cc-total":"0","delta-penalties":"1.0","delta-n-functions":"0","current-file-score":"10.0"},"author-email":"thach@tinyusb.org","commit-full-message":"tested working with sam d21 and d51, not tested with nrf52, seem not\nworking with esp32","commit-date":"2023-10-04T11:00:32Z","current-rev":"67e34267a","filename":"tinyusb/hw/bsp/nrf/family.c","previous-rev":"f36e0b7b9","commit-title":"change tuh_max3421_spi_xfer_api() signature","language":"C","id":"b1cda1b09e22f222884e5db330be8e8e696c098f","model-score":0.9,"author-id":null,"project-id":37161,"delta-file-score":0.31179166,"diff":"diff --git a/hw/bsp/nrf/family.c b/hw/bsp/nrf/family.c\nindex 631f53fcd..c431389f3 100644\n--- a/hw/bsp/nrf/family.c\n+++ b/hw/bsp/nrf/family.c\n@@ -97,3 +97,5 @@ TU_ATTR_UNUSED static void power_event_handler(nrfx_power_usb_evt_t event) {\n #if CFG_TUH_ENABLED && defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421\n+\n static void max3421_init(void);\n+\n static nrfx_spim_t _spi = NRFX_SPIM_INSTANCE(1);\n@@ -205,3 +207,3 @@ uint32_t board_button_read(void) {\n \n-int board_uart_read(uint8_t *buf, int len) {\n+int board_uart_read(uint8_t* buf, int len) {\n   (void) buf;\n@@ -212,4 +214,4 @@ int board_uart_read(uint8_t *buf, int len) {\n \n-int board_uart_write(void const *buf, int len) {\n-  return (NRFX_SUCCESS == nrfx_uarte_tx(&_uart_id, (uint8_t const *) buf, (size_t) len)) ? len : 0;\n+int board_uart_write(void const* buf, int len) {\n+  return (NRFX_SUCCESS == nrfx_uarte_tx(&_uart_id, (uint8_t const*) buf, (size_t) len)) ? len : 0;\n }\n@@ -325,2 +327,3 @@ static void max3421_init(void) {\n \n+// API to enable/disable MAX3421 INTR pin interrupt\n void tuh_max3421_int_api(uint8_t rhport, bool enabled) {\n@@ -337,2 +340,3 @@ void tuh_max3421_int_api(uint8_t rhport, bool enabled) {\n \n+// API to control MAX3421 SPI CS\n void tuh_max3421_spi_cs_api(uint8_t rhport, bool active) {\n@@ -342,3 +346,5 @@ void tuh_max3421_spi_cs_api(uint8_t rhport, bool active) {\n \n-bool tuh_max3421_spi_xfer_api(uint8_t rhport, uint8_t const *tx_buf, size_t tx_len, uint8_t *rx_buf, size_t rx_len) {\n+// API to transfer data with MAX3421 SPI\n+// Either tx_buf or rx_buf can be NULL, which means transfer is write or read only\n+bool tuh_max3421_spi_xfer_api(uint8_t rhport, uint8_t const* tx_buf, uint8_t* rx_buf, size_t xfer_bytes) {\n   (void) rhport;\n@@ -347,8 +353,8 @@ bool tuh_max3421_spi_xfer_api(uint8_t rhport, uint8_t const *tx_buf, size_t tx_l\n       .p_tx_buffer = tx_buf,\n-      .tx_length   = tx_len,\n+      .tx_length   = tx_buf ? xfer_bytes : 0,\n       .p_rx_buffer = rx_buf,\n-      .rx_length   = rx_len,\n+      .rx_length   = rx_buf ? xfer_bytes : 0,\n   };\n \n-  return (nrfx_spim_xfer(&_spi, &xfer, 0) == NRFX_SUCCESS);\n+  return nrfx_spim_xfer(&_spi, &xfer, 0) == NRFX_SUCCESS;\n }\n","improvement-type":"Excess Number of Function Arguments"},{"architectural-component-id":null,"author-name":"hathach","training-data":{"loc-added":"6","loc-deleted":"16","delta-cc-mean":"0.0","delta-cc-total":"0","delta-penalties":"1.0","delta-n-functions":"0","current-file-score":"10.0"},"author-email":"thach@tinyusb.org","commit-full-message":"","commit-date":"2025-02-14T04:09:50Z","current-rev":"31a2696de","filename":"tinyusb/examples/host/midi_rx/src/main.c","previous-rev":"ed88fc983","commit-title":"- change signature of tuh_midi_mount/umount_cb() - rename midi_stream_t to midi_driver_stream_t and move to midi.h (common for device and host)","language":"C","id":"5230227859d759d0bad2776d487ec896fe0bacd0","model-score":0.61,"author-id":null,"project-id":37161,"delta-file-score":0.31179166,"diff":"diff --git a/examples/host/midi_rx/src/main.c b/examples/host/midi_rx/src/main.c\nindex 0b07ba6e7..fed782947 100644\n--- a/examples/host/midi_rx/src/main.c\n+++ b/examples/host/midi_rx/src/main.c\n@@ -103,17 +103,9 @@ void midi_host_rx_task(void) {\n \n-// Invoked when device with hid interface is mounted\n-// Report descriptor is also available for use. tuh_hid_parse_report_descriptor()\n-// can be used to parse common/simple enough descriptor.\n-// Note: if report descriptor length > CFG_TUH_ENUMERATION_BUFSIZE, it will be skipped\n-// therefore report_desc = NULL, desc_len = 0\n-void tuh_midi_mount_cb(uint8_t dev_addr, uint8_t in_ep, uint8_t out_ep, uint8_t num_cables_rx, uint16_t num_cables_tx) {\n-  (void) in_ep;\n-  (void) out_ep;\n+// Invoked when device with MIDI interface is mounted.\n+void tuh_midi_mount_cb(uint8_t dev_addr, uint8_t num_cables_rx, uint16_t num_cables_tx) {\n   (void) num_cables_rx;\n   (void) num_cables_tx;\n-\n-  TU_LOG1(\"MIDI device address = %u, IN endpoint %u has %u cables, OUT endpoint %u has %u cables\\r\\n\",\n-          dev_addr, in_ep & 0xf, num_cables_rx, out_ep & 0xf, num_cables_tx);\n-\n   midi_dev_addr = dev_addr;\n+  TU_LOG1(\"MIDI device address = %u, Number of RX cables = %u, Number of TX cables = %u\\r\\n\",\n+          dev_addr, num_cables_rx, num_cables_tx);\n }\n@@ -121,8 +113,6 @@ void tuh_midi_mount_cb(uint8_t dev_addr, uint8_t in_ep, uint8_t out_ep, uint8_t\n // Invoked when device with hid interface is un-mounted\n-void tuh_midi_umount_cb(uint8_t dev_addr, uint8_t instance) {\n+void tuh_midi_umount_cb(uint8_t dev_addr) {\n   (void) dev_addr;\n-  (void) instance;\n-\n-  TU_LOG1(\"MIDI device address = %d, instance = %d is unmounted\\r\\n\", dev_addr, instance);\n   midi_dev_addr = 0;\n+  TU_LOG1(\"MIDI device address = %d is unmounted\\r\\n\", dev_addr);\n }\n","improvement-type":"Excess Number of Function Arguments"},{"architectural-component-id":null,"author-name":"HiFiPhile","training-data":{"loc-added":"22","loc-deleted":"29","delta-cc-mean":"0.0","delta-cc-total":"0","delta-penalties":"1.0","delta-n-functions":"0","current-file-score":"9.313614294706117"},"author-email":"admin@hifiphile.com","commit-full-message":"Signed-off-by: HiFiPhile <admin@hifiphile.com>","commit-date":"2025-06-14T17:37:10Z","current-rev":"545690c83","filename":"tinyusb/examples/device/cdc_uac2/src/uac2_app.c","previous-rev":"19b5ec5fd","commit-title":"audio: update examples","language":"C","id":"ec2d1ffb9c61eaf6d38e223c89b40411b5c285c9","model-score":0.3,"author-id":null,"project-id":37161,"delta-file-score":0.28801286,"diff":"diff --git a/examples/device/cdc_uac2/src/uac2_app.c b/examples/device/cdc_uac2/src/uac2_app.c\nindex 70b0949a9..7d5da5ed0 100644\n--- a/examples/device/cdc_uac2/src/uac2_app.c\n+++ b/examples/device/cdc_uac2/src/uac2_app.c\n@@ -51,4 +51,2 @@ int16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1];    // +1 for master chan\n \n-// Buffer for microphone data\n-int32_t mic_buf[CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ / 4];\n // Buffer for speaker data\n@@ -56,3 +54,3 @@ int32_t spk_buf[CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ / 4];\n // Speaker data size received in the last frame\n-int spk_data_size;\n+uint16_t spk_data_size;\n // Resolution per format\n@@ -62,2 +60,23 @@ uint8_t current_resolution;\n \n+//--------------------------------------------------------------------+\n+// AUDIO Task\n+//--------------------------------------------------------------------+\n+\n+// This task simulates an audio transfer callback, one frame is sent/received every 1ms.\n+// In a real application, this would be replaced with actual I2S send/receive callback.\n+void audio_task(void) {\n+  static uint32_t start_ms = 0;\n+  uint32_t curr_ms = board_millis();\n+  if (start_ms == curr_ms) return;// not enough time\n+  start_ms = curr_ms;\n+  // When new data arrived, copy data from speaker buffer, to microphone buffer\n+  // and send it over\n+  // Only support speaker & headphone both have the same resolution\n+  // If one is 16bit another is 24bit be care of LOUD noise !\n+  spk_data_size = tud_audio_read(spk_buf, sizeof(spk_buf));\n+  if (spk_data_size) {\n+      tud_audio_write((uint8_t *) spk_buf, spk_data_size);\n+  }\n+}\n+\n // Helper for clock get requests\n@@ -267,4 +286,2 @@ bool tud_audio_set_itf_cb(uint8_t rhport, tusb_control_request_t const * p_reque\n \n-  // Clear buffer when streaming format is changed\n-  spk_data_size = 0;\n   if(alt != 0)\n@@ -277,26 +294,2 @@ bool tud_audio_set_itf_cb(uint8_t rhport, tusb_control_request_t const * p_reque\n \n-bool tud_audio_rx_done_pre_read_cb(uint8_t rhport, uint16_t n_bytes_received, uint8_t func_id, uint8_t ep_out, uint8_t cur_alt_setting)\n-{\n-  (void)rhport;\n-  (void)func_id;\n-  (void)ep_out;\n-  (void)cur_alt_setting;\n-\n-  spk_data_size = tud_audio_read(spk_buf, n_bytes_received);\n-  tud_audio_write(spk_buf, n_bytes_received);\n-\n-  return true;\n-}\n-\n-bool tud_audio_tx_done_pre_load_cb(uint8_t rhport, uint8_t itf, uint8_t ep_in, uint8_t cur_alt_setting)\n-{\n-  (void)rhport;\n-  (void)itf;\n-  (void)ep_in;\n-  (void)cur_alt_setting;\n-\n-  // This callback could be used to fill microphone data separately\n-  return true;\n-}\n-\n //--------------------------------------------------------------------+\n","improvement-type":"Excess Number of Function Arguments"},{"architectural-component-id":null,"author-name":"hathach","training-data":{"loc-added":"52","loc-deleted":"55","delta-cc-mean":"0.0","delta-cc-total":"0","delta-penalties":"1.0","delta-n-functions":"0","current-file-score":"7.589947037113211"},"author-email":"thach@tinyusb.org","commit-full-message":"","commit-date":"2025-09-23T08:23:16Z","current-rev":"3c39f60f6","filename":"tinyusb/examples/device/mtp/src/mtp_fs_example.c","previous-rev":"1ab45bc52","commit-title":"refactor API","language":"C","id":"6ff3e58981c3d152134fe9b6ecd7ac2c63562f08","model-score":0.06,"author-id":null,"project-id":37161,"delta-file-score":0.2202191,"diff":"diff --git a/examples/device/mtp/src/mtp_fs_example.c b/examples/device/mtp/src/mtp_fs_example.c\nindex 104260373..5b9b5b2eb 100644\n--- a/examples/device/mtp/src/mtp_fs_example.c\n+++ b/examples/device/mtp/src/mtp_fs_example.c\n@@ -166,8 +166,7 @@ uint32_t fs_get_object_count(void) {\n \n-int32_t tud_mtp_data_complete_cb(uint8_t idx, mtp_container_header_t* cmd_header, mtp_generic_container_t* resp_block, tusb_xfer_result_t xfer_result, uint32_t xferred_bytes) {\n-  (void) idx;\n-  (void) cmd_header;\n-  resp_block->len = MTP_CONTAINER_HEADER_LENGTH;\n-  resp_block->code = (xfer_result == XFER_RESULT_SUCCESS) ? MTP_RESP_OK : MTP_RESP_GENERAL_ERROR;\n-  tud_mtp_response_send(resp_block);\n+int32_t tud_mtp_data_complete_cb(tud_mtp_cb_data_t* cb_data) {\n+  mtp_container_info_t* reply = &cb_data->reply;\n+  reply->header->len = sizeof(mtp_container_header_t);\n+  reply->header->code = (cb_data->xfer_result == XFER_RESULT_SUCCESS) ? MTP_RESP_OK : MTP_RESP_GENERAL_ERROR;\n+  tud_mtp_response_send(reply);\n   return 0;\n@@ -175,8 +174,4 @@ int32_t tud_mtp_data_complete_cb(uint8_t idx, mtp_container_header_t* cmd_header\n \n-int32_t tud_mtp_response_complete_cb(uint8_t idx, mtp_container_header_t* cmd_header, mtp_generic_container_t* resp_block, tusb_xfer_result_t xfer_result, uint32_t xferred_bytes) {\n-  (void) idx;\n-  (void) cmd_header;\n-  (void) resp_block;\n-  (void) xfer_result;\n-  (void) xferred_bytes;\n+int32_t tud_mtp_response_complete_cb(tud_mtp_cb_data_t* cb_data) {\n+  (void) cb_data;\n   return 0; // nothing to do\n@@ -184,13 +179,14 @@ int32_t tud_mtp_response_complete_cb(uint8_t idx, mtp_container_header_t* cmd_he\n \n-int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_block, mtp_generic_container_t* out_block) {\n-  (void)idx;\n-  switch (cmd_block->code) {\n+int32_t tud_mtp_command_received_cb(tud_mtp_cb_data_t* cb_data) {\n+  const mtp_container_command_t* command = cb_data->command;\n+  mtp_container_info_t* reply = &cb_data->reply;\n+  switch (command->header.code) {\n     case MTP_OP_GET_DEVICE_INFO: {\n       // Device info is already prepared up to playback formats. Application only need to add string fields\n-      mtp_container_add_cstring(out_block, DEV_INFO_MANUFACTURER);\n-      mtp_container_add_cstring(out_block, DEV_INFO_MODEL);\n-      mtp_container_add_cstring(out_block, DEV_INFO_VERSION);\n-      mtp_container_add_cstring(out_block, DEV_INFO_SERIAL);\n+      mtp_container_add_cstring(&cb_data->reply, DEV_INFO_MANUFACTURER);\n+      mtp_container_add_cstring(&cb_data->reply, DEV_INFO_MODEL);\n+      mtp_container_add_cstring(&cb_data->reply, DEV_INFO_VERSION);\n+      mtp_container_add_cstring(&cb_data->reply, DEV_INFO_SERIAL);\n \n-      tud_mtp_data_send(out_block);\n+      tud_mtp_data_send(&cb_data->reply);\n       break;\n@@ -201,8 +197,8 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n         //return MTP_RESP_SESSION_ALREADY_OPEN;\n-        out_block->code = MTP_RESP_SESSION_ALREADY_OPEN;\n+        reply->header->code = MTP_RESP_SESSION_ALREADY_OPEN;\n       }else {\n-        out_block->code = MTP_RESP_OK;\n+        reply->header->code = MTP_RESP_OK;\n       }\n       is_session_opened = true;\n-      tud_mtp_response_send(out_block);\n+      tud_mtp_response_send(&cb_data->reply);\n       break;\n@@ -212,8 +208,8 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n         // return MTP_RESP_SESSION_NOT_OPEN;\n-        out_block->code = MTP_RESP_SESSION_NOT_OPEN;\n+        reply->header->code = MTP_RESP_SESSION_NOT_OPEN;\n       } else {\n-        out_block->code = MTP_RESP_OK;\n+        reply->header->code = MTP_RESP_OK;\n       }\n       is_session_opened = false;\n-      tud_mtp_response_send(out_block);\n+      tud_mtp_response_send(&cb_data->reply);\n       break;\n@@ -222,4 +218,4 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n       uint32_t storage_ids [] = { SUPPORTED_STORAGE_ID }; // physical = 1, logical = 1\n-      mtp_container_add_auint32(out_block, 1, storage_ids);\n-      tud_mtp_data_send(out_block);\n+      mtp_container_add_auint32(&cb_data->reply, 1, storage_ids);\n+      tud_mtp_data_send(&cb_data->reply);\n       break;\n@@ -228,3 +224,4 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n     case MTP_OP_GET_STORAGE_INFO: {\n-      TU_VERIFY(SUPPORTED_STORAGE_ID == cmd_block->data[0], -1);\n+      uint32_t storage_id = command->params[0];\n+      TU_VERIFY(SUPPORTED_STORAGE_ID == storage_id, -1);\n       // update storage info with current free space\n@@ -232,4 +229,4 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n       storage_info.free_space_in_bytes = FS_MAX_CAPACITY_BYTES-fs_buf_head;\n-      mtp_container_add_raw(out_block, &storage_info, sizeof(storage_info));\n-      tud_mtp_data_send(out_block);\n+      mtp_container_add_raw(&cb_data->reply, &storage_info, sizeof(storage_info));\n+      tud_mtp_data_send(&cb_data->reply);\n       break;\n@@ -238,3 +235,3 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n     case MTP_OP_GET_DEVICE_PROP_DESC: {\n-      const uint16_t dev_prop_code = (uint16_t) cmd_block->data[0];\n+      const uint16_t dev_prop_code = (uint16_t) command->params[0];\n       mtp_device_prop_desc_header_t device_prop_header;\n@@ -245,7 +242,7 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n           device_prop_header.get_set = MTP_MODE_GET;\n-          mtp_container_add_raw(out_block, &device_prop_header, sizeof(device_prop_header));\n-          mtp_container_add_cstring(out_block, DEV_PROP_FRIENDLY_NAME); // factory\n-          mtp_container_add_cstring(out_block, DEV_PROP_FRIENDLY_NAME); // current\n-          mtp_container_add_uint8(out_block, 0); // no form\n-          tud_mtp_data_send(out_block);\n+          mtp_container_add_raw(&cb_data->reply, &device_prop_header, sizeof(device_prop_header));\n+          mtp_container_add_cstring(&cb_data->reply, DEV_PROP_FRIENDLY_NAME); // factory\n+          mtp_container_add_cstring(&cb_data->reply, DEV_PROP_FRIENDLY_NAME); // current\n+          mtp_container_add_uint8(&cb_data->reply, 0); // no form\n+          tud_mtp_data_send(&cb_data->reply);\n           break;\n@@ -258,7 +255,7 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n     case MTP_OP_GET_DEVICE_PROP_VALUE: {\n-      const uint16_t dev_prop_code = (uint16_t) cmd_block->data[0];\n+      const uint16_t dev_prop_code = (uint16_t) command->params[0];\n       switch (dev_prop_code) {\n         case MTP_DEV_PROP_DEVICE_FRIENDLY_NAME:\n-          mtp_container_add_cstring(out_block, DEV_PROP_FRIENDLY_NAME);\n-          tud_mtp_data_send(out_block);\n+          mtp_container_add_cstring(&cb_data->reply, DEV_PROP_FRIENDLY_NAME);\n+          tud_mtp_data_send(&cb_data->reply);\n           break;\n@@ -271,6 +268,6 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n     case MTP_OP_GET_OBJECT_HANDLES: {\n-      const uint32_t storage_id = cmd_block->data[0];\n-      const uint32_t obj_format = cmd_block->data[1]; // optional\n+      const uint32_t storage_id = command->params[0];\n+      const uint32_t obj_format = command->params[1]; // optional\n       (void) obj_format;\n-      const uint32_t parent_handle = cmd_block->data[2]; // folder handle, 0xFFFFFFFF is root\n+      const uint32_t parent_handle = command->params[2]; // folder handle, 0xFFFFFFFF is root\n       if (storage_id != 0xFFFFFFFF && storage_id != SUPPORTED_STORAGE_ID) {\n@@ -288,4 +285,4 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n       }\n-      mtp_container_add_auint32(out_block, count, handles);\n-      tud_mtp_data_send(out_block);\n+      mtp_container_add_auint32(&cb_data->reply, count, handles);\n+      tud_mtp_data_send(&cb_data->reply);\n       break;\n@@ -294,3 +291,3 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n     case MTP_OP_GET_OBJECT_INFO: {\n-      const uint32_t obj_handle = cmd_block->data[0];\n+      const uint32_t obj_handle = command->params[0];\n       fs_object_info_t* obj = fs_get_object(obj_handle);\n@@ -316,9 +313,9 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n       };\n-      mtp_container_add_raw(out_block, &obj_info_header, sizeof(obj_info_header));\n-      mtp_container_add_cstring(out_block, obj->name);\n-      mtp_container_add_cstring(out_block, FS_FIXED_DATETIME);\n-      mtp_container_add_cstring(out_block, FS_FIXED_DATETIME);\n-      mtp_container_add_cstring(out_block, \"\"); // keywords, not used\n+      mtp_container_add_raw(&cb_data->reply, &obj_info_header, sizeof(obj_info_header));\n+      mtp_container_add_cstring(&cb_data->reply, obj->name);\n+      mtp_container_add_cstring(&cb_data->reply, FS_FIXED_DATETIME);\n+      mtp_container_add_cstring(&cb_data->reply, FS_FIXED_DATETIME);\n+      mtp_container_add_cstring(&cb_data->reply, \"\"); // keywords, not used\n \n-      tud_mtp_data_send(out_block);\n+      tud_mtp_data_send(&cb_data->reply);\n       break;\n@@ -327,3 +324,3 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n     case MTP_OP_GET_OBJECT: {\n-      const uint32_t obj_handle = cmd_block->data[0];\n+      const uint32_t obj_handle = command->params[0];\n       fs_object_info_t* obj = fs_get_object(obj_handle);\n@@ -333,4 +330,4 @@ int32_t tud_mtp_command_received_cb(uint8_t idx, mtp_generic_container_t* cmd_bl\n \n-      mtp_container_add_raw(out_block, obj->data, obj->size);\n-      tud_mtp_data_send(out_block);\n+      mtp_container_add_raw(&cb_data->reply, obj->data, obj->size);\n+      tud_mtp_data_send(&cb_data->reply);\n       break;\n","improvement-type":"Excess Number of Function Arguments"},{"architectural-component-id":null,"author-name":"HiFiPhile","training-data":{"loc-added":"58","loc-deleted":"97","delta-cc-mean":"0.0","delta-cc-total":"0","delta-penalties":"1.0","delta-n-functions":"0","current-file-score":"8.852066566277504"},"author-email":"admin@hifiphile.com","commit-full-message":"Signed-off-by: HiFiPhile <admin@hifiphile.com>","commit-date":"2025-06-14T17:37:10Z","current-rev":"545690c83","filename":"tinyusb/examples/device/audio_test/src/main.c","previous-rev":"19b5ec5fd","commit-title":"audio: update examples","language":"C","id":"58f730be1e3677e4513b8447a005b7d045457775","model-score":0.04,"author-id":null,"project-id":37161,"delta-file-score":0.27202323,"diff":"diff --git a/examples/device/audio_test/src/main.c b/examples/device/audio_test/src/main.c\nindex 018c48994..07728e24a 100644\n--- a/examples/device/audio_test/src/main.c\n+++ b/examples/device/audio_test/src/main.c\n@@ -33,4 +33,4 @@\n \n-#include <stdlib.h>\n #include <stdio.h>\n+#include <stdlib.h>\n #include <string.h>\n@@ -49,3 +49,3 @@\n  */\n-enum  {\n+enum {\n   BLINK_NOT_MOUNTED = 250,\n@@ -59,4 +59,4 @@ static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n // Current states\n-bool mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1]; \t\t\t\t          // +1 for master channel 0\n-uint16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1]; \t\t\t\t\t// +1 for master channel 0\n+bool mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];      // +1 for master channel 0\n+uint16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// +1 for master channel 0\n uint32_t sampFreq;\n@@ -65,7 +65,7 @@ uint8_t clkValid;\n // Range states\n-audio_control_range_2_n_t(1) volumeRng[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX+1]; \t\t\t// Volume range state\n-audio_control_range_4_n_t(1) sampleFreqRng; \t\t\t\t\t\t// Sample frequency range state\n+audio_control_range_2_n_t(1) volumeRng[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// Volume range state\n+audio_control_range_4_n_t(1) sampleFreqRng;                                    // Sample frequency range state\n \n // Audio test data\n-uint16_t test_buffer_audio[(CFG_TUD_AUDIO_EP_SZ_IN - 2) / 2];\n+uint16_t test_buffer_audio[CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE / 1000 * CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX / 2];\n uint16_t startVal = 0;\n@@ -76,4 +76,3 @@ void audio_task(void);\n /*------------- MAIN -------------*/\n-int main(void)\n-{\n+int main(void) {\n   board_init();\n@@ -82,5 +81,4 @@ int main(void)\n   tusb_rhport_init_t dev_init = {\n-    .role = TUSB_ROLE_DEVICE,\n-    .speed = TUSB_SPEED_AUTO\n-  };\n+      .role = TUSB_ROLE_DEVICE,\n+      .speed = TUSB_SPEED_AUTO};\n   tusb_init(BOARD_TUD_RHPORT, &dev_init);\n@@ -100,5 +98,4 @@ int main(void)\n \n-  while (1)\n-  {\n-    tud_task(); // tinyusb device task\n+  while (1) {\n+    tud_task();// tinyusb device task\n     led_blinking_task();\n@@ -113,4 +110,3 @@ int main(void)\n // Invoked when device is mounted\n-void tud_mount_cb(void)\n-{\n+void tud_mount_cb(void) {\n   blink_interval_ms = BLINK_MOUNTED;\n@@ -119,4 +115,3 @@ void tud_mount_cb(void)\n // Invoked when device is unmounted\n-void tud_umount_cb(void)\n-{\n+void tud_umount_cb(void) {\n   blink_interval_ms = BLINK_NOT_MOUNTED;\n@@ -127,4 +122,3 @@ void tud_umount_cb(void)\n // Within 7ms, device must draw an average of current less than 2.5 mA from bus\n-void tud_suspend_cb(bool remote_wakeup_en)\n-{\n+void tud_suspend_cb(bool remote_wakeup_en) {\n   (void) remote_wakeup_en;\n@@ -134,4 +128,3 @@ void tud_suspend_cb(bool remote_wakeup_en)\n // Invoked when usb bus is resumed\n-void tud_resume_cb(void)\n-{\n+void tud_resume_cb(void) {\n   blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n@@ -139,2 +132,3 @@ void tud_resume_cb(void)\n \n+\n //--------------------------------------------------------------------+\n@@ -143,6 +137,14 @@ void tud_resume_cb(void)\n \n-void audio_task(void)\n-{\n-  // Yet to be filled - e.g. put meas data into TX FIFOs etc.\n-  // asm(\"nop\");\n+// This task simulates an audio receive callback, one frame is received every 1ms.\n+// We assume that the audio data is read from an I2S buffer.\n+// In a real application, this would be replaced with actual I2S receive callback.\n+void audio_task(void) {\n+  static uint32_t start_ms = 0;\n+  uint32_t curr_ms = board_millis();\n+  if (start_ms == curr_ms) return;// not enough time\n+  start_ms = curr_ms;\n+  for (size_t cnt = 0; cnt < sizeof(test_buffer_audio) / 2; cnt++) {\n+    test_buffer_audio[cnt] = startVal++;\n+  }\n+  tud_audio_write((uint8_t *) test_buffer_audio, sizeof(test_buffer_audio));\n }\n@@ -154,4 +156,3 @@ void audio_task(void)\n // Invoked when audio class specific set request received for an EP\n-bool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const * p_request, uint8_t *pBuff)\n-{\n+bool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n   (void) rhport;\n@@ -167,5 +168,7 @@ bool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const * p_re\n \n-  (void) channelNum; (void) ctrlSel; (void) ep;\n+  (void) channelNum;\n+  (void) ctrlSel;\n+  (void) ep;\n \n-  return false; \t// Yet not implemented\n+  return false;// Yet not implemented\n }\n@@ -173,4 +176,3 @@ bool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const * p_re\n // Invoked when audio class specific set request received for an interface\n-bool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const * p_request, uint8_t *pBuff)\n-{\n+bool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n   (void) rhport;\n@@ -186,5 +188,7 @@ bool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const * p_r\n \n-  (void) channelNum; (void) ctrlSel; (void) itf;\n+  (void) channelNum;\n+  (void) ctrlSel;\n+  (void) itf;\n \n-  return false; \t// Yet not implemented\n+  return false;// Yet not implemented\n }\n@@ -192,4 +196,3 @@ bool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const * p_r\n // Invoked when audio class specific set request received for an entity\n-bool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const * p_request, uint8_t *pBuff)\n-{\n+bool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n   (void) rhport;\n@@ -208,6 +211,4 @@ bool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n   // If request is for our feature unit\n-  if ( entityID == 2 )\n-  {\n-    switch ( ctrlSel )\n-    {\n+  if (entityID == 2) {\n+    switch (ctrlSel) {\n       case AUDIO_FU_CTRL_MUTE:\n@@ -216,6 +217,6 @@ bool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n \n-        mute[channelNum] = ((audio_control_cur_1_t*) pBuff)->bCur;\n+        mute[channelNum] = ((audio_control_cur_1_t *) pBuff)->bCur;\n \n         TU_LOG2(\"    Set Mute: %d of channel: %u\\r\\n\", mute[channelNum], channelNum);\n-      return true;\n+        return true;\n \n@@ -225,6 +226,6 @@ bool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n \n-        volume[channelNum] = (uint16_t) ((audio_control_cur_2_t*) pBuff)->bCur;\n+        volume[channelNum] = (uint16_t) ((audio_control_cur_2_t *) pBuff)->bCur;\n \n         TU_LOG2(\"    Set Volume: %d dB of channel: %u\\r\\n\", volume[channelNum], channelNum);\n-      return true;\n+        return true;\n \n@@ -233,6 +234,6 @@ bool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n         TU_BREAKPOINT();\n-      return false;\n+        return false;\n     }\n   }\n-  return false;    // Yet not implemented\n+  return false;// Yet not implemented\n }\n@@ -240,4 +241,3 @@ bool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n // Invoked when audio class specific get request received for an EP\n-bool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const * p_request)\n-{\n+bool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n   (void) rhport;\n@@ -249,3 +249,5 @@ bool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const * p_re\n \n-  (void) channelNum; (void) ctrlSel; (void) ep;\n+  (void) channelNum;\n+  (void) ctrlSel;\n+  (void) ep;\n \n@@ -253,3 +255,3 @@ bool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const * p_re\n \n-  return false; \t// Yet not implemented\n+  return false;// Yet not implemented\n }\n@@ -257,4 +259,3 @@ bool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const * p_re\n // Invoked when audio class specific get request received for an interface\n-bool tud_audio_get_req_itf_cb(uint8_t rhport, tusb_control_request_t const * p_request)\n-{\n+bool tud_audio_get_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n   (void) rhport;\n@@ -266,5 +267,7 @@ bool tud_audio_get_req_itf_cb(uint8_t rhport, tusb_control_request_t const * p_r\n \n-  (void) channelNum; (void) ctrlSel; (void) itf;\n+  (void) channelNum;\n+  (void) ctrlSel;\n+  (void) itf;\n \n-  return false; \t// Yet not implemented\n+  return false;// Yet not implemented\n }\n@@ -272,4 +275,3 @@ bool tud_audio_get_req_itf_cb(uint8_t rhport, tusb_control_request_t const * p_r\n // Invoked when audio class specific get request received for an entity\n-bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const * p_request)\n-{\n+bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n   (void) rhport;\n@@ -283,8 +285,5 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n   // Input terminal (Microphone input)\n-  if (entityID == 1)\n-  {\n-    switch ( ctrlSel )\n-    {\n-      case AUDIO_TE_CTRL_CONNECTOR:\n-      {\n+  if (entityID == 1) {\n+    switch (ctrlSel) {\n+      case AUDIO_TE_CTRL_CONNECTOR: {\n         // The terminal connector control only has a get request with only the CUR attribute.\n@@ -299,5 +298,4 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n \n-        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void*) &ret, sizeof(ret));\n-      }\n-      break;\n+        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n+      } break;\n \n@@ -311,6 +309,4 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n   // Feature unit\n-  if (entityID == 2)\n-  {\n-    switch ( ctrlSel )\n-    {\n+  if (entityID == 2) {\n+    switch (ctrlSel) {\n       case AUDIO_FU_CTRL_MUTE:\n@@ -319,10 +315,9 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n         TU_LOG2(\"    Get Mute of channel: %u\\r\\n\", channelNum);\n-        return tud_control_xfer(rhport, p_request, &mute[channelNum], 1);\n+        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &mute[channelNum], 1);\n \n       case AUDIO_FU_CTRL_VOLUME:\n-        switch ( p_request->bRequest )\n-        {\n+        switch (p_request->bRequest) {\n           case AUDIO_CS_REQ_CUR:\n             TU_LOG2(\"    Get Volume of channel: %u\\r\\n\", channelNum);\n-            return tud_control_xfer(rhport, p_request, &volume[channelNum], sizeof(volume[channelNum]));\n+            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &volume[channelNum], sizeof(volume[channelNum]));\n \n@@ -333,10 +328,10 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n             audio_control_range_2_n_t(1)\n-            ret;\n+                ret;\n \n             ret.wNumSubRanges = 1;\n-            ret.subrange[0].bMin = -90;    // -90 dB\n-            ret.subrange[0].bMax = 90;\t\t// +90 dB\n-            ret.subrange[0].bRes = 1; \t\t// 1 dB steps\n+            ret.subrange[0].bMin = -90;// -90 dB\n+            ret.subrange[0].bMax = 90; // +90 dB\n+            ret.subrange[0].bRes = 1;  // 1 dB steps\n \n-            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void*) &ret, sizeof(ret));\n+            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n \n@@ -347,3 +342,3 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n         }\n-      break;\n+        break;\n \n@@ -357,13 +352,10 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n   // Clock Source unit\n-  if ( entityID == 4 )\n-  {\n-    switch ( ctrlSel )\n-    {\n+  if (entityID == 4) {\n+    switch (ctrlSel) {\n       case AUDIO_CS_CTRL_SAM_FREQ:\n         // channelNum is always zero in this case\n-        switch ( p_request->bRequest )\n-        {\n+        switch (p_request->bRequest) {\n           case AUDIO_CS_REQ_CUR:\n             TU_LOG2(\"    Get Sample Freq.\\r\\n\");\n-            return tud_control_xfer(rhport, p_request, &sampFreq, sizeof(sampFreq));\n+            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &sampFreq, sizeof(sampFreq));\n \n@@ -371,5 +363,5 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n             TU_LOG2(\"    Get Sample Freq. range\\r\\n\");\n-            return tud_control_xfer(rhport, p_request, &sampleFreqRng, sizeof(sampleFreqRng));\n+            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &sampleFreqRng, sizeof(sampleFreqRng));\n \n-           // Unknown/Unsupported control\n+            // Unknown/Unsupported control\n           default:\n@@ -378,3 +370,3 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n         }\n-      break;\n+        break;\n \n@@ -383,3 +375,3 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n         TU_LOG2(\"    Get Sample Freq. valid\\r\\n\");\n-        return tud_control_xfer(rhport, p_request, &clkValid, sizeof(clkValid));\n+        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &clkValid, sizeof(clkValid));\n \n@@ -393,35 +385,6 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *\n   TU_LOG2(\"  Unsupported entity: %d\\r\\n\", entityID);\n-  return false; \t// Yet not implemented\n-}\n-\n-bool tud_audio_tx_done_pre_load_cb(uint8_t rhport, uint8_t itf, uint8_t ep_in, uint8_t cur_alt_setting)\n-{\n-  (void) rhport;\n-  (void) itf;\n-  (void) ep_in;\n-  (void) cur_alt_setting;\n-\n-  tud_audio_write ((uint8_t *)test_buffer_audio, CFG_TUD_AUDIO_EP_SZ_IN - 2);\n-\n-  return true;\n-}\n-\n-bool tud_audio_tx_done_post_load_cb(uint8_t rhport, uint16_t n_bytes_copied, uint8_t itf, uint8_t ep_in, uint8_t cur_alt_setting)\n-{\n-  (void) rhport;\n-  (void) n_bytes_copied;\n-  (void) itf;\n-  (void) ep_in;\n-  (void) cur_alt_setting;\n-\n-  for (size_t cnt = 0; cnt < (CFG_TUD_AUDIO_EP_SZ_IN - 2) / 2; cnt++)\n-  {\n-    test_buffer_audio[cnt] = startVal++;\n-  }\n-\n-  return true;\n+  return false;// Yet not implemented\n }\n \n-bool tud_audio_set_itf_close_EP_cb(uint8_t rhport, tusb_control_request_t const * p_request)\n-{\n+bool tud_audio_set_itf_close_EP_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n   (void) rhport;\n@@ -436,4 +399,3 @@ bool tud_audio_set_itf_close_EP_cb(uint8_t rhport, tusb_control_request_t const\n //--------------------------------------------------------------------+\n-void led_blinking_task(void)\n-{\n+void led_blinking_task(void) {\n   static uint32_t start_ms = 0;\n@@ -442,3 +404,3 @@ void led_blinking_task(void)\n   // Blink every interval ms\n-  if ( board_millis() - start_ms < blink_interval_ms) return; // not enough time\n+  if (board_millis() - start_ms < blink_interval_ms) return;// not enough time\n   start_ms += blink_interval_ms;\n@@ -446,3 +408,3 @@ void led_blinking_task(void)\n   board_led_write(led_state);\n-  led_state = 1 - led_state; // toggle\n+  led_state = 1 - led_state;// toggle\n }\n","improvement-type":"Excess Number of Function Arguments"}],"change-level":"warning","is-hotspot?":false,"line":134,"what-changed":"tud_video_prepare_payload_cb has 5 arguments, max arguments = 4","how-to-fix":"Start by investigating the responsibilities of the function. Make sure it doesn't do too many things, in which case it should be split into smaller and more cohesive functions. Consider the refactoring [INTRODUCE PARAMETER OBJECT](https://refactoring.com/catalog/introduceParameterObject.html) to encapsulate arguments that refer to the same logical concept.","change-type":"introduced"}]},"positive-impact-count":2,"repo":"tinyusb","code-health":5.11979363004293,"version":"3.0","authors":["Tobi"],"directives":{"added":[],"removed":[]},"positive-findings":{"number-of-types":2,"number-of-files-touched":1,"findings":[{"method":"tud_video_n_frame_xfer","why-it-occurs":"A Complex Method has a high cyclomatic complexity. The recommended threshold for the C language is a cyclomatic complexity lower than 9.","name":"Complex Method","file":"src/class/video/video_device.c","change-level":"improvement","is-hotspot?":false,"line":1246,"what-changed":"tud_video_n_frame_xfer decreases in cyclomatic complexity from 11 to 10, threshold = 9","how-to-fix":"There are many reasons for Complex Method. Sometimes, another design approach is beneficial such as a) modeling state using an explicit state machine rather than conditionals, or b) using table lookup rather than long chains of logic. In other scenarios, the function can be split using [EXTRACT FUNCTION](https://refactoring.com/catalog/extractFunction.html). Just make sure you extract natural and cohesive functions. Complex Methods can also be addressed by identifying complex conditional expressions and then using the [DECOMPOSE CONDITIONAL](https://refactoring.com/catalog/decomposeConditional.html) refactoring.","change-type":"improved"},{"name":"Overall Code Complexity","file":"src/class/video/video_device.c","change-type":"improved","change-level":"improvement","is-hotspot?":false,"why-it-occurs":"Overall Code Complexity is measured by the mean cyclomatic complexity across all functions in the file. The lower the number, the better.\n\nCyclomatic complexity is a function level metric that measures the number of logical branches (if-else, loops, etc.). Cyclomatic complexity is a rough complexity measure, but useful as a way of estimating the minimum number of unit tests you would need. As such, prefer functions with low cyclomatic complexity (2-3 branches).","how-to-fix":"You address the overall cyclomatic complexity by a) modularizing the code, and b) abstract away the complexity. Let's look at some examples:\n\nModularizing the Code: Do an X-Ray and inspect the local hotspots. Are there any complex conditional expressions? If yes, then do a [DECOMPOSE CONDITIONAL](https://refactoring.com/catalog/decomposeConditional.html) refactoring. Extract the conditional logic into a separate function and put a good name on that function. This clarifies the intent and makes the original function easier to read. Repeat until all complex conditional expressions have been simplified.\n\n","what-changed":"The mean cyclomatic complexity decreases from 6.46 to 6.33, threshold = 4"}]},"notices":{"number-of-types":0,"number-of-files-touched":0,"findings":[]},"external-review-provider":"GitHub"},"analysistime":"2025-10-30T13:18:23.000Z","project-name":"tinyusb","repository":"https://github.com/hathach/tinyusb.git"}}