]> git.sesse.net Git - bmusb/blobdiff - bmusb.cpp
Use even smaller transfers since evidently the kernel has problems allocating 512...
[bmusb] / bmusb.cpp
index 6157a3b5376c658889d993ed759d11079dc5cbed..8639b938969bb0169640e8266c53afcdfb60afea 100644 (file)
--- a/bmusb.cpp
+++ b/bmusb.cpp
@@ -638,8 +638,9 @@ void BMUSBCapture::cb_xfr(struct libusb_transfer *xfr)
        }
 #endif
 
-       if (libusb_submit_transfer(xfr) < 0) {
-               fprintf(stderr, "error re-submitting URB\n");
+       int rc = libusb_submit_transfer(xfr);
+       if (rc < 0) {
+               fprintf(stderr, "error re-submitting URB: %s\n", libusb_error_name(rc));
                exit(1);
        }
 }
@@ -659,6 +660,80 @@ void BMUSBCapture::usb_thread_func()
        }
 }
 
+struct USBCardDevice {
+       uint16_t product;
+       uint8_t bus, port;
+       libusb_device *device;
+};
+
+libusb_device_handle *open_card(int card_index)
+{      
+       libusb_device **devices;
+       ssize_t num_devices = libusb_get_device_list(nullptr, &devices);
+       if (num_devices == -1) {
+               fprintf(stderr, "Error finding USB devices\n");
+               exit(1);
+       }
+       vector<USBCardDevice> found_cards;
+       for (ssize_t i = 0; i < num_devices; ++i) {
+               libusb_device_descriptor desc;
+                if (libusb_get_device_descriptor(devices[i], &desc) < 0) {
+                       fprintf(stderr, "Error getting device descriptor for device %d\n", int(i));
+                       exit(1);
+               }
+
+               uint8_t bus = libusb_get_bus_number(devices[i]);
+               uint8_t port = libusb_get_port_number(devices[i]);
+
+               if (!(desc.idVendor == 0x1edb && desc.idProduct == 0xbd3b) &&
+                   !(desc.idVendor == 0x1edb && desc.idProduct == 0xbd4f)) {
+                       libusb_unref_device(devices[i]);
+                       continue;
+               }
+
+               found_cards.push_back({ desc.idProduct, bus, port, devices[i] });
+       }
+       libusb_free_device_list(devices, 0);
+
+       // Sort the devices to get a consistent ordering.
+       sort(found_cards.begin(), found_cards.end(), [](const USBCardDevice &a, const USBCardDevice &b) {
+               if (a.product != b.product)
+                       return a.product < b.product;
+               if (a.bus != b.bus)
+                       return a.bus < b.bus;
+               return a.port < b.port;
+       });
+
+       for (size_t i = 0; i < found_cards.size(); ++i) {
+               fprintf(stderr, "Card %d: Bus %03u Device %03u ", int(i), found_cards[i].bus, found_cards[i].port);
+               if (found_cards[i].product == 0xbd3b) {
+                       fprintf(stderr, "Intensity Shuttle\n");
+               } else if (found_cards[i].product == 0xbd4f) {
+                       fprintf(stderr, "UltraStudio SDI\n");
+               } else {
+                       assert(false);
+               }
+       }
+
+       if (size_t(card_index) >= found_cards.size()) {
+               fprintf(stderr, "Could not open card %d (only %d found)\n", card_index, int(found_cards.size()));
+               exit(1);
+       }
+
+       libusb_device_handle *devh;
+       int rc = libusb_open(found_cards[card_index].device, &devh);
+       if (rc < 0) {
+               fprintf(stderr, "Error opening card %d: %s\n", card_index, libusb_error_name(rc));
+               exit(1);
+       }
+
+       for (size_t i = 0; i < found_cards.size(); ++i) {
+               libusb_unref_device(found_cards[i].device);
+       }
+
+       return devh;
+}
+
 void BMUSBCapture::configure_card()
 {
        if (video_frame_allocator == nullptr) {
@@ -679,9 +754,7 @@ void BMUSBCapture::configure_card()
                exit(1);
        }
 
-       //struct libusb_device_handle *devh = libusb_open_device_with_vid_pid(nullptr, 0x1edb, 0xbd3b);
-       //struct libusb_device_handle *devh = libusb_open_device_with_vid_pid(nullptr, 0x1edb, 0xbd4f);
-       struct libusb_device_handle *devh = libusb_open_device_with_vid_pid(nullptr, vid, pid);
+       libusb_device_handle *devh = open_card(card_index);
        if (!devh) {
                fprintf(stderr, "Error finding USB device\n");
                exit(1);
@@ -905,7 +978,7 @@ void BMUSBCapture::configure_card()
        // set up isochronous transfers for audio and video
        for (int e = 3; e <= 4; ++e) {
                //int num_transfers = (e == 3) ? 6 : 6;
-               int num_transfers = 6;
+               int num_transfers = 10;
                for (int i = 0; i < num_transfers; ++i) {
                        int num_iso_pack, size;
                        if (e == 3) {
@@ -919,7 +992,7 @@ void BMUSBCapture::configure_card()
                                        size &= ~1023;
                                        size += 1024;
                                }
-                               num_iso_pack = (2 << 18) / size;  // 512 kB.
+                               num_iso_pack = (2 << 16) / size;  // 128 kB.
                                printf("Picking %d packets of 0x%x bytes each\n", num_iso_pack, size);
                        } else {
                                size = 0xc0;