aboutsummaryrefslogtreecommitdiff
path: root/sound/firewire/oxfw
diff options
context:
space:
mode:
authorTakashi Sakamoto2019-06-12 17:44:15 +0900
committerTakashi Iwai2019-06-12 15:26:55 +0200
commit521b2e11fad0b4d6b36727ecca624710b5f81fd1 (patch)
treeaec6b3b4896d5582fbc403211c4d82e60ba32744 /sound/firewire/oxfw
parentda2af86d51ac32067c77759e40a162d684690a43 (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.c48
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);