Skip to content

Commit d38af77

Browse files
RenJianingrkhuangtao
authored andcommitted
usb: gadget: f_uac: add pktsize calculating at setting playback srate
Without this patch, we only calculate usb request packet_size when start playback. If PC set sample rate after opening stream, the value of packet_size will not be updated to uac driver and the gadget will send error size of pcm data. Signed-off-by: Ren Jianing <jianing.ren@rock-chips.com> Change-Id: Iaa54ed740c98e5f12bf9cf680b50cf4be931cfbd
1 parent 2ed2ebe commit d38af77

1 file changed

Lines changed: 42 additions & 27 deletions

File tree

drivers/usb/gadget/function/u_audio.c

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,44 @@ int u_audio_set_capture_srate(struct g_audio *audio_dev, int srate)
454454
}
455455
EXPORT_SYMBOL_GPL(u_audio_set_capture_srate);
456456

457+
static void u_audio_set_playback_pktsize(struct g_audio *audio_dev, int srate)
458+
{
459+
struct uac_params *params = &audio_dev->params;
460+
struct snd_uac_chip *uac = audio_dev->uac;
461+
struct usb_gadget *gadget = audio_dev->gadget;
462+
const struct usb_endpoint_descriptor *ep_desc;
463+
struct uac_rtd_params *prm;
464+
unsigned int factor;
465+
466+
prm = &uac->p_prm;
467+
/* set srate before starting playback, epin is not configured */
468+
if (!prm->ep_enabled)
469+
return;
470+
471+
ep_desc = audio_dev->in_ep->desc;
472+
473+
/* pre-calculate the playback endpoint's interval */
474+
if (gadget->speed == USB_SPEED_FULL)
475+
factor = 1000;
476+
else
477+
factor = 8000;
478+
479+
/* pre-compute some values for iso_complete() */
480+
uac->p_framesize = params->p_ssize *
481+
num_channels(params->p_chmask);
482+
uac->p_interval = factor / (1 << (ep_desc->bInterval - 1));
483+
uac->p_pktsize = min_t(unsigned int,
484+
uac->p_framesize *
485+
(params->p_srate_active / uac->p_interval),
486+
prm->max_psize);
487+
488+
if (uac->p_pktsize < prm->max_psize)
489+
uac->p_pktsize_residue = uac->p_framesize *
490+
(params->p_srate_active % uac->p_interval);
491+
else
492+
uac->p_pktsize_residue = 0;
493+
}
494+
457495
int u_audio_set_playback_srate(struct g_audio *audio_dev, int srate)
458496
{
459497
struct snd_kcontrol *ctl = u_audio_get_ctl(audio_dev, "Playback Rate");
@@ -466,6 +504,7 @@ int u_audio_set_playback_srate(struct g_audio *audio_dev, int srate)
466504
schedule_work(&audio_dev->work);
467505

468506
params->p_srate_active = srate;
507+
u_audio_set_playback_pktsize(audio_dev, srate);
469508
snd_ctl_notify(audio_dev->uac->card,
470509
SNDRV_CTL_EVENT_MASK_VALUE, &ctl->id);
471510
return 0;
@@ -546,8 +585,6 @@ int u_audio_start_playback(struct g_audio *audio_dev)
546585
struct usb_ep *ep;
547586
struct uac_rtd_params *prm;
548587
struct uac_params *params = &audio_dev->params;
549-
unsigned int factor;
550-
const struct usb_endpoint_descriptor *ep_desc;
551588
int req_len, i;
552589

553590
audio_dev->usb_state[SET_INTERFACE_IN] = true;
@@ -559,35 +596,13 @@ int u_audio_start_playback(struct g_audio *audio_dev)
559596
prm = &uac->p_prm;
560597
config_ep_by_speed(gadget, &audio_dev->func, ep);
561598

562-
ep_desc = ep->desc;
563-
564-
/* pre-calculate the playback endpoint's interval */
565-
if (gadget->speed == USB_SPEED_FULL)
566-
factor = 1000;
567-
else
568-
factor = 8000;
569-
570-
/* pre-compute some values for iso_complete() */
571-
uac->p_framesize = params->p_ssize *
572-
num_channels(params->p_chmask);
573-
uac->p_interval = factor / (1 << (ep_desc->bInterval - 1));
574-
uac->p_pktsize = min_t(unsigned int,
575-
uac->p_framesize *
576-
(params->p_srate_active / uac->p_interval),
577-
prm->max_psize);
578-
579-
if (uac->p_pktsize < prm->max_psize)
580-
uac->p_pktsize_residue = uac->p_framesize *
581-
(params->p_srate_active % uac->p_interval);
582-
else
583-
uac->p_pktsize_residue = 0;
599+
prm->ep_enabled = true;
600+
usb_ep_enable(ep);
584601

602+
u_audio_set_playback_pktsize(audio_dev, params->p_srate_active);
585603
req_len = uac->p_pktsize;
586604
uac->p_residue = 0;
587605

588-
prm->ep_enabled = true;
589-
usb_ep_enable(ep);
590-
591606
for (i = 0; i < params->req_number; i++) {
592607
if (!prm->ureq[i].req) {
593608
req = usb_ep_alloc_request(ep, GFP_ATOMIC);

0 commit comments

Comments
 (0)