Commit 9568f461 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Jaroslav Kysela

[ALSA] usb-audio: factor out packet size calculation code

Modules: USB generic driver

Move the common packet size calculation code from
prepare_startup_playback_urb() and prepare_playback_urb() to a new
function.
Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
parent 7c79b768
...@@ -475,6 +475,18 @@ static int retire_playback_sync_urb_hs(struct snd_usb_substream *subs, ...@@ -475,6 +475,18 @@ static int retire_playback_sync_urb_hs(struct snd_usb_substream *subs,
return 0; return 0;
} }
/* determine the number of frames in the next packet */
static int snd_usb_audio_next_packet_size(struct snd_usb_substream *subs)
{
if (subs->fill_max)
return subs->maxframesize;
else {
subs->phase = (subs->phase & 0xffff)
+ (subs->freqm << subs->datainterval);
return min(subs->phase >> 16, subs->maxframesize);
}
}
/* /*
* Prepare urb for streaming before playback starts. * Prepare urb for streaming before playback starts.
* *
...@@ -492,16 +504,7 @@ static int prepare_startup_playback_urb(struct snd_usb_substream *subs, ...@@ -492,16 +504,7 @@ static int prepare_startup_playback_urb(struct snd_usb_substream *subs,
urb->dev = ctx->subs->dev; urb->dev = ctx->subs->dev;
urb->number_of_packets = subs->packs_per_ms; urb->number_of_packets = subs->packs_per_ms;
for (i = 0; i < subs->packs_per_ms; ++i) { for (i = 0; i < subs->packs_per_ms; ++i) {
/* calculate the size of a packet */ counts = snd_usb_audio_next_packet_size(subs);
if (subs->fill_max)
counts = subs->maxframesize; /* fixed */
else {
subs->phase = (subs->phase & 0xffff)
+ (subs->freqm << subs->datainterval);
counts = subs->phase >> 16;
if (counts > subs->maxframesize)
counts = subs->maxframesize;
}
urb->iso_frame_desc[i].offset = offs * stride; urb->iso_frame_desc[i].offset = offs * stride;
urb->iso_frame_desc[i].length = counts * stride; urb->iso_frame_desc[i].length = counts * stride;
offs += counts; offs += counts;
...@@ -538,16 +541,7 @@ static int prepare_playback_urb(struct snd_usb_substream *subs, ...@@ -538,16 +541,7 @@ static int prepare_playback_urb(struct snd_usb_substream *subs,
urb->number_of_packets = 0; urb->number_of_packets = 0;
spin_lock_irqsave(&subs->lock, flags); spin_lock_irqsave(&subs->lock, flags);
for (i = 0; i < ctx->packets; i++) { for (i = 0; i < ctx->packets; i++) {
/* calculate the size of a packet */ counts = snd_usb_audio_next_packet_size(subs);
if (subs->fill_max)
counts = subs->maxframesize; /* fixed */
else {
subs->phase = (subs->phase & 0xffff)
+ (subs->freqm << subs->datainterval);
counts = subs->phase >> 16;
if (counts > subs->maxframesize)
counts = subs->maxframesize;
}
/* set up descriptor */ /* set up descriptor */
urb->iso_frame_desc[i].offset = offs * stride; urb->iso_frame_desc[i].offset = offs * stride;
urb->iso_frame_desc[i].length = counts * stride; urb->iso_frame_desc[i].length = counts * stride;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment