But even at 20 Ms/s, with 14-bit samples passed in 2-byte shorts,
we've exceeded the capacity of the USB bus. It would be pretty easy
to build a sample-packer that would pass 16 samples in 14 bytes
(rather than in 16 bytes), which would save us 1/8th of the bandwidth.
That would get the data rate to 35 Mbytes/sec, right at the hairy edge
of what USB2 can do. To get more headroom, we could round or truncate
the samples from 14 to 12 bits, again with FPGA code. (Indeed, a nice
sample rate converter should probably also offer sample size
conversion, letting you grab 20ksamp/s of 7-bit samples, or 32.778403
Msamp/s of 8-bit samples, or 55.3 Msamp/s of 4-bit samples, or
whatever else you want. It might even be able to give you 20 ksamp/s
of 16-bit or 32-bit samples, I don't know the math involved.) (C++
code on the CPU side of the USB bus would unpack these 14- or 12-bit,
or shorter, samples into shorts again.)