diff options
author | Takashi Sakamoto | 2019-06-12 17:44:15 +0900 |
---|---|---|
committer | Takashi Iwai | 2019-06-12 15:26:55 +0200 |
commit | 521b2e11fad0b4d6b36727ecca624710b5f81fd1 (patch) | |
tree | aec6b3b4896d5582fbc403211c4d82e60ba32744 /sound/firewire/oxfw | |
parent | da2af86d51ac32067c77759e40a162d684690a43 (diff) |
ALSA: oxfw: set packet parameter according to current configuration
After a call of pcm.hw_params, the state of target device is expected
for applications. This commit retrieves the state and start packet
streaming.
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/firewire/oxfw')
-rw-r--r-- | sound/firewire/oxfw/oxfw-stream.c | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/sound/firewire/oxfw/oxfw-stream.c b/sound/firewire/oxfw/oxfw-stream.c index 34ff673e6ff8..1691fdc1a575 100644 --- a/sound/firewire/oxfw/oxfw-stream.c +++ b/sound/firewire/oxfw/oxfw-stream.c @@ -112,51 +112,51 @@ static void stop_stream(struct snd_oxfw *oxfw, struct amdtp_stream *stream) cmp_connection_break(&oxfw->in_conn); } -static int start_stream(struct snd_oxfw *oxfw, struct amdtp_stream *stream, - unsigned int rate, unsigned int pcm_channels) +static int start_stream(struct snd_oxfw *oxfw, struct amdtp_stream *stream) { u8 **formats; + enum avc_general_plug_dir dir; struct cmp_connection *conn; struct snd_oxfw_stream_formation formation; - unsigned int i, midi_ports; + int i; int err; if (stream == &oxfw->rx_stream) { + dir = AVC_GENERAL_PLUG_DIR_IN; formats = oxfw->rx_stream_formats; conn = &oxfw->in_conn; } else { + dir = AVC_GENERAL_PLUG_DIR_OUT; formats = oxfw->tx_stream_formats; conn = &oxfw->out_conn; } - /* Get stream format */ + err = snd_oxfw_stream_get_current_formation(oxfw, dir, &formation); + if (err < 0) + return err; + for (i = 0; i < SND_OXFW_STREAM_FORMAT_ENTRIES; i++) { + struct snd_oxfw_stream_formation fmt; + if (formats[i] == NULL) break; - err = snd_oxfw_stream_parse_format(formats[i], &formation); + err = snd_oxfw_stream_parse_format(formats[i], &fmt); if (err < 0) - goto end; - if (rate != formation.rate) - continue; - if (pcm_channels == 0 || pcm_channels == formation.pcm) + return err; + if (fmt.rate == formation.rate && fmt.pcm == formation.pcm && + fmt.midi == formation.midi) break; } - if (i == SND_OXFW_STREAM_FORMAT_ENTRIES) { - err = -EINVAL; - goto end; - } + if (i == SND_OXFW_STREAM_FORMAT_ENTRIES) + return -EINVAL; - pcm_channels = formation.pcm; - midi_ports = formation.midi * 8; + // The stream should have one pcm channels at least. + if (formation.pcm == 0) + return -EINVAL; - /* The stream should have one pcm channels at least */ - if (pcm_channels == 0) { - err = -EINVAL; - goto end; - } - err = amdtp_am824_set_parameters(stream, rate, pcm_channels, midi_ports, - false); + err = amdtp_am824_set_parameters(stream, formation.rate, formation.pcm, + formation.midi * 8, false); if (err < 0) goto end; @@ -316,7 +316,7 @@ int snd_oxfw_stream_start_simplex(struct snd_oxfw *oxfw, /* Start opposite stream if needed. */ if (opposite && !amdtp_stream_running(opposite) && (opposite_substreams > 0)) { - err = start_stream(oxfw, opposite, rate, 0); + err = start_stream(oxfw, opposite); if (err < 0) { dev_err(&oxfw->unit->device, "fail to restart stream: %d\n", err); @@ -327,7 +327,7 @@ int snd_oxfw_stream_start_simplex(struct snd_oxfw *oxfw, /* Start requested stream. */ if (!amdtp_stream_running(stream)) { - err = start_stream(oxfw, stream, rate, pcm_channels); + err = start_stream(oxfw, stream); if (err < 0) dev_err(&oxfw->unit->device, "fail to start stream: %d\n", err); |