Commit 3e254b16 authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

ALSA: bebob: use normalized representation for the type of clock source

This commit changes function prototype and its processing. As a result,
function caller can execute additional processing according to detected
clock source.
Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent ba517713
...@@ -212,8 +212,8 @@ int avc_bridgeco_get_plug_strm_fmt(struct fw_unit *unit, ...@@ -212,8 +212,8 @@ int avc_bridgeco_get_plug_strm_fmt(struct fw_unit *unit,
/* for AMDTP streaming */ /* for AMDTP streaming */
int snd_bebob_stream_get_rate(struct snd_bebob *bebob, unsigned int *rate); int snd_bebob_stream_get_rate(struct snd_bebob *bebob, unsigned int *rate);
int snd_bebob_stream_set_rate(struct snd_bebob *bebob, unsigned int rate); int snd_bebob_stream_set_rate(struct snd_bebob *bebob, unsigned int rate);
int snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, int snd_bebob_stream_get_clock_src(struct snd_bebob *bebob,
bool *internal); enum snd_bebob_clock_type *src);
int snd_bebob_stream_discover(struct snd_bebob *bebob); int snd_bebob_stream_discover(struct snd_bebob *bebob);
int snd_bebob_stream_init_duplex(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); int snd_bebob_stream_start_duplex(struct snd_bebob *bebob, unsigned int rate);
......
...@@ -157,7 +157,7 @@ pcm_open(struct snd_pcm_substream *substream) ...@@ -157,7 +157,7 @@ pcm_open(struct snd_pcm_substream *substream)
struct snd_bebob *bebob = substream->private_data; struct snd_bebob *bebob = substream->private_data;
struct snd_bebob_rate_spec *spec = bebob->spec->rate; struct snd_bebob_rate_spec *spec = bebob->spec->rate;
unsigned int sampling_rate; unsigned int sampling_rate;
bool internal; enum snd_bebob_clock_type src;
int err; int err;
err = snd_bebob_stream_lock_try(bebob); err = snd_bebob_stream_lock_try(bebob);
...@@ -168,15 +168,20 @@ pcm_open(struct snd_pcm_substream *substream) ...@@ -168,15 +168,20 @@ pcm_open(struct snd_pcm_substream *substream)
if (err < 0) if (err < 0)
goto err_locked; goto err_locked;
err = snd_bebob_stream_check_internal_clock(bebob, &internal); err = snd_bebob_stream_get_clock_src(bebob, &src);
if (err < 0) if (err < 0)
goto err_locked; goto err_locked;
/* SYT-Match is not supported. */
if (src == SND_BEBOB_CLOCK_TYPE_SYT) {
err = -EBUSY;
goto err_locked;
}
/* /*
* When source of clock is internal or any PCM stream are running, * When source of clock is internal or any PCM stream are running,
* the available sampling rate is limited at current sampling rate. * the available sampling rate is limited at current sampling rate.
*/ */
if (!internal || if (src == SND_BEBOB_CLOCK_TYPE_EXTERNAL ||
amdtp_stream_pcm_running(&bebob->tx_stream) || amdtp_stream_pcm_running(&bebob->tx_stream) ||
amdtp_stream_pcm_running(&bebob->rx_stream)) { amdtp_stream_pcm_running(&bebob->rx_stream)) {
err = spec->get(bebob, &sampling_rate); err = spec->get(bebob, &sampling_rate);
......
...@@ -132,25 +132,27 @@ static void ...@@ -132,25 +132,27 @@ static void
proc_read_clock(struct snd_info_entry *entry, proc_read_clock(struct snd_info_entry *entry,
struct snd_info_buffer *buffer) struct snd_info_buffer *buffer)
{ {
static const char *const clk_labels[] = {
"Internal",
"External",
"SYT-Match",
};
struct snd_bebob *bebob = entry->private_data; struct snd_bebob *bebob = entry->private_data;
struct snd_bebob_rate_spec *rate_spec = bebob->spec->rate; struct snd_bebob_rate_spec *rate_spec = bebob->spec->rate;
struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock; struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock;
unsigned int rate, id; enum snd_bebob_clock_type src;
bool internal; unsigned int rate;
if (rate_spec->get(bebob, &rate) >= 0) if (rate_spec->get(bebob, &rate) >= 0)
snd_iprintf(buffer, "Sampling rate: %d\n", rate); snd_iprintf(buffer, "Sampling rate: %d\n", rate);
if (clk_spec) { if (snd_bebob_stream_get_clock_src(bebob, &src) >= 0) {
if (clk_spec->get(bebob, &id) >= 0) if (clk_spec)
snd_iprintf(buffer, "Clock Source: %s\n", snd_iprintf(buffer, "Clock Source: %s\n",
clk_spec->labels[id]); clk_labels[src]);
} else { else
if (snd_bebob_stream_check_internal_clock(bebob,
&internal) >= 0)
snd_iprintf(buffer, "Clock Source: %s (MSU-dest: %d)\n", snd_iprintf(buffer, "Clock Source: %s (MSU-dest: %d)\n",
(internal) ? "Internal" : "External", clk_labels[src], bebob->sync_input_plug);
bebob->sync_input_plug);
} }
} }
......
...@@ -116,8 +116,8 @@ snd_bebob_stream_set_rate(struct snd_bebob *bebob, unsigned int rate) ...@@ -116,8 +116,8 @@ snd_bebob_stream_set_rate(struct snd_bebob *bebob, unsigned int rate)
return err; return err;
} }
int int snd_bebob_stream_get_clock_src(struct snd_bebob *bebob,
snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal) enum snd_bebob_clock_type *src)
{ {
struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock; struct snd_bebob_clock_spec *clk_spec = bebob->spec->clock;
u8 addr[AVC_BRIDGECO_ADDR_BYTES], input[7]; u8 addr[AVC_BRIDGECO_ADDR_BYTES], input[7];
...@@ -125,8 +125,6 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal) ...@@ -125,8 +125,6 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal)
enum avc_bridgeco_plug_type type; enum avc_bridgeco_plug_type type;
int err = 0; int err = 0;
*internal = false;
/* 1.The device has its own operation to switch source of clock */ /* 1.The device has its own operation to switch source of clock */
if (clk_spec) { if (clk_spec) {
err = clk_spec->get(bebob, &id); err = clk_spec->get(bebob, &id);
...@@ -144,10 +142,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal) ...@@ -144,10 +142,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal)
goto end; goto end;
} }
if (strncmp(clk_spec->labels[id], SND_BEBOB_CLOCK_INTERNAL, *src = clk_spec->types[id];
strlen(SND_BEBOB_CLOCK_INTERNAL)) == 0)
*internal = true;
goto end; goto end;
} }
...@@ -156,7 +151,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal) ...@@ -156,7 +151,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal)
* to use internal clock always * to use internal clock always
*/ */
if (bebob->sync_input_plug < 0) { if (bebob->sync_input_plug < 0) {
*internal = true; *src = SND_BEBOB_CLOCK_TYPE_INTERNAL;
goto end; goto end;
} }
...@@ -179,7 +174,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal) ...@@ -179,7 +174,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal)
* Here check the first field. This field is used for direction. * Here check the first field. This field is used for direction.
*/ */
if (input[0] == 0xff) { if (input[0] == 0xff) {
*internal = true; *src = SND_BEBOB_CLOCK_TYPE_INTERNAL;
goto end; goto end;
} }
...@@ -192,7 +187,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal) ...@@ -192,7 +187,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal)
*/ */
if (input[1] == AVC_BRIDGECO_PLUG_MODE_SUBUNIT && if (input[1] == AVC_BRIDGECO_PLUG_MODE_SUBUNIT &&
input[2] == 0x0c) { input[2] == 0x0c) {
*internal = true; *src = SND_BEBOB_CLOCK_TYPE_INTERNAL;
goto end; goto end;
} }
/* The source from any input units is for several purposes. */ /* The source from any input units is for several purposes. */
...@@ -206,7 +201,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal) ...@@ -206,7 +201,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal)
* short, this driver is the master of * short, this driver is the master of
* synchronization. * synchronization.
*/ */
err = -EIO; *src = SND_BEBOB_CLOCK_TYPE_SYT;
goto end; goto end;
} else { } else {
/* /*
...@@ -214,7 +209,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal) ...@@ -214,7 +209,7 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal)
* means that the synchronization stream is not * means that the synchronization stream is not
* the Audio/MIDI compound stream. * the Audio/MIDI compound stream.
*/ */
*internal = false; *src = SND_BEBOB_CLOCK_TYPE_EXTERNAL;
goto end; goto end;
} }
} else if (input[2] == AVC_BRIDGECO_PLUG_UNIT_EXT) { } else if (input[2] == AVC_BRIDGECO_PLUG_UNIT_EXT) {
...@@ -233,18 +228,18 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal) ...@@ -233,18 +228,18 @@ snd_bebob_stream_check_internal_clock(struct snd_bebob *bebob, bool *internal)
* SPDIF/ADAT or sometimes (not always) word * SPDIF/ADAT or sometimes (not always) word
* clock. * clock.
*/ */
*internal = false; *src = SND_BEBOB_CLOCK_TYPE_EXTERNAL;
goto end; goto end;
} else if (type == AVC_BRIDGECO_PLUG_TYPE_SYNC) { } else if (type == AVC_BRIDGECO_PLUG_TYPE_SYNC) {
/* Often word clock. */ /* Often word clock. */
*internal = false; *src = SND_BEBOB_CLOCK_TYPE_EXTERNAL;
goto end; goto end;
} else if (type == AVC_BRIDGECO_PLUG_TYPE_ADDITION) { } else if (type == AVC_BRIDGECO_PLUG_TYPE_ADDITION) {
/* /*
* Not standard. * Not standard.
* Mostly, additional internal clock. * Mostly, additional internal clock.
*/ */
*internal = true; *src = SND_BEBOB_CLOCK_TYPE_INTERNAL;
goto end; goto end;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment