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: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
ba5177131d
commit
3e254b16b6
@ -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)
|
|||||||
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)
|
|||||||
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
|
|||||||
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 @@ end:
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
* 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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
* 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)
|
|||||||
* 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)
|
|||||||
* 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user