Hi Clemens and Takashi,
I'm back on working on (and hopefully finishing) this series now. One question that remains is ...
On 11/01/2011 09:57 PM, Clemens Ladisch wrote:
On 10/31/2011 01:10 PM, Daniel Mack wrote:
@@ -276,6 +312,15 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) if (((is_playback && attr == USB_ENDPOINT_SYNC_ASYNC) || (! is_playback && attr == USB_ENDPOINT_SYNC_ADAPTIVE)) && altsd->bNumEndpoints >= 2) {
switch (subs->stream->chip->usb_id) {
case USB_ID(0x0763, 0x2080): /* M-Audio FastTrack Ultra */
case USB_ID(0x0763, 0x2081):
ep = 0x81;
iface = usb_ifnum_to_if(dev, 2);
alts = &iface->altsetting[1];
Better check that the device actually has these descriptors.
+int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream, int cmd) +{
- case SNDRV_PCM_TRIGGER_START:
err = start_endpoints(subs);
The trigger callback should execute very quickly; the initial URB submission should be handled in the prepare callback.
This is actually the way the current implementation does it as well. And there seems to be a reason why the inital submission of urbs is done differently for the two directions. In the prepare callback, there's also a comment that says
/* for playback, submit the URBs now; otherwise, the first hwptr_done * updates for all URBs would happen at the same time when starting */ if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) { subs->ops.prepare = prepare_nodata_playback_urb; return start_urbs(subs, runtime); }
I'm not sure whether my patch set should touch this implementation detail for now.
Daniel