2 Calf Box, an open source musical instrument.
3 Copyright (C) 2010-2013 Krzysztof Foltman
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "usbio_impl.h"
27 #define NUM_SYNC_PACKETS 10
29 #define MULTIMIX_EP_PLAYBACK 0x02
30 //#define MULTIMIX_EP_CAPTURE 0x86
31 #define MULTIMIX_EP_SYNC 0x81
33 #define NUM_CPUTIME_ENTRIES 100
35 static int register_cpu_time
= 1;
36 static float real_time_registry
[NUM_CPUTIME_ENTRIES
];
37 static float cpu_time_registry
[NUM_CPUTIME_ENTRIES
];
38 static int cpu_time_write_ptr
= 0;
39 static void usbio_play_buffer_adaptive(struct cbox_usb_io_impl
*uii
);
41 ///////////////////////////////////////////////////////////////////////////////
43 static gboolean
set_endpoint_sample_rate(struct libusb_device_handle
*h
, int sample_rate
, int ep
)
46 freq_data
[0] = sample_rate
& 0xFF;
47 freq_data
[1] = (sample_rate
& 0xFF00) >> 8;
48 freq_data
[2] = (sample_rate
& 0xFF0000) >> 16;
49 if (libusb_control_transfer(h
, 0x22, 0x01, 256, ep
, freq_data
, 3, USB_DEVICE_SETUP_TIMEOUT
) != 3)
54 ///////////////////////////////////////////////////////////////////////////////
56 gboolean
usbio_open_audio_interface(struct cbox_usb_io_impl
*uii
, struct cbox_usb_audio_info
*uainf
, struct libusb_device_handle
*handle
, GError
**error
)
58 if (uii
->output_resolution
!= 2 && uii
->output_resolution
!= 3)
60 g_set_error(error
, CBOX_MODULE_ERROR
, CBOX_MODULE_ERROR_FAILED
, "Only 16-bit or 24-bit output resolution is supported.");
63 if (!configure_usb_interface(handle
, uainf
->udi
->bus
, uainf
->udi
->devadr
, uainf
->intf
, uainf
->alt_setting
, "audio (class driver)", error
))
65 if (!set_endpoint_sample_rate(handle
, uii
->sample_rate
, uainf
->epdesc
.bEndpointAddress
))
67 g_set_error(error
, CBOX_MODULE_ERROR
, CBOX_MODULE_ERROR_FAILED
, "Cannot set sample rate on class-compliant USB audio device.");
70 uii
->play_function
= usbio_play_buffer_adaptive
;
71 uii
->handle_audiodev
= handle
;
72 uii
->audio_output_endpoint
= uainf
->epdesc
.bEndpointAddress
;
73 uii
->audio_output_pktsize
= uainf
->epdesc
.wMaxPacketSize
; // 48 * 2 * uii->output_resolution;
74 uii
->audio_sync_endpoint
= 0;
78 ///////////////////////////////////////////////////////////////////////////////
80 static gboolean
claim_multimix_interfaces(struct cbox_usb_io_impl
*uii
, struct libusb_device_handle
*handle
, int bus
, int devadr
, GError
**error
)
82 for (int ifno
= 0; ifno
< 2; ifno
++)
84 if (!configure_usb_interface(handle
, bus
, devadr
, ifno
, 1, "audio (MultiMix driver)", error
))
90 gboolean
usbio_open_audio_interface_multimix(struct cbox_usb_io_impl
*uii
, int bus
, int devadr
, struct libusb_device_handle
*handle
, GError
**error
)
92 if (uii
->output_resolution
!= 3)
94 g_set_error(error
, CBOX_MODULE_ERROR
, CBOX_MODULE_ERROR_FAILED
, "Only 24-bit output resolution is supported.");
97 if (!claim_multimix_interfaces(uii
, handle
, bus
, devadr
, error
))
99 if (!set_endpoint_sample_rate(handle
, uii
->sample_rate
, MULTIMIX_EP_PLAYBACK
))
101 g_set_error(error
, CBOX_MODULE_ERROR
, CBOX_MODULE_ERROR_FAILED
, "Cannot set sample rate on Alesis Multimix.");
105 uii
->play_function
= usbio_play_buffer_asynchronous
;
106 uii
->handle_audiodev
= handle
;
107 uii
->audio_output_endpoint
= MULTIMIX_EP_PLAYBACK
;
108 uii
->audio_output_pktsize
= 156;
109 uii
->audio_sync_endpoint
= MULTIMIX_EP_SYNC
;
113 ///////////////////////////////////////////////////////////////////////////////
115 static void calc_output_buffer(struct cbox_usb_io_impl
*uii
)
117 struct timespec tvs1
, tve1
, tvs2
, tve2
;
118 if (register_cpu_time
)
120 clock_gettime(CLOCK_MONOTONIC_RAW
, &tvs1
);
121 clock_gettime(CLOCK_THREAD_CPUTIME_ID
, &tvs2
);
123 struct cbox_io
*io
= uii
->ioi
.pio
;
124 uint32_t buffer_size
= io
->io_env
.buffer_size
;
125 for (int b
= 0; b
< uii
->output_channels
; b
++)
126 memset(io
->output_buffers
[b
], 0, buffer_size
* sizeof(float));
127 for (GList
*p
= uii
->rt_midi_ports
; p
; p
= p
->next
)
129 struct cbox_usb_midi_interface
*umi
= p
->data
;
130 if (umi
->input_port
->hdr
.enable_appsink
&& umi
->input_port
&& umi
->input_port
->hdr
.buffer
.count
)
131 cbox_midi_appsink_supply(&umi
->input_port
->hdr
.appsink
, &umi
->input_port
->hdr
.buffer
);
133 io
->cb
->process(io
->cb
->user_data
, io
, buffer_size
);
134 for (GList
*p
= uii
->rt_midi_ports
; p
; p
= p
->next
)
136 struct cbox_usb_midi_interface
*umi
= p
->data
;
138 cbox_midi_buffer_clear(&umi
->input_port
->hdr
.buffer
);
140 for (GSList
*p
= io
->midi_outputs
; p
; p
= p
->next
)
142 struct cbox_usb_midi_output
*umo
= p
->data
;
143 usbio_fill_midi_output_buffer(umo
);
145 if (register_cpu_time
)
147 clock_gettime(CLOCK_MONOTONIC_RAW
, &tve1
);
148 clock_gettime(CLOCK_THREAD_CPUTIME_ID
, &tve2
);
149 float time1
= tve1
.tv_sec
- tvs1
.tv_sec
+ (tve1
.tv_nsec
- tvs1
.tv_nsec
) / 1000000000.0;
150 float time2
= tve2
.tv_sec
- tvs2
.tv_sec
+ (tve2
.tv_nsec
- tvs2
.tv_nsec
) / 1000000000.0;
151 real_time_registry
[cpu_time_write_ptr
] = time1
;
152 cpu_time_registry
[cpu_time_write_ptr
] = time2
;
153 cpu_time_write_ptr
= (cpu_time_write_ptr
+ 1) % NUM_CPUTIME_ENTRIES
;
154 if (time1
> 0.0008 || time2
> 0.0008)
155 g_warning("CPU time = %f ms, real time = %f ms", time2
* 1000, time1
* 1000);
159 static void fill_playback_buffer(struct cbox_usb_io_impl
*uii
, struct libusb_transfer
*transfer
)
161 struct cbox_io
*io
= uii
->ioi
.pio
;
162 uint32_t buffer_size
= io
->io_env
.buffer_size
;
163 uint8_t *data8
= (uint8_t*)transfer
->buffer
;
164 int16_t *data
= (int16_t*)transfer
->buffer
;
165 int resolution
= uii
->output_resolution
;
166 int oc
= uii
->output_channels
;
167 int rptr
= uii
->read_ptr
;
168 int nframes
= transfer
->length
/ (resolution
* oc
);
171 for (i
= 0; i
< nframes
; )
173 if (rptr
== buffer_size
)
175 calc_output_buffer(uii
);
178 int left1
= nframes
- i
;
179 int left2
= buffer_size
- rptr
;
183 for (b
= 0; b
< oc
; b
++)
185 float *obuf
= io
->output_buffers
[b
] + rptr
;
188 int16_t *tbuf
= data
+ oc
* i
+ b
;
189 for (j
= 0; j
< left1
; j
++)
191 float v
= 32767 * obuf
[j
];
202 uint8_t *tbuf
= data8
+ (oc
* i
+ b
) * 3;
203 for (j
= 0; j
< left1
; j
++)
205 float v
= 0x7FFFFF * obuf
[j
];
212 tbuf
[1] = (vi
>> 8) & 255;
213 tbuf
[2] = (vi
>> 16) & 255;
221 uii
->read_ptr
= rptr
;
224 static void play_callback_adaptive(struct libusb_transfer
*transfer
)
226 struct usbio_transfer
*xf
= transfer
->user_data
;
227 struct cbox_usb_io_impl
*uii
= xf
->user_data
;
229 if (transfer
->status
== LIBUSB_TRANSFER_CANCELLED
)
231 xf
->cancel_confirm
= 1;
234 if (transfer
->status
== LIBUSB_TRANSFER_NO_DEVICE
)
236 uii
->device_removed
++;
240 int resolution
= uii
->output_resolution
;
241 int oc
= uii
->output_channels
;
242 gboolean init_finished
= uii
->playback_counter
== uii
->playback_buffers
;
243 if (uii
->playback_counter
< uii
->playback_buffers
)
245 // send another URB for the next transfer before re-submitting
247 usbio_play_buffer_adaptive(uii
);
249 // printf("Play Callback! %d %p status %d\n", (int)transfer->length, transfer->buffer, (int)transfer->status);
251 int tlen
= 0, olen
= 0;
252 for (int i
= 0; i
< transfer
->num_iso_packets
; i
++)
254 tlen
+= transfer
->iso_packet_desc
[i
].actual_length
;
255 olen
+= transfer
->iso_packet_desc
[i
].length
;
256 if (transfer
->iso_packet_desc
[i
].status
)
257 printf("ISO error: index = %d i = %d status = %d\n", (int)xf
->index
, i
, transfer
->iso_packet_desc
[i
].status
);
259 uii
->samples_played
+= olen
/ (oc
* resolution
);
260 int nsamps
= uii
->sample_rate
/ 1000;
261 // If time elapsed is greater than
262 int lag
= uii
->desync
/ (1000 * transfer
->num_iso_packets
);
263 if (lag
> 0 && nsamps
< uii
->audio_output_pktsize
)
269 transfer
->length
= nsamps
* transfer
->num_iso_packets
* oc
* resolution
;
270 libusb_set_iso_packet_lengths(transfer
, nsamps
* oc
* resolution
);
274 fill_playback_buffer(uii
, transfer
);
276 // desync value is expressed in milli-frames, i.e. desync of 1000 means 1 frame of lag
277 // It takes 1ms for each iso packet to be transmitted. Each transfer consists of
278 // num_iso_packets packets. So, this transfer took uii->sample_rate milli-frames.
279 uii
->desync
+= transfer
->num_iso_packets
* uii
->sample_rate
;
280 // ... but during that time, tlen/4 samples == tlen/4*1000 millisamples have been
282 uii
->desync
-= transfer
->num_iso_packets
* nsamps
* 1000;
284 if (uii
->no_resubmit
)
286 int err
= usbio_transfer_submit(xf
);
289 if (err
== LIBUSB_ERROR_NO_DEVICE
)
291 uii
->device_removed
++;
292 transfer
->status
= LIBUSB_TRANSFER_NO_DEVICE
;
294 g_warning("Cannot resubmit isochronous transfer, error = %s", libusb_error_name(err
));
298 void usbio_play_buffer_adaptive(struct cbox_usb_io_impl
*uii
)
300 struct usbio_transfer
*t
;
302 int packets
= uii
->iso_packets
;
303 t
= usbio_transfer_new(uii
->usbctx
, "play", uii
->playback_counter
, packets
, uii
);
304 int tsize
= uii
->sample_rate
* 2 * uii
->output_resolution
/ 1000;
305 uint8_t *buf
= (uint8_t *)calloc(packets
, uii
->audio_output_pktsize
);
307 libusb_fill_iso_transfer(t
->transfer
, uii
->handle_audiodev
, uii
->audio_output_endpoint
, buf
, tsize
* packets
, packets
, play_callback_adaptive
, t
, 20000);
308 libusb_set_iso_packet_lengths(t
->transfer
, tsize
);
309 uii
->playback_transfers
[uii
->playback_counter
++] = t
;
311 err
= usbio_transfer_submit(t
);
314 g_warning("Cannot resubmit isochronous transfer, error = %s", libusb_error_name(err
));
315 uii
->playback_counter
--;
317 usbio_transfer_destroy(t
);
318 uii
->playback_transfers
[uii
->playback_counter
] = NULL
;
321 //////////////////////////////////////////////////////////////////////////////////////////
323 static int calc_packet_lengths(struct cbox_usb_io_impl
*uii
, struct libusb_transfer
*t
, int packets
)
327 // printf("sync_freq = %d\n", sync_freq);
328 for (i
= 0; i
< packets
; i
++)
330 int nsamps
= (uii
->sync_freq
- uii
->desync
) / 80;
331 // assert(nsamps > 0);
332 if ((uii
->sync_freq
- uii
->desync
) % 80)
334 //printf("%d sfreq=%d desync=%d nsamps=%d\n", i, uii->sync_freq, uii->desync, nsamps);
336 uii
->desync
= (uii
->desync
+ nsamps
* 80) % uii
->sync_freq
;
337 int v
= (nsamps
) * 2 * uii
->output_resolution
;
338 t
->iso_packet_desc
[i
].length
= v
;
344 void play_callback_asynchronous(struct libusb_transfer
*transfer
)
346 struct usbio_transfer
*xf
= transfer
->user_data
;
347 struct cbox_usb_io_impl
*uii
= xf
->user_data
;
350 if (transfer
->status
== LIBUSB_TRANSFER_CANCELLED
)
352 xf
->cancel_confirm
= TRUE
;
355 if (transfer
->status
== LIBUSB_TRANSFER_NO_DEVICE
)
357 xf
->cancel_confirm
= TRUE
;
358 uii
->device_removed
++;
362 gboolean init_finished
= uii
->playback_counter
== uii
->playback_buffers
;
363 if (uii
->playback_counter
< uii
->playback_buffers
)
365 // send another URB for the next transfer before re-submitting
367 usbio_play_buffer_asynchronous(uii
);
371 printf("Play Callback! %d status %d\n", (int)transfer->length, (int)transfer->status);
372 for (i = 0; i < transfer->num_iso_packets; i++) {
373 if (transfer->iso_packet_desc[i].actual_length)
375 printf("%d: %d %d\n", i, transfer->iso_packet_desc[i].actual_length, transfer->iso_packet_desc[i].status);
379 transfer
->length
= calc_packet_lengths(uii
, transfer
, transfer
->num_iso_packets
);
382 fill_playback_buffer(uii
, transfer
);
384 if (uii
->no_resubmit
)
386 int err
= usbio_transfer_submit(xf
);
389 if (err
== LIBUSB_ERROR_NO_DEVICE
)
391 transfer
->status
= LIBUSB_TRANSFER_NO_DEVICE
;
392 uii
->device_removed
++;
394 g_warning("Cannot submit isochronous transfer, error = %s", libusb_error_name(err
));
398 static struct usbio_transfer
*sync_stuff_asynchronous(struct cbox_usb_io_impl
*uii
, int index
);
400 void usbio_play_buffer_asynchronous(struct cbox_usb_io_impl
*uii
)
402 struct usbio_transfer
*t
;
404 int packets
= uii
->iso_packets_multimix
;
405 t
= usbio_transfer_new(uii
->usbctx
, "play", uii
->playback_counter
, packets
, uii
);
406 int tsize
= calc_packet_lengths(uii
, t
->transfer
, packets
);
407 int bufsize
= uii
->audio_output_pktsize
* packets
;
408 uint8_t *buf
= (uint8_t *)calloc(1, bufsize
);
410 if (!uii
->playback_counter
)
412 for(uii
->sync_counter
= 0; uii
->sync_counter
< uii
->sync_buffers
; uii
->sync_counter
++)
413 uii
->sync_transfers
[uii
->sync_counter
] = sync_stuff_asynchronous(uii
, uii
->sync_counter
);
416 libusb_fill_iso_transfer(t
->transfer
, uii
->handle_audiodev
, uii
->audio_output_endpoint
, buf
, tsize
, packets
, play_callback_asynchronous
, t
, 20000);
417 uii
->playback_transfers
[uii
->playback_counter
++] = t
;
418 err
= usbio_transfer_submit(t
);
421 g_warning("Cannot submit playback urb: %s, error = %s (index = %d, tsize = %d)", libusb_error_name(err
), strerror(errno
), uii
->playback_counter
, tsize
);
423 usbio_transfer_destroy(t
);
424 uii
->playback_transfers
[--uii
->playback_counter
] = NULL
;
428 //////////////////////////////////////////////////////////////////////////////////////////
431 * The Multimix device controls the data rate of the playback stream using a
432 * device-to-host isochronous endpoint. The incoming packets consist of 3 bytes:
433 * a current value of sample rate (kHz) + 2 historical values. I'm only using
434 * the first byte, I haven't yet encountered a situation where using the
435 * second and third byte would be necessary. This seems to work for all
436 * sample rates supported by the Windows driver - 44100, 48000, 88200 and
437 * 96000. It is possible to set sample rate to 64000, but it doesn't work
438 * correctly, and isn't supported by the Windows driver either - it may
439 * require special handling or may be a half-implemented feature in hardware.
440 * The isochronous transfer using 10 packets seems to give acceptable resolution
441 * and latency to avoid over/underruns with supported sample rates.
443 * The non-integer multiples of 1 kHz (like 44.1) are passed as a sequence of
444 * values that average to a desired value (9 values of 44 and one value of 45).
446 * In order to compensate for clock rate difference
447 * between host clock and DAC clock, the sample rate values sent by the device
448 * are either larger (to increase data rate from the host) or smaller than
449 * the nominal frequency value - the driver uses that to adjust the sample frame
450 * counts of individual packets in an isochronous transfer.
453 static void sync_callback(struct libusb_transfer
*transfer
)
455 struct usbio_transfer
*xf
= transfer
->user_data
;
456 struct cbox_usb_io_impl
*uii
= xf
->user_data
;
457 uint8_t *data
= transfer
->buffer
;
458 int i
, ofs
, size
, pkts
;
461 if (transfer
->status
== LIBUSB_TRANSFER_CANCELLED
)
463 xf
->cancel_confirm
= 1;
466 if (transfer
->status
== LIBUSB_TRANSFER_NO_DEVICE
)
468 xf
->cancel_confirm
= 1;
471 // XXXKF handle device disconnected error
474 printf("Sync callback! %p %d packets:", transfer
, transfer
->num_iso_packets
);
478 for (i
= 0; i
< transfer
->num_iso_packets
; i
++) {
479 if (transfer
->iso_packet_desc
[i
].status
)
481 printf("[%02d: actual length is %4d, status is %2d] ", i
, transfer
->iso_packet_desc
[i
].actual_length
, transfer
->iso_packet_desc
[i
].status
);
484 else if (transfer
->iso_packet_desc
[i
].actual_length
)
486 assert(transfer
->iso_packet_desc
[i
].actual_length
== 3);
488 if (i
&& transfer
->iso_packet_desc
[i
- 1].actual_length
)
489 assert(data
[ofs
+ 1] == data
[ofs
- 64]);
490 //printf("%d\n", (int)data[ofs]);
492 printf("%3d ", (int)data
[ofs
]);
498 ofs
+= transfer
->iso_packet_desc
[i
].length
;
501 printf(" (%d of %d)", pkts
, transfer
->num_iso_packets
);
502 if (pkts
== transfer
->num_iso_packets
)
505 uii
->sync_freq
= size
* 10 / pkts
;
507 printf(" size = %4d sync_freq = %4d", size
, uii
->sync_freq
);
509 if (uii
->no_resubmit
)
511 int err
= usbio_transfer_submit(xf
);
514 if (err
== LIBUSB_ERROR_NO_DEVICE
)
523 struct usbio_transfer
*sync_stuff_asynchronous(struct cbox_usb_io_impl
*uii
, int index
)
525 struct usbio_transfer
*t
;
527 int syncbufsize
= 64;
528 int syncbufcount
= NUM_SYNC_PACKETS
;
529 t
= usbio_transfer_new(uii
->usbctx
, "sync", index
, syncbufcount
, uii
);
530 uint8_t *sync_buf
= (uint8_t *)calloc(syncbufcount
, syncbufsize
);
531 libusb_fill_iso_transfer(t
->transfer
, uii
->handle_audiodev
, uii
->audio_sync_endpoint
, sync_buf
, syncbufsize
* syncbufcount
, syncbufcount
, sync_callback
, t
, 20000);
532 libusb_set_iso_packet_lengths(t
->transfer
, syncbufsize
);
534 err
= libusb_submit_transfer(t
->transfer
);
537 g_warning("Cannot submit sync urb: %s", libusb_error_name(err
));
539 usbio_transfer_destroy(t
);
545 ///////////////////////////////////////////////////////////////////////////
547 void cbox_usb_audio_info_init(struct cbox_usb_audio_info
*uai
, struct cbox_usb_device_info
*udi
)
551 uai
->alt_setting
= -1;
552 uai
->epdesc
.found
= FALSE
;
555 void usbio_start_audio_playback(struct cbox_usb_io_impl
*uii
)
558 uii
->samples_played
= 0;
559 uii
->read_ptr
= uii
->ioi
.pio
->io_env
.buffer_size
;
561 uii
->playback_transfers
= malloc(sizeof(struct libusb_transfer
*) * uii
->playback_buffers
);
562 uii
->sync_transfers
= malloc(sizeof(struct libusb_transfer
*) * uii
->sync_buffers
);
564 uii
->playback_counter
= 0;
565 uii
->device_removed
= 0;
566 uii
->sync_freq
= uii
->sample_rate
/ 100;
567 uii
->play_function(uii
);
568 uii
->setup_error
= uii
->playback_counter
== 0;
570 if (!uii
->setup_error
)
572 while(uii
->playback_counter
< uii
->playback_buffers
&& !uii
->device_removed
)
573 libusb_handle_events(uii
->usbctx
);
577 void usbio_stop_audio_playback(struct cbox_usb_io_impl
*uii
)
579 if (uii
->device_removed
)
581 // Wait until all the transfers pending are finished
582 while(uii
->device_removed
< uii
->playback_counter
)
583 libusb_handle_events(uii
->usbctx
);
585 if (uii
->device_removed
|| uii
->setup_error
)
587 // Run the DSP code and send output to bit bucket until engine is stopped.
588 // This ensures that the command queue will still be processed.
589 // Otherwise the GUI thread would hang waiting for the command from
590 // the queue to be completed.
591 g_message("USB Audio output device has been disconnected - switching to null output.");
592 usbio_run_idle_loop(uii
);
596 // Cancel all transfers pending, and wait until they get cancelled
597 for (int i
= 0; i
< uii
->playback_counter
; i
++)
599 if (uii
->playback_transfers
[i
])
600 usbio_transfer_shutdown(uii
->playback_transfers
[i
]);
604 // Free the transfers for the buffers allocated so far. In case of setup
605 // failure, some buffers transfers might not have been created yet.
606 for (int i
= 0; i
< uii
->playback_counter
; i
++)
608 if (uii
->playback_transfers
[i
])
610 free(uii
->playback_transfers
[i
]->transfer
->buffer
);
611 usbio_transfer_destroy(uii
->playback_transfers
[i
]);
612 uii
->playback_transfers
[i
] = NULL
;
615 if (uii
->playback_counter
&& uii
->audio_sync_endpoint
)
617 for (int i
= 0; i
< uii
->sync_counter
; i
++)
619 if (uii
->sync_transfers
[i
])
620 usbio_transfer_shutdown(uii
->sync_transfers
[i
]);
622 for (int i
= 0; i
< uii
->sync_counter
; i
++)
624 if (uii
->sync_transfers
[i
])
626 free(uii
->sync_transfers
[i
]->transfer
->buffer
);
627 usbio_transfer_destroy(uii
->sync_transfers
[i
]);
628 uii
->sync_transfers
[i
] = NULL
;
632 free(uii
->playback_transfers
);
633 free(uii
->sync_transfers
);