ALSA: bebob: keep duplex streams always to keep internal multiplexer properly
Behringer FCA610 transmits packets with periodic noisy PCM samples when receiving no streams, and generates a bit noisy sound. ALSA BeBoB driver is programmed to establish both in/out connections when starting streaming, then transfers packets as userspace applications requested. This means that there's a case that one of incoming/outgoing streams is running, to save CPU and bandwidth usage. Although, it's natural to start transferring packets in both direction. This commit makes this driver to keeps duplex streams always. Tested-by: Kim Tore Jensen <kim@incendio.no> Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:

committed by
Takashi Iwai

parent
c4d860a0d2
commit
8d1c2694e4
@@ -574,7 +574,6 @@ int snd_bebob_stream_start_duplex(struct snd_bebob *bebob, unsigned int rate)
|
||||
{
|
||||
struct snd_bebob_rate_spec *rate_spec = bebob->spec->rate;
|
||||
struct amdtp_stream *master, *slave;
|
||||
atomic_t *slave_substreams;
|
||||
enum cip_flags sync_mode;
|
||||
unsigned int curr_rate;
|
||||
bool updated = false;
|
||||
@@ -599,8 +598,7 @@ int snd_bebob_stream_start_duplex(struct snd_bebob *bebob, unsigned int rate)
|
||||
mutex_lock(&bebob->mutex);
|
||||
|
||||
/* Need no substreams */
|
||||
if (atomic_read(&bebob->playback_substreams) == 0 &&
|
||||
atomic_read(&bebob->capture_substreams) == 0)
|
||||
if (atomic_read(&bebob->substreams_counter) == 0)
|
||||
goto end;
|
||||
|
||||
err = get_sync_mode(bebob, &sync_mode);
|
||||
@@ -609,11 +607,9 @@ int snd_bebob_stream_start_duplex(struct snd_bebob *bebob, unsigned int rate)
|
||||
if (sync_mode == CIP_SYNC_TO_DEVICE) {
|
||||
master = &bebob->tx_stream;
|
||||
slave = &bebob->rx_stream;
|
||||
slave_substreams = &bebob->playback_substreams;
|
||||
} else {
|
||||
master = &bebob->rx_stream;
|
||||
slave = &bebob->tx_stream;
|
||||
slave_substreams = &bebob->capture_substreams;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -714,7 +710,7 @@ int snd_bebob_stream_start_duplex(struct snd_bebob *bebob, unsigned int rate)
|
||||
}
|
||||
|
||||
/* start slave if needed */
|
||||
if (atomic_read(slave_substreams) > 0 && !amdtp_stream_running(slave)) {
|
||||
if (!amdtp_stream_running(slave)) {
|
||||
err = start_stream(bebob, slave, rate);
|
||||
if (err < 0) {
|
||||
dev_err(&bebob->unit->device,
|
||||
@@ -740,31 +736,25 @@ end:
|
||||
void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob)
|
||||
{
|
||||
struct amdtp_stream *master, *slave;
|
||||
atomic_t *master_substreams, *slave_substreams;
|
||||
|
||||
if (bebob->master == &bebob->rx_stream) {
|
||||
slave = &bebob->tx_stream;
|
||||
master = &bebob->rx_stream;
|
||||
slave_substreams = &bebob->capture_substreams;
|
||||
master_substreams = &bebob->playback_substreams;
|
||||
} else {
|
||||
slave = &bebob->rx_stream;
|
||||
master = &bebob->tx_stream;
|
||||
slave_substreams = &bebob->playback_substreams;
|
||||
master_substreams = &bebob->capture_substreams;
|
||||
}
|
||||
|
||||
mutex_lock(&bebob->mutex);
|
||||
|
||||
if (atomic_read(slave_substreams) == 0) {
|
||||
if (atomic_read(&bebob->substreams_counter) == 0) {
|
||||
amdtp_stream_pcm_abort(master);
|
||||
amdtp_stream_stop(master);
|
||||
|
||||
amdtp_stream_pcm_abort(slave);
|
||||
amdtp_stream_stop(slave);
|
||||
|
||||
if (atomic_read(master_substreams) == 0) {
|
||||
amdtp_stream_pcm_abort(master);
|
||||
amdtp_stream_stop(master);
|
||||
break_both_connections(bebob);
|
||||
}
|
||||
break_both_connections(bebob);
|
||||
}
|
||||
|
||||
mutex_unlock(&bebob->mutex);
|
||||
|
Reference in New Issue
Block a user