@@ -1528,115 +1528,108 @@ static int prepare_playback_urb(struct snd_usb_substream *subs,
15281528 int counts ;
15291529 unsigned int transfer_done , frame_limit , avail = 0 ;
15301530 int i , stride , period_elapsed = 0 ;
1531- unsigned long flags ;
1532- int err = 0 ;
15331531
15341532 stride = ep -> stride ;
15351533
15361534 frames = 0 ;
15371535 ctx -> queued = 0 ;
15381536 urb -> number_of_packets = 0 ;
15391537
1540- spin_lock_irqsave ( & subs -> lock , flags );
1541- frame_limit = subs -> frame_limit + ep -> max_urb_frames ;
1542- transfer_done = subs -> transfer_done ;
1538+ scoped_guard ( spinlock_irqsave , & subs -> lock ) {
1539+ frame_limit = subs -> frame_limit + ep -> max_urb_frames ;
1540+ transfer_done = subs -> transfer_done ;
15431541
1544- if (subs -> lowlatency_playback &&
1545- runtime -> state != SNDRV_PCM_STATE_DRAINING ) {
1546- unsigned int hwptr = subs -> hwptr_done / stride ;
1547-
1548- /* calculate the byte offset-in-buffer of the appl_ptr */
1549- avail = (runtime -> control -> appl_ptr - runtime -> hw_ptr_base )
1550- % runtime -> buffer_size ;
1551- if (avail <= hwptr )
1552- avail += runtime -> buffer_size ;
1553- avail -= hwptr ;
1554- }
1542+ if (subs -> lowlatency_playback &&
1543+ runtime -> state != SNDRV_PCM_STATE_DRAINING ) {
1544+ unsigned int hwptr = subs -> hwptr_done / stride ;
1545+
1546+ /* calculate the byte offset-in-buffer of the appl_ptr */
1547+ avail = (runtime -> control -> appl_ptr - runtime -> hw_ptr_base )
1548+ % runtime -> buffer_size ;
1549+ if (avail <= hwptr )
1550+ avail += runtime -> buffer_size ;
1551+ avail -= hwptr ;
1552+ }
15551553
1556- for (i = 0 ; i < ctx -> packets ; i ++ ) {
1557- counts = snd_usb_endpoint_next_packet_size (ep , ctx , i , avail );
1558- if (counts < 0 )
1559- break ;
1560- /* set up descriptor */
1561- urb -> iso_frame_desc [i ].offset = frames * stride ;
1562- urb -> iso_frame_desc [i ].length = counts * stride ;
1563- frames += counts ;
1564- avail -= counts ;
1565- urb -> number_of_packets ++ ;
1566- transfer_done += counts ;
1567- if (transfer_done >= runtime -> period_size ) {
1568- transfer_done -= runtime -> period_size ;
1569- frame_limit = 0 ;
1570- period_elapsed = 1 ;
1571- if (subs -> fmt_type == UAC_FORMAT_TYPE_II ) {
1572- if (transfer_done > 0 ) {
1573- /* FIXME: fill-max mode is not
1574- * supported yet */
1575- frames -= transfer_done ;
1576- counts -= transfer_done ;
1577- urb -> iso_frame_desc [i ].length =
1578- counts * stride ;
1579- transfer_done = 0 ;
1580- }
1581- i ++ ;
1582- if (i < ctx -> packets ) {
1583- /* add a transfer delimiter */
1584- urb -> iso_frame_desc [i ].offset =
1585- frames * stride ;
1586- urb -> iso_frame_desc [i ].length = 0 ;
1587- urb -> number_of_packets ++ ;
1588- }
1554+ for (i = 0 ; i < ctx -> packets ; i ++ ) {
1555+ counts = snd_usb_endpoint_next_packet_size (ep , ctx , i , avail );
1556+ if (counts < 0 )
15891557 break ;
1558+ /* set up descriptor */
1559+ urb -> iso_frame_desc [i ].offset = frames * stride ;
1560+ urb -> iso_frame_desc [i ].length = counts * stride ;
1561+ frames += counts ;
1562+ avail -= counts ;
1563+ urb -> number_of_packets ++ ;
1564+ transfer_done += counts ;
1565+ if (transfer_done >= runtime -> period_size ) {
1566+ transfer_done -= runtime -> period_size ;
1567+ frame_limit = 0 ;
1568+ period_elapsed = 1 ;
1569+ if (subs -> fmt_type == UAC_FORMAT_TYPE_II ) {
1570+ if (transfer_done > 0 ) {
1571+ /* FIXME: fill-max mode is not
1572+ * supported yet */
1573+ frames -= transfer_done ;
1574+ counts -= transfer_done ;
1575+ urb -> iso_frame_desc [i ].length =
1576+ counts * stride ;
1577+ transfer_done = 0 ;
1578+ }
1579+ i ++ ;
1580+ if (i < ctx -> packets ) {
1581+ /* add a transfer delimiter */
1582+ urb -> iso_frame_desc [i ].offset =
1583+ frames * stride ;
1584+ urb -> iso_frame_desc [i ].length = 0 ;
1585+ urb -> number_of_packets ++ ;
1586+ }
1587+ break ;
1588+ }
15901589 }
1590+ /* finish at the period boundary or after enough frames */
1591+ if ((period_elapsed || transfer_done >= frame_limit ) &&
1592+ !snd_usb_endpoint_implicit_feedback_sink (ep ))
1593+ break ;
15911594 }
1592- /* finish at the period boundary or after enough frames */
1593- if ((period_elapsed || transfer_done >= frame_limit ) &&
1594- !snd_usb_endpoint_implicit_feedback_sink (ep ))
1595- break ;
1596- }
15971595
1598- if (!frames ) {
1599- err = - EAGAIN ;
1600- goto unlock ;
1601- }
1602-
1603- bytes = frames * stride ;
1604- subs -> transfer_done = transfer_done ;
1605- subs -> frame_limit = frame_limit ;
1606- if (unlikely (ep -> cur_format == SNDRV_PCM_FORMAT_DSD_U16_LE &&
1607- subs -> cur_audiofmt -> dsd_dop )) {
1608- fill_playback_urb_dsd_dop (subs , urb , bytes );
1609- } else if (unlikely (ep -> cur_format == SNDRV_PCM_FORMAT_DSD_U8 &&
1610- subs -> cur_audiofmt -> dsd_bitrev )) {
1611- fill_playback_urb_dsd_bitrev (subs , urb , bytes );
1612- } else {
1613- /* usual PCM */
1614- if (!subs -> tx_length_quirk )
1615- copy_to_urb (subs , urb , 0 , stride , bytes );
1616- else
1617- bytes = copy_to_urb_quirk (subs , urb , stride , bytes );
1596+ if (!frames )
1597+ return - EAGAIN ;
1598+
1599+ bytes = frames * stride ;
1600+ subs -> transfer_done = transfer_done ;
1601+ subs -> frame_limit = frame_limit ;
1602+ if (unlikely (ep -> cur_format == SNDRV_PCM_FORMAT_DSD_U16_LE &&
1603+ subs -> cur_audiofmt -> dsd_dop )) {
1604+ fill_playback_urb_dsd_dop (subs , urb , bytes );
1605+ } else if (unlikely (ep -> cur_format == SNDRV_PCM_FORMAT_DSD_U8 &&
1606+ subs -> cur_audiofmt -> dsd_bitrev )) {
1607+ fill_playback_urb_dsd_bitrev (subs , urb , bytes );
1608+ } else {
1609+ /* usual PCM */
1610+ if (!subs -> tx_length_quirk )
1611+ copy_to_urb (subs , urb , 0 , stride , bytes );
1612+ else
1613+ bytes = copy_to_urb_quirk (subs , urb , stride , bytes );
16181614 /* bytes is now amount of outgoing data */
1619- }
1615+ }
16201616
1621- subs -> last_frame_number = usb_get_current_frame_number (subs -> dev );
1617+ subs -> last_frame_number = usb_get_current_frame_number (subs -> dev );
16221618
1623- if (subs -> trigger_tstamp_pending_update ) {
1624- /* this is the first actual URB submitted,
1625- * update trigger timestamp to reflect actual start time
1626- */
1627- snd_pcm_gettime (runtime , & runtime -> trigger_tstamp );
1628- subs -> trigger_tstamp_pending_update = false;
1629- }
1619+ if (subs -> trigger_tstamp_pending_update ) {
1620+ /* this is the first actual URB submitted,
1621+ * update trigger timestamp to reflect actual start time
1622+ */
1623+ snd_pcm_gettime (runtime , & runtime -> trigger_tstamp );
1624+ subs -> trigger_tstamp_pending_update = false;
1625+ }
16301626
1631- if (period_elapsed && !subs -> running && subs -> lowlatency_playback ) {
1632- subs -> period_elapsed_pending = 1 ;
1633- period_elapsed = 0 ;
1627+ if (period_elapsed && !subs -> running && subs -> lowlatency_playback ) {
1628+ subs -> period_elapsed_pending = 1 ;
1629+ period_elapsed = 0 ;
1630+ }
16341631 }
16351632
1636- unlock :
1637- spin_unlock_irqrestore (& subs -> lock , flags );
1638- if (err < 0 )
1639- return err ;
16401633 urb -> transfer_buffer_length = bytes ;
16411634 if (period_elapsed ) {
16421635 if (in_stream_lock )
@@ -1654,24 +1647,23 @@ static int prepare_playback_urb(struct snd_usb_substream *subs,
16541647static void retire_playback_urb (struct snd_usb_substream * subs ,
16551648 struct urb * urb )
16561649{
1657- unsigned long flags ;
16581650 struct snd_urb_ctx * ctx = urb -> context ;
16591651 bool period_elapsed = false;
16601652
1661- spin_lock_irqsave ( & subs -> lock , flags );
1662- if (ctx -> queued ) {
1663- if (subs -> inflight_bytes >= ctx -> queued )
1664- subs -> inflight_bytes -= ctx -> queued ;
1665- else
1666- subs -> inflight_bytes = 0 ;
1667- }
1653+ scoped_guard ( spinlock_irqsave , & subs -> lock ) {
1654+ if (ctx -> queued ) {
1655+ if (subs -> inflight_bytes >= ctx -> queued )
1656+ subs -> inflight_bytes -= ctx -> queued ;
1657+ else
1658+ subs -> inflight_bytes = 0 ;
1659+ }
16681660
1669- subs -> last_frame_number = usb_get_current_frame_number (subs -> dev );
1670- if (subs -> running ) {
1671- period_elapsed = subs -> period_elapsed_pending ;
1672- subs -> period_elapsed_pending = 0 ;
1661+ subs -> last_frame_number = usb_get_current_frame_number (subs -> dev );
1662+ if (subs -> running ) {
1663+ period_elapsed = subs -> period_elapsed_pending ;
1664+ subs -> period_elapsed_pending = 0 ;
1665+ }
16731666 }
1674- spin_unlock_irqrestore (& subs -> lock , flags );
16751667 if (period_elapsed )
16761668 snd_pcm_period_elapsed (subs -> pcm_substream );
16771669}
0 commit comments