@@ -256,8 +256,8 @@ FN_INTERNAL int fnusb_open_subdevices(freenect_device *dev, int index)
256256{
257257 freenect_context * ctx = dev -> parent ;
258258
259- dev -> device_does_motor_control_with_audio = 0 ;
260- dev -> motor_control_with_audio_enabled = 0 ;
259+ dev -> device_does_motor_control_with_audio = 0 ;
260+ dev -> motor_control_with_audio_enabled = 0 ;
261261
262262 dev -> usb_cam .parent = dev ;
263263 dev -> usb_cam .dev = NULL ;
@@ -761,10 +761,22 @@ static void LIBUSB_CALL iso_callback(struct libusb_transfer *xfer)
761761 }
762762}
763763
764- FN_INTERNAL int fnusb_start_iso (fnusb_dev * dev , fnusb_isoc_stream * strm , fnusb_iso_cb cb , int ep , int xfers , int pkts , int len )
764+ FN_INTERNAL int fnusb_get_max_iso_packet_size (fnusb_dev * dev , unsigned char endpoint , int default_size )
765+ {
766+ freenect_context * ctx = dev -> parent -> parent ;
767+
768+ int size = libusb_get_max_iso_packet_size (libusb_get_device (dev -> dev ), endpoint );
769+ if (size <= 0 )
770+ {
771+ FN_WARNING ("libusb_get_max_iso_packet_size() returned %d; using default %d\n" , size , default_size );
772+ size = default_size ;
773+ }
774+ return size ;
775+ }
776+
777+ FN_INTERNAL int fnusb_start_iso (fnusb_dev * dev , fnusb_isoc_stream * strm , fnusb_iso_cb cb , unsigned char endpoint , int xfers , int pkts , int len )
765778{
766779 freenect_context * ctx = dev -> parent -> parent ;
767- int ret , i ;
768780
769781 strm -> parent = dev ;
770782 strm -> cb = cb ;
@@ -776,27 +788,36 @@ FN_INTERNAL int fnusb_start_iso(fnusb_dev *dev, fnusb_isoc_stream *strm, fnusb_i
776788 strm -> dead = 0 ;
777789 strm -> dead_xfers = 0 ;
778790
791+ int i ;
779792 uint8_t * bufp = strm -> buffer ;
780793
781- for (i = 0 ; i < xfers ; i ++ ) {
782- FN_SPEW ("Creating EP %02x transfer #%d\n" , ep , i );
783- strm -> xfers [i ] = libusb_alloc_transfer (pkts );
784-
785- libusb_fill_iso_transfer (strm -> xfers [i ], dev -> dev , ep , bufp , pkts * len , pkts , iso_callback , strm , 0 );
786-
787- libusb_set_iso_packet_lengths (strm -> xfers [i ], len );
794+ for (i = 0 ; i < xfers ; i ++ )
795+ {
796+ FN_SPEW ("Creating endpoint %02x transfer #%d\n" , endpoint , i );
788797
789- ret = libusb_submit_transfer (strm -> xfers [i ]);
790- if (ret < 0 ) {
791- FN_WARNING ("Failed to submit isochronous transfer %d: %d\n" , i , ret );
798+ strm -> xfers [i ] = libusb_alloc_transfer (pkts );
799+ if (strm -> xfers [i ] == NULL )
800+ {
801+ FN_WARNING ("Failed to allocate transfer\n" );
792802 strm -> dead_xfers ++ ;
793803 }
804+ else
805+ {
806+ libusb_fill_iso_transfer (strm -> xfers [i ], dev -> dev , endpoint , bufp , pkts * len , pkts , iso_callback , strm , 0 );
807+ libusb_set_iso_packet_lengths (strm -> xfers [i ], len );
808+
809+ int ret = libusb_submit_transfer (strm -> xfers [i ]);
810+ if (ret < 0 )
811+ {
812+ FN_WARNING ("Failed to submit isochronous transfer %d: %d\n" , i , ret );
813+ strm -> dead_xfers ++ ;
814+ }
815+ }
794816
795817 bufp += pkts * len ;
796818 }
797819
798820 return 0 ;
799-
800821}
801822
802823FN_INTERNAL int fnusb_stop_iso (fnusb_dev * dev , fnusb_isoc_stream * strm )
0 commit comments