diff --git a/.vscode/settings.json b/.vscode/settings.json index 28700f747..e3f332768 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -63,7 +63,26 @@ "typeinfo": "cpp", "variant": "cpp", "cstring": "cpp", - "complex": "cpp" + "complex": "cpp", + "any": "cpp", + "hash_map": "cpp", + "hash_set": "cpp", + "bitset": "cpp", + "codecvt": "cpp", + "forward_list": "cpp", + "set": "cpp", + "unordered_set": "cpp", + "fstream": "cpp", + "future": "cpp", + "queue": "cpp", + "ranges": "cpp", + "shared_mutex": "cpp", + "text_encoding": "cpp", + "cfenv": "cpp", + "typeindex": "cpp", + "valarray": "cpp", + "regex": "cpp", + "stack": "cpp" }, "cmake.sourceDirectory": "${workspaceFolder}/linux/" } \ No newline at end of file diff --git a/libausbc/src/main/jni/UVCCamera/CMakeLists.txt b/libausbc/src/main/jni/UVCCamera/CMakeLists.txt index 6d6648f9b..fa7398b53 100644 --- a/libausbc/src/main/jni/UVCCamera/CMakeLists.txt +++ b/libausbc/src/main/jni/UVCCamera/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.22) set(UVCCAMERA ${CMAKE_CURRENT_LIST_DIR}/) include_directories( - ${UVCCAMERA}/ + ${UVCCAMERA}/include/ ) @@ -20,15 +20,15 @@ endif () add_compile_definitions(USE_TURBOJPEG) list(APPEND SOURCES - ${UVCCAMERA}/_onload.cpp - ${UVCCAMERA}/UVCCamera.cpp - ${UVCCAMERA}/ImageUseCases.cpp - ${UVCCAMERA}/UVCPreviewBase.cpp - ${UVCCAMERA}/UVCPreviewJni.cpp - ${UVCCAMERA}/UVCCameraAdjustments.cpp - ${UVCCAMERA}/ProgressObserver.cpp - ${UVCCAMERA}/JniUVCCamera.cpp - ${UVCCAMERA}/JpegBenchmark.cpp - ${UVCCAMERA}/LoadJpegImageFromAssetsUseCase.cpp - ${UVCCAMERA}/JniJpegBenchmark.cpp + ${UVCCAMERA}/src/_onload.cpp + ${UVCCAMERA}/src/UVCCamera.cpp + ${UVCCAMERA}/src/ImageUseCases.cpp + ${UVCCAMERA}/src/UVCPreviewBase.cpp + ${UVCCAMERA}/src/UVCPreviewJni.cpp + ${UVCCAMERA}/src/UVCCameraAdjustments.cpp + ${UVCCAMERA}/src/ProgressObserver.cpp + ${UVCCAMERA}/src/JniUVCCamera.cpp + ${UVCCAMERA}/src/JpegBenchmark.cpp + ${UVCCAMERA}/src/LoadJpegImageFromAssetsUseCase.cpp + ${UVCCAMERA}/src/JniJpegBenchmark.cpp ) diff --git a/libausbc/src/main/jni/UVCCamera/DI.h b/libausbc/src/main/jni/UVCCamera/include/DI.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/DI.h rename to libausbc/src/main/jni/UVCCamera/include/DI.h diff --git a/libausbc/src/main/jni/UVCCamera/ImageUseCases.h b/libausbc/src/main/jni/UVCCamera/include/ImageUseCases.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/ImageUseCases.h rename to libausbc/src/main/jni/UVCCamera/include/ImageUseCases.h diff --git a/libausbc/src/main/jni/UVCCamera/JniJpegBenchmark.h b/libausbc/src/main/jni/UVCCamera/include/JniJpegBenchmark.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/JniJpegBenchmark.h rename to libausbc/src/main/jni/UVCCamera/include/JniJpegBenchmark.h diff --git a/libausbc/src/main/jni/UVCCamera/JpegBenchmark.h b/libausbc/src/main/jni/UVCCamera/include/JpegBenchmark.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/JpegBenchmark.h rename to libausbc/src/main/jni/UVCCamera/include/JpegBenchmark.h diff --git a/libausbc/src/main/jni/UVCCamera/LoadJpegImageFromAssetsUseCase.h b/libausbc/src/main/jni/UVCCamera/include/LoadJpegImageFromAssetsUseCase.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/LoadJpegImageFromAssetsUseCase.h rename to libausbc/src/main/jni/UVCCamera/include/LoadJpegImageFromAssetsUseCase.h diff --git a/libausbc/src/main/jni/UVCCamera/ProgressObserver.h b/libausbc/src/main/jni/UVCCamera/include/ProgressObserver.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/ProgressObserver.h rename to libausbc/src/main/jni/UVCCamera/include/ProgressObserver.h diff --git a/libausbc/src/main/jni/UVCCamera/UVCCamera.h b/libausbc/src/main/jni/UVCCamera/include/UVCCamera.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/UVCCamera.h rename to libausbc/src/main/jni/UVCCamera/include/UVCCamera.h diff --git a/libausbc/src/main/jni/UVCCamera/UVCCameraAdjustments.h b/libausbc/src/main/jni/UVCCamera/include/UVCCameraAdjustments.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/UVCCameraAdjustments.h rename to libausbc/src/main/jni/UVCCamera/include/UVCCameraAdjustments.h diff --git a/libausbc/src/main/jni/UVCCamera/UVCConstants.h b/libausbc/src/main/jni/UVCCamera/include/UVCConstants.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/UVCConstants.h rename to libausbc/src/main/jni/UVCCamera/include/UVCConstants.h diff --git a/libausbc/src/main/jni/UVCCamera/UVCPreviewBase.h b/libausbc/src/main/jni/UVCCamera/include/UVCPreviewBase.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/UVCPreviewBase.h rename to libausbc/src/main/jni/UVCCamera/include/UVCPreviewBase.h diff --git a/libausbc/src/main/jni/UVCCamera/UVCPreviewJni.h b/libausbc/src/main/jni/UVCCamera/include/UVCPreviewJni.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/UVCPreviewJni.h rename to libausbc/src/main/jni/UVCCamera/include/UVCPreviewJni.h diff --git a/libausbc/src/main/jni/UVCCamera/_onload.h b/libausbc/src/main/jni/UVCCamera/include/_onload.h similarity index 100% rename from libausbc/src/main/jni/UVCCamera/_onload.h rename to libausbc/src/main/jni/UVCCamera/include/_onload.h diff --git a/libausbc/src/main/jni/UVCCamera/ImageUseCases.cpp b/libausbc/src/main/jni/UVCCamera/src/ImageUseCases.cpp similarity index 99% rename from libausbc/src/main/jni/UVCCamera/ImageUseCases.cpp rename to libausbc/src/main/jni/UVCCamera/src/ImageUseCases.cpp index 2d87a8235..09f7287c8 100644 --- a/libausbc/src/main/jni/UVCCamera/ImageUseCases.cpp +++ b/libausbc/src/main/jni/UVCCamera/src/ImageUseCases.cpp @@ -20,7 +20,7 @@ #include "jpeglib.h" #endif #ifdef USE_TURBOJPEG - #include + #include "turbojpeg.h" #endif LoadJpegImageUseCase::Result LoadJpegImageFromFileUseCase::load(std::string imageId) { diff --git a/libausbc/src/main/jni/UVCCamera/JniJpegBenchmark.cpp b/libausbc/src/main/jni/UVCCamera/src/JniJpegBenchmark.cpp similarity index 99% rename from libausbc/src/main/jni/UVCCamera/JniJpegBenchmark.cpp rename to libausbc/src/main/jni/UVCCamera/src/JniJpegBenchmark.cpp index f4cd9cea9..0522ed731 100644 --- a/libausbc/src/main/jni/UVCCamera/JniJpegBenchmark.cpp +++ b/libausbc/src/main/jni/UVCCamera/src/JniJpegBenchmark.cpp @@ -19,7 +19,6 @@ #include #include #include -#include "JpegBenchmark.h" #include "utilbase.h" #include #include diff --git a/libausbc/src/main/jni/UVCCamera/JniUVCCamera.cpp b/libausbc/src/main/jni/UVCCamera/src/JniUVCCamera.cpp similarity index 100% rename from libausbc/src/main/jni/UVCCamera/JniUVCCamera.cpp rename to libausbc/src/main/jni/UVCCamera/src/JniUVCCamera.cpp diff --git a/libausbc/src/main/jni/UVCCamera/JpegBenchmark.cpp b/libausbc/src/main/jni/UVCCamera/src/JpegBenchmark.cpp similarity index 100% rename from libausbc/src/main/jni/UVCCamera/JpegBenchmark.cpp rename to libausbc/src/main/jni/UVCCamera/src/JpegBenchmark.cpp diff --git a/libausbc/src/main/jni/UVCCamera/LoadJpegImageFromAssetsUseCase.cpp b/libausbc/src/main/jni/UVCCamera/src/LoadJpegImageFromAssetsUseCase.cpp similarity index 100% rename from libausbc/src/main/jni/UVCCamera/LoadJpegImageFromAssetsUseCase.cpp rename to libausbc/src/main/jni/UVCCamera/src/LoadJpegImageFromAssetsUseCase.cpp diff --git a/libausbc/src/main/jni/UVCCamera/ProgressObserver.cpp b/libausbc/src/main/jni/UVCCamera/src/ProgressObserver.cpp similarity index 100% rename from libausbc/src/main/jni/UVCCamera/ProgressObserver.cpp rename to libausbc/src/main/jni/UVCCamera/src/ProgressObserver.cpp diff --git a/libausbc/src/main/jni/UVCCamera/UVCCamera.cpp b/libausbc/src/main/jni/UVCCamera/src/UVCCamera.cpp similarity index 100% rename from libausbc/src/main/jni/UVCCamera/UVCCamera.cpp rename to libausbc/src/main/jni/UVCCamera/src/UVCCamera.cpp diff --git a/libausbc/src/main/jni/UVCCamera/UVCCameraAdjustments.cpp b/libausbc/src/main/jni/UVCCamera/src/UVCCameraAdjustments.cpp similarity index 100% rename from libausbc/src/main/jni/UVCCamera/UVCCameraAdjustments.cpp rename to libausbc/src/main/jni/UVCCamera/src/UVCCameraAdjustments.cpp diff --git a/libausbc/src/main/jni/UVCCamera/UVCPreviewBase.cpp b/libausbc/src/main/jni/UVCCamera/src/UVCPreviewBase.cpp similarity index 99% rename from libausbc/src/main/jni/UVCCamera/UVCPreviewBase.cpp rename to libausbc/src/main/jni/UVCCamera/src/UVCPreviewBase.cpp index 41eebae16..ab7b234ae 100644 --- a/libausbc/src/main/jni/UVCCamera/UVCPreviewBase.cpp +++ b/libausbc/src/main/jni/UVCCamera/src/UVCPreviewBase.cpp @@ -23,7 +23,7 @@ * Files in the jni/libjpeg, jni/libusb, jin/libuvc, jni/rapidjson folder may have a different license, see the respective files. */ -#include +#include #include #include "utilbase.h" #include "UVCPreviewBase.h" diff --git a/libausbc/src/main/jni/UVCCamera/UVCPreviewJni.cpp b/libausbc/src/main/jni/UVCCamera/src/UVCPreviewJni.cpp similarity index 99% rename from libausbc/src/main/jni/UVCCamera/UVCPreviewJni.cpp rename to libausbc/src/main/jni/UVCCamera/src/UVCPreviewJni.cpp index d762030a0..4fa12d90a 100644 --- a/libausbc/src/main/jni/UVCCamera/UVCPreviewJni.cpp +++ b/libausbc/src/main/jni/UVCCamera/src/UVCPreviewJni.cpp @@ -23,7 +23,7 @@ * Files in the jni/libjpeg, jni/libusb, jin/libuvc folder may have a different license, see the respective files. */ -#include +#include #include "UVCPreviewJni.h" int UVCPreviewJni::setPreviewDisplay(ANativeWindow *preview_window) { diff --git a/libausbc/src/main/jni/UVCCamera/_onload.cpp b/libausbc/src/main/jni/UVCCamera/src/_onload.cpp similarity index 100% rename from libausbc/src/main/jni/UVCCamera/_onload.cpp rename to libausbc/src/main/jni/UVCCamera/src/_onload.cpp diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index d8982b019..8506a8b34 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -2,28 +2,41 @@ cmake_minimum_required(VERSION 3.22) project(LinuxUvcTests) +cmake_path(GET CMAKE_CURRENT_LIST_DIR PARENT_PATH ROOT_DIR) +set(UVCCAMERA ${ROOT_DIR}/libausbc/src/main/jni/UVCCamera) + set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED True) -find_package( Threads REQUIRED ) +include(FetchContent) +FetchContent_Declare( + Catch2 + GIT_REPOSITORY https://github.com/catchorg/Catch2.git + GIT_TAG v3.5.3 +) +FetchContent_MakeAvailable(Catch2) + +find_package(PkgConfig REQUIRED) +find_package(Threads REQUIRED) find_package (JPEG REQUIRED) #set(USE_TURBOJPEG 1) set(USE_LIBJPEG 1) include_directories( - ../libausbc/src/main/jni/UVCCamera/ + ${UVCCAMERA}/include/ + ./include/ ) find_package(SDL2 REQUIRED) add_executable(uvccapture - SdlTools.cpp - UvcCamera.cpp - uvccapture.cpp - ../libausbc/src/main/jni/UVCCamera/ImageUseCases.cpp + ./src/SdlTools.cpp + ./src/UvcCamera.cpp + ./src/uvccapture.cpp + ${UVCCAMERA}/src/ImageUseCases.cpp ) target_link_libraries( @@ -33,10 +46,10 @@ target_link_libraries( add_executable(jpegbenchmark - jpegdecodebenchmark.cpp - ../libausbc/src/main/jni/UVCCamera/ImageUseCases.cpp - ../libausbc/src/main/jni/UVCCamera/JpegBenchmark.cpp - ../libausbc/src/main/jni/UVCCamera/ProgressObserver.cpp + ./src/jpegdecodebenchmark.cpp + ${UVCCAMERA}/src/ImageUseCases.cpp + ${UVCCAMERA}/src/JpegBenchmark.cpp + ${UVCCAMERA}/src/ProgressObserver.cpp ) if(USE_TURBOJPEG) @@ -58,6 +71,28 @@ if (USE_LIBJPEG) ${CMAKE_THREAD_LIBS_INIT}) endif() -# add_executable(unix_socket_client unix_socket_client.cpp) -# add_executable(unix_socket_server unix_socket_server.cpp) +## +## USB Audio devices tests +## + +pkg_check_modules(LibUSB REQUIRED libusb-1.0) + +if(LibUSB_FOUND) + include_directories(${LibUSB_INCLUDE_DIRS}) +else() + message(FATAL_ERROR "LibUSB not found. Please install libusb-dev (or equivalent) on your system.") +endif() + +add_executable(uaccapture + ./src/uaccapture.cpp + ./src/UacSource.cpp + ) + +target_link_libraries(uaccapture ${LibUSB_LIBRARIES}) +# Enable testing with CTest +enable_testing() + +# add_test(NAME DemoTests COMMAND catch2_tests) +add_executable(tests test/test_catch2.cpp) +target_link_libraries(tests PRIVATE Catch2::Catch2WithMain) \ No newline at end of file diff --git a/linux/SdlTools.h b/linux/include/SdlTools.h similarity index 100% rename from linux/SdlTools.h rename to linux/include/SdlTools.h diff --git a/linux/include/UacSource.h b/linux/include/UacSource.h new file mode 100644 index 000000000..cf3220829 --- /dev/null +++ b/linux/include/UacSource.h @@ -0,0 +1,52 @@ +#pragma once + +#include +#include +#include // For writing to a file + +class UacSource { +public: + class Error : public std::exception { + private: + std::string message; + public: + Error(const char* msg) : message(msg) {} + Error(const std::string& msg) : message(msg) {} + const char* what() const noexcept { + return message.c_str(); + } + }; + + struct StartConfiguration { + const uint16_t vendor_id; + const uint16_t product_id; + const int interface_number; + const int endpoint_address; + }; +public: + virtual ~UacSource() = default; + virtual void init() = 0; + virtual void deinit() = 0; + virtual void test(const StartConfiguration &cfg) = 0; +}; + +class UacSourceImpl : public UacSource { +public: + +protected: + libusb_context* ctx = nullptr; + + libusb_device_handle *handle; + int endpoint; + std::ofstream outputFile; +protected: + static void entryPoint(UacSourceImpl* uacSource); + libusb_device_handle *findAudioDevice(const StartConfiguration &cfg); + void handleAudioData(); +public: + UacSourceImpl(); + ~UacSourceImpl() override; + void init() override; + void deinit() override; + void test(const StartConfiguration &cfg) override; +}; \ No newline at end of file diff --git a/linux/UvcCamera.h b/linux/include/UvcCamera.h similarity index 100% rename from linux/UvcCamera.h rename to linux/include/UvcCamera.h diff --git a/linux/SdlTools.cpp b/linux/src/SdlTools.cpp similarity index 100% rename from linux/SdlTools.cpp rename to linux/src/SdlTools.cpp diff --git a/linux/src/UacSource.cpp b/linux/src/UacSource.cpp new file mode 100644 index 000000000..406e7da6d --- /dev/null +++ b/linux/src/UacSource.cpp @@ -0,0 +1,214 @@ +#include "UacSource.h" +#include +#include + +#define LIBUSB_CHECK(ret) \ + if (ret < 0) \ + throw UacSource::Error(libusb_error_name(ret)) + +UacSourceImpl::UacSourceImpl() +{ + // Constructor implementation +} + +UacSourceImpl::~UacSourceImpl() +{ + // Destructor implementation +} + +// Function to find the USB audio device +libusb_device_handle *UacSourceImpl::findAudioDevice(const StartConfiguration &cfg) +{ + libusb_device **dev_list; + ssize_t dev_count = libusb_get_device_list(ctx, &dev_list); + if (dev_count < 0) + { + std::cerr << "Failed to get device list: " << libusb_error_name(dev_count) + << std::endl; + return nullptr; + } + + libusb_device_handle *handle = nullptr; + for (ssize_t i = 0; i < dev_count; ++i) + { + libusb_device_descriptor desc; + int ret = libusb_get_device_descriptor(dev_list[i], &desc); + if (ret < 0) + { + std::cerr << "Failed to get device descriptor: " + << libusb_error_name(ret) << std::endl; + continue; // Skip to the next device + } + + if (desc.idVendor == cfg.vendor_id && desc.idProduct == cfg.product_id) + { + ret = libusb_open(dev_list[i], &handle); + if (ret < 0) + { + std::cerr << "Failed to open device: " + << libusb_error_name(ret) << std::endl; + handle = nullptr; // Ensure handle is null + } + else + { + std::cout << "Found and opened audio device: Vendor ID = " + << cfg.vendor_id << ", Product ID = " << cfg.product_id << std::endl; + break; // Exit the loop when device is found and opened. + } + } + } + libusb_free_device_list(dev_list, 1); // Free the device list + return handle; +} + +void UacSourceImpl::entryPoint(UacSourceImpl* uacSource) +{ + uacSource->handleAudioData(); +} + +void UacSourceImpl::test(const StartConfiguration &cfg) +{ + + // Replace with your device's actual vendor and product IDs. + uint16_t vendor_id = 0x12d1; // Example: Rode Vendor ID + uint16_t product_id = 0x0010; // Example: Rode NT-USB+ Product ID + + libusb_device_handle *handle = findAudioDevice(cfg); + if (!handle) + { + std::cerr << "Audio device not found or could not be opened." << std::endl; + libusb_exit(ctx); + return; + } + std::cout << "Audio device opened successfully." << std::endl; + + // Claim the audio interface. The interface number (0) may need to be + // changed. You'll need to determine the correct interface number + // for your device, possibly by using lsusb -v or examining the device + // with a USB analyzer. + int interface_number = 1; // <-- IMPORTANT: May need to change! + + int ret = libusb_detach_kernel_driver(handle, interface_number); + if (ret == 0) + { + std::cout << "Kernel driver detached." << std::endl; + // Now try to claim the interface + ret = libusb_claim_interface(handle, interface_number); + } + else if (ret == LIBUSB_ERROR_NOT_FOUND) + { + std::cout << "No kernel driver attached to interface." << std::endl; + ret = libusb_claim_interface(handle, interface_number); + } + else + { + std::cerr << "Failed to detach kernel driver: " + << libusb_error_name(ret) << std::endl; + // Handle the error appropriately (e.g., exit or try another approach) + } + + ret = libusb_claim_interface(handle, interface_number); + if (ret < 0) + { + std::cerr << "Failed to claim interface " << interface_number << ": " + << libusb_error_name(ret) << std::endl; + libusb_close(handle); + libusb_exit(ctx); + return; + } + std::cout << "Claimed interface " << interface_number << std::endl; + + // Find the endpoint address. This is crucial and device-specific. + // You *must* determine the correct endpoint address for your device + // using a tool like `lsusb -v`. Look for an endpoint with + // `Direction = IN` and `Transfer Type = Bulk` or `Isochronous`. + int endpoint_address = 0x82; // Example: <-- IMPORTANT: May need to change! + + // Open a file to save the captured audio data + std::ofstream outputFile("captured_audio.raw", std::ios::binary); + if (!outputFile.is_open()) + { + std::cerr << "Could not open output file!" << std::endl; + libusb_release_interface(handle, interface_number); + libusb_close(handle); + libusb_exit(ctx); + return; + } + + // Start the audio data handling thread + std::thread audioThread(entryPoint, this); // Pass the file stream + + // Keep the main thread running to prevent the program from exiting + // prematurely. You might want to add a signal handler (e.g., for Ctrl+C) + // to stop the recording and clean up resources. + std::cout << "Capturing audio... Press Ctrl+C to stop." << std::endl; + std::this_thread::sleep_for(std::chrono::seconds(10)); + + // The following code will never be reached in the current loop. + // You would need to modify the loop (e.g., with a signal handler) + // to break out of it and execute this cleanup. + audioThread.join(); // Wait for the thread to finish + libusb_release_interface(handle, interface_number); // Release interface + libusb_attach_kernel_driver(handle, interface_number); // Reattach kernel driver + libusb_close(handle); // Close the device + outputFile.close(); // Close the file +} + +void UacSourceImpl::init() +{ + int ret = libusb_init(&ctx); + LIBUSB_CHECK(ret); + libusb_set_option(ctx, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_INFO); +} + +void UacSourceImpl::deinit() +{ + libusb_exit(ctx); +} + +// Function to handle audio data transfer +void UacSourceImpl::handleAudioData() +{ // Pass the file stream + unsigned char buffer[4096]; // Adjust buffer size as needed + int transferred = 0; + int ret = 0; + + while (true) + { + ret = libusb_bulk_transfer(handle, endpoint, buffer, sizeof(buffer), + &transferred, 0); // No timeout + if (ret == LIBUSB_ERROR_TIMEOUT) + { + // Handle timeout if needed, or just continue + std::cerr << "Timeout occurred" << std::endl; + continue; + } + else if (ret < 0 && ret != LIBUSB_ERROR_TIMEOUT) + { + std::cerr << "Error in bulk transfer: " << libusb_error_name(ret) + << std::endl; + break; // Exit loop on error + } + else if (ret == 0) + { + // Successful transfer + if (transferred > 0) + { + // Do something with the audio data. For example: + std::cout << "Received " << transferred << " bytes of audio data." + << std::endl; + // printHex(buffer, transferred); // Print hex data + + // Write the data to the output file + outputFile.write(reinterpret_cast(buffer), transferred); + if (outputFile.fail()) + { + std::cerr << "Error writing to file!" << std::endl; + break; // Stop loop + } + } + } + // Add a small delay + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } +} \ No newline at end of file diff --git a/linux/UvcCamera.cpp b/linux/src/UvcCamera.cpp similarity index 100% rename from linux/UvcCamera.cpp rename to linux/src/UvcCamera.cpp diff --git a/linux/jpegdecodebenchmark.cpp b/linux/src/jpegdecodebenchmark.cpp similarity index 100% rename from linux/jpegdecodebenchmark.cpp rename to linux/src/jpegdecodebenchmark.cpp diff --git a/linux/src/uaccapture.cpp b/linux/src/uaccapture.cpp new file mode 100644 index 000000000..2b49005c5 --- /dev/null +++ b/linux/src/uaccapture.cpp @@ -0,0 +1,49 @@ +#include +#include +#include + +// #include +// #include +// #include +// #include +// #include + +#include "UacSource.h" + + +// Error handling macro for libusb +#define LIBUSB_CHECK(ret) \ + if (ret < 0) \ + { \ + std::cerr << "libusb error " << ret << " at " << __FILE__ << ":" << __LINE__ << ": " \ + << libusb_error_name(ret) << std::endl; \ + libusb_exit(NULL); \ + return 1; \ + } + +// Function to print raw audio data as a hex string (for debugging) +void printHex(const unsigned char *data, int len) +{ + for (int i = 0; i < len; ++i) + { + printf("%02X ", data[i]); + if ((i + 1) % 16 == 0) + { + printf("\n"); + } + } + printf("\n"); +} + +int main(void) +{ + UacSourceImpl uacSource; + uacSource.init(); + uacSource.test({ + .vendor_id = 0x12d1, + .product_id = 0x0010, + .interface_number = 1, + .endpoint_address = 0x82}); + uacSource.deinit(); // Deinitialize UacSource + return 0; +} diff --git a/linux/unix_socket_client.cpp b/linux/src/unix_socket_client.cpp similarity index 100% rename from linux/unix_socket_client.cpp rename to linux/src/unix_socket_client.cpp diff --git a/linux/unix_socket_server.cpp b/linux/src/unix_socket_server.cpp similarity index 100% rename from linux/unix_socket_server.cpp rename to linux/src/unix_socket_server.cpp diff --git a/linux/uvccapture.cpp b/linux/src/uvccapture.cpp similarity index 100% rename from linux/uvccapture.cpp rename to linux/src/uvccapture.cpp diff --git a/linux/test/test_catch2.cpp b/linux/test/test_catch2.cpp new file mode 100644 index 000000000..ad194892f --- /dev/null +++ b/linux/test/test_catch2.cpp @@ -0,0 +1,5 @@ +#include + +TEST_CASE("Just test true", "[calculator]") { + REQUIRE(1 == 1); +}