ALSA: bebob: give up updating streams at bus reset handler
DM1000/DM1100/DM1500 chipsets transfer packets with discontinue value in 'dbc' field of CIP header. For ALSA bebob driver, this makes its bus-reset handler meaningless, because the discontinuity is detected quite earlier than executing the handler. This commit gives up updating streams at the bus reset handler. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
4fd6c6c729
commit
3800e6f944
|
@ -300,6 +300,22 @@ bebob_probe(struct fw_unit *unit,
|
|||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* This driver doesn't update streams in bus reset handler.
|
||||
*
|
||||
* DM1000/ DM1100/DM1500 chipsets with BeBoB firmware transfer packets with
|
||||
* discontinued counter at bus reset. This discontinuity is immediately
|
||||
* detected in packet streaming layer, then it sets XRUN to PCM substream.
|
||||
*
|
||||
* ALSA PCM applications can know the XRUN by getting -EPIPE from PCM operation.
|
||||
* Then, they can recover the PCM substream by executing ioctl(2) with
|
||||
* SNDRV_PCM_IOCTL_PREPARE. 'struct snd_pcm_ops.prepare' is called and drivers
|
||||
* restart packet streaming.
|
||||
*
|
||||
* The above processing may be executed before this bus-reset handler is
|
||||
* executed. When this handler updates streams with current isochronous
|
||||
* channels, the streams already have the current ones.
|
||||
*/
|
||||
static void
|
||||
bebob_update(struct fw_unit *unit)
|
||||
{
|
||||
|
@ -310,10 +326,6 @@ bebob_update(struct fw_unit *unit)
|
|||
|
||||
fcp_bus_reset(bebob->unit);
|
||||
|
||||
mutex_lock(&bebob->mutex);
|
||||
snd_bebob_stream_update_duplex(bebob);
|
||||
mutex_unlock(&bebob->mutex);
|
||||
|
||||
if (bebob->deferred_registration) {
|
||||
if (snd_card_register(bebob->card) < 0) {
|
||||
snd_bebob_stream_destroy_duplex(bebob);
|
||||
|
|
|
@ -217,7 +217,6 @@ int snd_bebob_stream_discover(struct snd_bebob *bebob);
|
|||
int snd_bebob_stream_init_duplex(struct snd_bebob *bebob);
|
||||
int snd_bebob_stream_start_duplex(struct snd_bebob *bebob, unsigned int rate);
|
||||
void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob);
|
||||
void snd_bebob_stream_update_duplex(struct snd_bebob *bebob);
|
||||
void snd_bebob_stream_destroy_duplex(struct snd_bebob *bebob);
|
||||
|
||||
void snd_bebob_stream_lock_changed(struct snd_bebob *bebob);
|
||||
|
|
|
@ -746,21 +746,6 @@ void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob)
|
|||
}
|
||||
}
|
||||
|
||||
void snd_bebob_stream_update_duplex(struct snd_bebob *bebob)
|
||||
{
|
||||
if ((cmp_connection_update(&bebob->in_conn) < 0) ||
|
||||
(cmp_connection_update(&bebob->out_conn) < 0)) {
|
||||
amdtp_stream_pcm_abort(&bebob->rx_stream);
|
||||
amdtp_stream_pcm_abort(&bebob->tx_stream);
|
||||
amdtp_stream_stop(&bebob->rx_stream);
|
||||
amdtp_stream_stop(&bebob->tx_stream);
|
||||
break_both_connections(bebob);
|
||||
} else {
|
||||
amdtp_stream_update(&bebob->rx_stream);
|
||||
amdtp_stream_update(&bebob->tx_stream);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This function should be called before starting streams or after stopping
|
||||
* streams.
|
||||
|
|
Loading…
Reference in New Issue
Block a user