TI also makes PCM29xx series which are CODECs. I don't think they make any with I2S both in and out, but I'm not 100% sure.
To clarify things a bit, USB has 'device classes' which specify the interface for certain standard types of gizmos. For example HID is the class used for human interface devices, this class provides for keyboards, mice, and is generic enough that it's often used for simple I/O. USB Audio Class devices implement audio transfer, but nothing else. For that reason, many of these controllers implement both Audio and HID classes, usually so you can attach buttons to the DAC and control the volume in the OS via HID. The way USB is designed, a single device can implement several classes simultaneously.
All of these 'standard' classes are defined in the USB specification, which you can download from usb.org. It's not easy reading, but everything you need is there. If you are interested in a more readable, but still fairly technical overview of USB, this one is quite good:
http://www.beyondlogic.org/usbnutshell/usb1.shtmlAs far as practical applications, there are some real problems with the Audio Class 1.0 spec that make it difficult to use:
- For some reason most OSs only implement the clock mode which requires the device to synchronize with the PC's clock based on the 1ms USB frame timing. This is tricky to implement correctly on the device side, and results in having to use a pretty shitty clock there too.
- I don't remember why this limitation surfaces (I think it's due to frame size and the fact that only a single frame can be sent per 1ms USB poll), but it's only capable of full-duplex at 48khz/24bit maximum. 96khz works in half-duplex. Also 24-bit might not actually be 24-bit in Windows, IIRC
Audio Class 2 is much better, but only Linux (and maybe OSX, but I don't use Apple products) has implemented it, and it's quite a lot more complicated so AFAIK there aren't any premade chips or anything for it yet (probably also driven by the lack of OS vendor support). I think there are ways to hack the commercial drivers available into working with your hardware...but meh... There are some projects / parts out there though. I think XMOS has a specific audio devkit with UAC2 code available. If not, I know the DIYAudio community was working on something. There is SDR-Widget/Audio-Widget which I mentioned in another thread, an AVR32 open-source solution (does UAC1 too). If you look around you can find some people making USB->I2S modules that can do UAC2 too, I know there's a company using them as the basis for a modular signal processing solution, but I can't remember the name right now. Somethnig Brick maybe.
If all you want is basic I2S in/out, I have done it with the STM32F105 (I think...whichever is the lowest that has the I2S peripheral). ST's software package include an Audio Class 1.0 example that works well enough out of the box, and with Win7 or Linux/OSX you can configure it to use an external clock and it works fine, which isn't generally possible with the ASICs (WinXP didn't support this mode, IIRC). That makes it a pretty good basis for a decent fidelity system, but you're still limited to 48KHz if you want full-duplex. It should be possible to make a UAC2 firmware for this chip, but I never got around to it. I have a board layout and might still have my hacked up ST firmware for a half-duplex board using this chip, if you're interested. Haven't touched it in a while, but it worked fine.
Finally, I think this would be a serious challenge to implement on a midrange 8-bit micro like the AVR in the Teensy. I2S is a fairly high bandwidth interface, and these chips don't generally have a peripheral to handle it. Getting the timing right would be hard (you'd probably have to abuse both timers and the SPI peripheral to do it), and just consuming the data quickly enough would be a fair challenge also, depending on how the USB peripheral works. Only 8K of RAM also means you don't have much buffer available, and tightens your timing requirements. A single packet on the USB with 1ms of audio data would take up almost 1/4 of your RAM. And forget about trying to send data back at the same time
.