X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bmusb.cpp;h=ed7a1f5caa42874909bf13804210322ee34942b5;hb=c753d698b047822c11f5f97b889649a3e582a4c9;hp=d726f0f747848142a7a1827a758ae7d302c8b12b;hpb=a5e46ba4b478f7fae63f3032e574208c0e69cc11;p=bmusb diff --git a/bmusb.cpp b/bmusb.cpp index d726f0f..ed7a1f5 100644 --- 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) {