@@ -454,6 +454,44 @@ int u_audio_set_capture_srate(struct g_audio *audio_dev, int srate)
454454}
455455EXPORT_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+
457495int 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