]> git.sesse.net Git - bmusb/blobdiff - bmusb.cpp
Add support for persistent USB device memory.
[bmusb] / bmusb.cpp
index d726f0f747848142a7a1827a758ae7d302c8b12b..ed7a1f5caa42874909bf13804210322ee34942b5 100644 (file)
--- a/bmusb.cpp
+++ b/bmusb.cpp
@@ -752,7 +752,7 @@ libusb_device_handle *open_card(int card_index, string *description)
                }
 
                char buf[256];
-               snprintf(buf, sizeof(buf), "Card %d: Bus %03u Device %03u  %s",
+               snprintf(buf, sizeof(buf), "USB card %d: Bus %03u Device %03u  %s",
                        int(i), found_cards[i].bus, found_cards[i].port, product_name);
                if (i == size_t(card_index)) {
                        *description = buf;
@@ -782,10 +782,12 @@ libusb_device_handle *open_card(int card_index, string *description)
 void BMUSBCapture::configure_card()
 {
        if (video_frame_allocator == nullptr) {
-               set_video_frame_allocator(new MallocFrameAllocator(FRAME_SIZE, NUM_QUEUED_VIDEO_FRAMES));  // FIXME: leak.
+               owned_video_frame_allocator.reset(new MallocFrameAllocator(FRAME_SIZE, NUM_QUEUED_VIDEO_FRAMES));
+               set_video_frame_allocator(owned_video_frame_allocator.get());
        }
        if (audio_frame_allocator == nullptr) {
-               set_audio_frame_allocator(new MallocFrameAllocator(65536, NUM_QUEUED_AUDIO_FRAMES));  // FIXME: leak.
+               owned_audio_frame_allocator.reset(new MallocFrameAllocator(65536, NUM_QUEUED_AUDIO_FRAMES));
+               set_audio_frame_allocator(owned_audio_frame_allocator.get());
        }
        dequeue_thread_should_quit = false;
        dequeue_thread = thread(&BMUSBCapture::dequeue_thread_func, this);
@@ -1021,12 +1023,12 @@ void BMUSBCapture::configure_card()
        xfr->user_data = this;
        //libusb_submit_transfer(xfr);
 
-       audiofp = fopen("audio.raw", "wb");
+       //audiofp = fopen("audio.raw", "wb");
 
        // 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 = 10;
+               int num_transfers = 6;
                for (int i = 0; i < num_transfers; ++i) {
                        size_t buf_size;
                        int num_iso_pack, size;
@@ -1042,8 +1044,23 @@ void BMUSBCapture::configure_card()
                                num_iso_pack = 80;
                                buf_size = num_iso_pack * size;
                        }
-                       assert(size_t(num_iso_pack * size) <= buf_size);
-                       uint8_t *buf = new uint8_t[buf_size];
+                       int num_bytes = num_iso_pack * size;
+                       assert(size_t(num_bytes) <= buf_size);
+#if LIBUSB_API_VERSION >= 0x01000105
+                       uint8_t *buf = libusb_dev_mem_alloc(devh, num_bytes);
+#else
+                       uint8_t *buf = nullptr;
+#endif
+                       if (buf == nullptr) {
+                               fprintf(stderr, "Failed to allocate persistent DMA memory ");
+#if LIBUSB_API_VERSION >= 0x01000105
+                               fprintf(stderr, "(probably too old kernel; use 4.6.0 or newer).\n");
+#else
+                               fprintf(stderr, "(compiled against too old libusb-1.0).\n");
+#endif
+                               fprintf(stderr, "Will go slower, and likely fail due to memory fragmentation after a few hours.\n");
+                               buf = new uint8_t[num_bytes];
+                       }
 
                        xfr = libusb_alloc_transfer(num_iso_pack);
                        if (!xfr) {