|
@@ -120,23 +120,6 @@ destroy_stream(struct snd_efw *efw, struct amdtp_stream *stream)
|
|
|
cmp_connection_destroy(&efw->out_conn);
|
|
|
}
|
|
|
|
|
|
-static int
|
|
|
-get_sync_mode(struct snd_efw *efw, enum cip_flags *sync_mode)
|
|
|
-{
|
|
|
- enum snd_efw_clock_source clock_source;
|
|
|
- int err;
|
|
|
-
|
|
|
- err = snd_efw_command_get_clock_source(efw, &clock_source);
|
|
|
- if (err < 0)
|
|
|
- return err;
|
|
|
-
|
|
|
- if (clock_source == SND_EFW_CLOCK_SOURCE_SYTMATCH)
|
|
|
- return -ENOSYS;
|
|
|
-
|
|
|
- *sync_mode = CIP_SYNC_TO_DEVICE;
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static int
|
|
|
check_connection_used_by_others(struct snd_efw *efw, struct amdtp_stream *s)
|
|
|
{
|
|
@@ -208,9 +191,6 @@ end:
|
|
|
|
|
|
int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate)
|
|
|
{
|
|
|
- struct amdtp_stream *master, *slave;
|
|
|
- unsigned int slave_substreams;
|
|
|
- enum cip_flags sync_mode;
|
|
|
unsigned int curr_rate;
|
|
|
int err = 0;
|
|
|
|
|
@@ -218,32 +198,19 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate)
|
|
|
if (efw->playback_substreams == 0 && efw->capture_substreams == 0)
|
|
|
goto end;
|
|
|
|
|
|
- err = get_sync_mode(efw, &sync_mode);
|
|
|
- if (err < 0)
|
|
|
- goto end;
|
|
|
- if (sync_mode == CIP_SYNC_TO_DEVICE) {
|
|
|
- master = &efw->tx_stream;
|
|
|
- slave = &efw->rx_stream;
|
|
|
- slave_substreams = efw->playback_substreams;
|
|
|
- } else {
|
|
|
- master = &efw->rx_stream;
|
|
|
- slave = &efw->tx_stream;
|
|
|
- slave_substreams = efw->capture_substreams;
|
|
|
- }
|
|
|
-
|
|
|
/*
|
|
|
* Considering JACK/FFADO streaming:
|
|
|
* TODO: This can be removed hwdep functionality becomes popular.
|
|
|
*/
|
|
|
- err = check_connection_used_by_others(efw, master);
|
|
|
+ err = check_connection_used_by_others(efw, &efw->rx_stream);
|
|
|
if (err < 0)
|
|
|
goto end;
|
|
|
|
|
|
/* packet queueing error */
|
|
|
- if (amdtp_streaming_error(slave))
|
|
|
- stop_stream(efw, slave);
|
|
|
- if (amdtp_streaming_error(master))
|
|
|
- stop_stream(efw, master);
|
|
|
+ if (amdtp_streaming_error(&efw->tx_stream))
|
|
|
+ stop_stream(efw, &efw->tx_stream);
|
|
|
+ if (amdtp_streaming_error(&efw->rx_stream))
|
|
|
+ stop_stream(efw, &efw->rx_stream);
|
|
|
|
|
|
/* stop streams if rate is different */
|
|
|
err = snd_efw_command_get_sampling_rate(efw, &curr_rate);
|
|
@@ -252,20 +219,17 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate)
|
|
|
if (rate == 0)
|
|
|
rate = curr_rate;
|
|
|
if (rate != curr_rate) {
|
|
|
- stop_stream(efw, slave);
|
|
|
- stop_stream(efw, master);
|
|
|
+ stop_stream(efw, &efw->tx_stream);
|
|
|
+ stop_stream(efw, &efw->rx_stream);
|
|
|
}
|
|
|
|
|
|
/* master should be always running */
|
|
|
- if (!amdtp_stream_running(master)) {
|
|
|
- amdtp_stream_set_sync(sync_mode, master, slave);
|
|
|
- efw->master = master;
|
|
|
-
|
|
|
+ if (!amdtp_stream_running(&efw->rx_stream)) {
|
|
|
err = snd_efw_command_set_sampling_rate(efw, rate);
|
|
|
if (err < 0)
|
|
|
goto end;
|
|
|
|
|
|
- err = start_stream(efw, master, rate);
|
|
|
+ err = start_stream(efw, &efw->rx_stream, rate);
|
|
|
if (err < 0) {
|
|
|
dev_err(&efw->unit->device,
|
|
|
"fail to start AMDTP master stream:%d\n", err);
|
|
@@ -274,12 +238,13 @@ int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate)
|
|
|
}
|
|
|
|
|
|
/* start slave if needed */
|
|
|
- if (slave_substreams > 0 && !amdtp_stream_running(slave)) {
|
|
|
- err = start_stream(efw, slave, rate);
|
|
|
+ if (efw->capture_substreams > 0 &&
|
|
|
+ !amdtp_stream_running(&efw->tx_stream)) {
|
|
|
+ err = start_stream(efw, &efw->tx_stream, rate);
|
|
|
if (err < 0) {
|
|
|
dev_err(&efw->unit->device,
|
|
|
"fail to start AMDTP slave stream:%d\n", err);
|
|
|
- stop_stream(efw, master);
|
|
|
+ stop_stream(efw, &efw->rx_stream);
|
|
|
}
|
|
|
}
|
|
|
end:
|
|
@@ -288,26 +253,11 @@ end:
|
|
|
|
|
|
void snd_efw_stream_stop_duplex(struct snd_efw *efw)
|
|
|
{
|
|
|
- struct amdtp_stream *master, *slave;
|
|
|
- unsigned int master_substreams, slave_substreams;
|
|
|
-
|
|
|
- if (efw->master == &efw->rx_stream) {
|
|
|
- slave = &efw->tx_stream;
|
|
|
- master = &efw->rx_stream;
|
|
|
- slave_substreams = efw->capture_substreams;
|
|
|
- master_substreams = efw->playback_substreams;
|
|
|
- } else {
|
|
|
- slave = &efw->rx_stream;
|
|
|
- master = &efw->tx_stream;
|
|
|
- slave_substreams = efw->playback_substreams;
|
|
|
- master_substreams = efw->capture_substreams;
|
|
|
- }
|
|
|
-
|
|
|
- if (slave_substreams == 0) {
|
|
|
- stop_stream(efw, slave);
|
|
|
+ if (efw->capture_substreams == 0) {
|
|
|
+ stop_stream(efw, &efw->tx_stream);
|
|
|
|
|
|
- if (master_substreams == 0)
|
|
|
- stop_stream(efw, master);
|
|
|
+ if (efw->playback_substreams == 0)
|
|
|
+ stop_stream(efw, &efw->rx_stream);
|
|
|
}
|
|
|
}
|
|
|
|