|
@@ -971,6 +971,7 @@ static inline void snd_hdspm_initialize_midi_flush(struct hdspm *hdspm);
|
|
|
static int hdspm_update_simple_mixer_controls(struct hdspm *hdspm);
|
|
|
static int hdspm_autosync_ref(struct hdspm *hdspm);
|
|
|
static int snd_hdspm_set_defaults(struct hdspm *hdspm);
|
|
|
+static int hdspm_system_clock_mode(struct hdspm *hdspm);
|
|
|
static void hdspm_set_sgbuf(struct hdspm *hdspm,
|
|
|
struct snd_pcm_substream *substream,
|
|
|
unsigned int reg, int channels);
|
|
@@ -1989,10 +1990,14 @@ static int hdspm_get_system_sample_rate(struct hdspm *hdspm)
|
|
|
rate = hdspm_calc_dds_value(hdspm, period);
|
|
|
|
|
|
if (rate > 207000) {
|
|
|
- /* Unreasonable high sample rate as seen on PCI MADI cards.
|
|
|
- * Use the cached value instead.
|
|
|
- */
|
|
|
- rate = hdspm->system_sample_rate;
|
|
|
+ /* Unreasonable high sample rate as seen on PCI MADI cards. */
|
|
|
+ if (0 == hdspm_system_clock_mode(hdspm)) {
|
|
|
+ /* master mode, return internal sample rate */
|
|
|
+ rate = hdspm->system_sample_rate;
|
|
|
+ } else {
|
|
|
+ /* slave mode, return external sample rate */
|
|
|
+ rate = hdspm_external_sample_rate(hdspm);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return rate;
|
|
@@ -2000,12 +2005,14 @@ static int hdspm_get_system_sample_rate(struct hdspm *hdspm)
|
|
|
|
|
|
|
|
|
#define HDSPM_SYSTEM_SAMPLE_RATE(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .access = SNDRV_CTL_ELEM_ACCESS_READ, \
|
|
|
- .info = snd_hdspm_info_system_sample_rate, \
|
|
|
- .get = snd_hdspm_get_system_sample_rate \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
|
|
|
+ SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
|
|
|
+ .info = snd_hdspm_info_system_sample_rate, \
|
|
|
+ .put = snd_hdspm_put_system_sample_rate, \
|
|
|
+ .get = snd_hdspm_get_system_sample_rate \
|
|
|
}
|
|
|
|
|
|
static int snd_hdspm_info_system_sample_rate(struct snd_kcontrol *kcontrol,
|
|
@@ -2030,6 +2037,16 @@ static int snd_hdspm_get_system_sample_rate(struct snd_kcontrol *kcontrol,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int snd_hdspm_put_system_sample_rate(struct snd_kcontrol *kcontrol,
|
|
|
+ struct snd_ctl_elem_value *
|
|
|
+ ucontrol)
|
|
|
+{
|
|
|
+ struct hdspm *hdspm = snd_kcontrol_chip(kcontrol);
|
|
|
+
|
|
|
+ hdspm_set_dds_value(hdspm, ucontrol->value.enumerated.item[0]);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* Returns the WordClock sample rate class for the given card.
|
|
@@ -2163,6 +2180,7 @@ static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,
|
|
|
hdspm_get_s1_sample_rate(hdspm,
|
|
|
kcontrol->private_value-1);
|
|
|
}
|
|
|
+ break;
|
|
|
|
|
|
case AIO:
|
|
|
switch (kcontrol->private_value) {
|
|
@@ -2183,6 +2201,7 @@ static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,
|
|
|
hdspm_get_s1_sample_rate(hdspm,
|
|
|
ucontrol->id.index-1);
|
|
|
}
|
|
|
+ break;
|
|
|
|
|
|
case AES32:
|
|
|
|
|
@@ -2204,8 +2223,23 @@ static int snd_hdspm_get_autosync_sample_rate(struct snd_kcontrol *kcontrol,
|
|
|
hdspm_get_s1_sample_rate(hdspm,
|
|
|
kcontrol->private_value-1);
|
|
|
break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
|
|
|
+ case MADI:
|
|
|
+ case MADIface:
|
|
|
+ {
|
|
|
+ int rate = hdspm_external_sample_rate(hdspm);
|
|
|
+ int i, selected_rate = 0;
|
|
|
+ for (i = 1; i < 10; i++)
|
|
|
+ if (HDSPM_bit2freq(i) == rate) {
|
|
|
+ selected_rate = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ ucontrol->value.enumerated.item[0] = selected_rate;
|
|
|
}
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -2430,7 +2464,7 @@ static int snd_hdspm_put_clock_source(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
|
#define HDSPM_PREF_SYNC_REF(xname, xindex) \
|
|
|
-{.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
.name = xname, \
|
|
|
.index = xindex, \
|
|
|
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
|
|
@@ -2766,12 +2800,12 @@ static int snd_hdspm_put_pref_sync_ref(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
|
#define HDSPM_AUTOSYNC_REF(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .access = SNDRV_CTL_ELEM_ACCESS_READ, \
|
|
|
- .info = snd_hdspm_info_autosync_ref, \
|
|
|
- .get = snd_hdspm_get_autosync_ref, \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .access = SNDRV_CTL_ELEM_ACCESS_READ, \
|
|
|
+ .info = snd_hdspm_info_autosync_ref, \
|
|
|
+ .get = snd_hdspm_get_autosync_ref, \
|
|
|
}
|
|
|
|
|
|
static int hdspm_autosync_ref(struct hdspm *hdspm)
|
|
@@ -2855,12 +2889,12 @@ static int snd_hdspm_get_autosync_ref(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
|
#define HDSPM_LINE_OUT(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .info = snd_hdspm_info_line_out, \
|
|
|
- .get = snd_hdspm_get_line_out, \
|
|
|
- .put = snd_hdspm_put_line_out \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .info = snd_hdspm_info_line_out, \
|
|
|
+ .get = snd_hdspm_get_line_out, \
|
|
|
+ .put = snd_hdspm_put_line_out \
|
|
|
}
|
|
|
|
|
|
static int hdspm_line_out(struct hdspm * hdspm)
|
|
@@ -2912,12 +2946,12 @@ static int snd_hdspm_put_line_out(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
|
#define HDSPM_TX_64(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .info = snd_hdspm_info_tx_64, \
|
|
|
- .get = snd_hdspm_get_tx_64, \
|
|
|
- .put = snd_hdspm_put_tx_64 \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .info = snd_hdspm_info_tx_64, \
|
|
|
+ .get = snd_hdspm_get_tx_64, \
|
|
|
+ .put = snd_hdspm_put_tx_64 \
|
|
|
}
|
|
|
|
|
|
static int hdspm_tx_64(struct hdspm * hdspm)
|
|
@@ -2968,12 +3002,12 @@ static int snd_hdspm_put_tx_64(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
|
#define HDSPM_C_TMS(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .info = snd_hdspm_info_c_tms, \
|
|
|
- .get = snd_hdspm_get_c_tms, \
|
|
|
- .put = snd_hdspm_put_c_tms \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .info = snd_hdspm_info_c_tms, \
|
|
|
+ .get = snd_hdspm_get_c_tms, \
|
|
|
+ .put = snd_hdspm_put_c_tms \
|
|
|
}
|
|
|
|
|
|
static int hdspm_c_tms(struct hdspm * hdspm)
|
|
@@ -3024,12 +3058,12 @@ static int snd_hdspm_put_c_tms(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
|
#define HDSPM_SAFE_MODE(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .info = snd_hdspm_info_safe_mode, \
|
|
|
- .get = snd_hdspm_get_safe_mode, \
|
|
|
- .put = snd_hdspm_put_safe_mode \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .info = snd_hdspm_info_safe_mode, \
|
|
|
+ .get = snd_hdspm_get_safe_mode, \
|
|
|
+ .put = snd_hdspm_put_safe_mode \
|
|
|
}
|
|
|
|
|
|
static int hdspm_safe_mode(struct hdspm * hdspm)
|
|
@@ -3080,12 +3114,12 @@ static int snd_hdspm_put_safe_mode(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
|
#define HDSPM_EMPHASIS(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .info = snd_hdspm_info_emphasis, \
|
|
|
- .get = snd_hdspm_get_emphasis, \
|
|
|
- .put = snd_hdspm_put_emphasis \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .info = snd_hdspm_info_emphasis, \
|
|
|
+ .get = snd_hdspm_get_emphasis, \
|
|
|
+ .put = snd_hdspm_put_emphasis \
|
|
|
}
|
|
|
|
|
|
static int hdspm_emphasis(struct hdspm * hdspm)
|
|
@@ -3136,12 +3170,12 @@ static int snd_hdspm_put_emphasis(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
|
#define HDSPM_DOLBY(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .info = snd_hdspm_info_dolby, \
|
|
|
- .get = snd_hdspm_get_dolby, \
|
|
|
- .put = snd_hdspm_put_dolby \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .info = snd_hdspm_info_dolby, \
|
|
|
+ .get = snd_hdspm_get_dolby, \
|
|
|
+ .put = snd_hdspm_put_dolby \
|
|
|
}
|
|
|
|
|
|
static int hdspm_dolby(struct hdspm * hdspm)
|
|
@@ -3192,12 +3226,12 @@ static int snd_hdspm_put_dolby(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
|
#define HDSPM_PROFESSIONAL(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .info = snd_hdspm_info_professional, \
|
|
|
- .get = snd_hdspm_get_professional, \
|
|
|
- .put = snd_hdspm_put_professional \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .info = snd_hdspm_info_professional, \
|
|
|
+ .get = snd_hdspm_get_professional, \
|
|
|
+ .put = snd_hdspm_put_professional \
|
|
|
}
|
|
|
|
|
|
static int hdspm_professional(struct hdspm * hdspm)
|
|
@@ -3247,12 +3281,12 @@ static int snd_hdspm_put_professional(struct snd_kcontrol *kcontrol,
|
|
|
}
|
|
|
|
|
|
#define HDSPM_INPUT_SELECT(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .info = snd_hdspm_info_input_select, \
|
|
|
- .get = snd_hdspm_get_input_select, \
|
|
|
- .put = snd_hdspm_put_input_select \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .info = snd_hdspm_info_input_select, \
|
|
|
+ .get = snd_hdspm_get_input_select, \
|
|
|
+ .put = snd_hdspm_put_input_select \
|
|
|
}
|
|
|
|
|
|
static int hdspm_input_select(struct hdspm * hdspm)
|
|
@@ -3319,12 +3353,12 @@ static int snd_hdspm_put_input_select(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
|
#define HDSPM_DS_WIRE(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .info = snd_hdspm_info_ds_wire, \
|
|
|
- .get = snd_hdspm_get_ds_wire, \
|
|
|
- .put = snd_hdspm_put_ds_wire \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .info = snd_hdspm_info_ds_wire, \
|
|
|
+ .get = snd_hdspm_get_ds_wire, \
|
|
|
+ .put = snd_hdspm_put_ds_wire \
|
|
|
}
|
|
|
|
|
|
static int hdspm_ds_wire(struct hdspm * hdspm)
|
|
@@ -3391,12 +3425,12 @@ static int snd_hdspm_put_ds_wire(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
|
|
|
#define HDSPM_QS_WIRE(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .info = snd_hdspm_info_qs_wire, \
|
|
|
- .get = snd_hdspm_get_qs_wire, \
|
|
|
- .put = snd_hdspm_put_qs_wire \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .info = snd_hdspm_info_qs_wire, \
|
|
|
+ .get = snd_hdspm_get_qs_wire, \
|
|
|
+ .put = snd_hdspm_put_qs_wire \
|
|
|
}
|
|
|
|
|
|
static int hdspm_qs_wire(struct hdspm * hdspm)
|
|
@@ -3563,15 +3597,15 @@ static int snd_hdspm_put_madi_speedmode(struct snd_kcontrol *kcontrol,
|
|
|
}
|
|
|
|
|
|
#define HDSPM_MIXER(xname, xindex) \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
|
|
|
- .name = xname, \
|
|
|
- .index = xindex, \
|
|
|
- .device = 0, \
|
|
|
- .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
|
|
|
- SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
|
|
|
- .info = snd_hdspm_info_mixer, \
|
|
|
- .get = snd_hdspm_get_mixer, \
|
|
|
- .put = snd_hdspm_put_mixer \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
|
|
|
+ .name = xname, \
|
|
|
+ .index = xindex, \
|
|
|
+ .device = 0, \
|
|
|
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
|
|
|
+ SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
|
|
|
+ .info = snd_hdspm_info_mixer, \
|
|
|
+ .get = snd_hdspm_get_mixer, \
|
|
|
+ .put = snd_hdspm_put_mixer \
|
|
|
}
|
|
|
|
|
|
static int snd_hdspm_info_mixer(struct snd_kcontrol *kcontrol,
|
|
@@ -3670,12 +3704,12 @@ static int snd_hdspm_put_mixer(struct snd_kcontrol *kcontrol,
|
|
|
*/
|
|
|
|
|
|
#define HDSPM_PLAYBACK_MIXER \
|
|
|
-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
- .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \
|
|
|
- SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
|
|
|
- .info = snd_hdspm_info_playback_mixer, \
|
|
|
- .get = snd_hdspm_get_playback_mixer, \
|
|
|
- .put = snd_hdspm_put_playback_mixer \
|
|
|
+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
|
|
+ .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \
|
|
|
+ SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
|
|
|
+ .info = snd_hdspm_info_playback_mixer, \
|
|
|
+ .get = snd_hdspm_get_playback_mixer, \
|
|
|
+ .put = snd_hdspm_put_playback_mixer \
|
|
|
}
|
|
|
|
|
|
static int snd_hdspm_info_playback_mixer(struct snd_kcontrol *kcontrol,
|
|
@@ -3851,12 +3885,17 @@ static int hdspm_sync_in_sync_check(struct hdspm *hdspm)
|
|
|
break;
|
|
|
|
|
|
case MADI:
|
|
|
- case AES32:
|
|
|
- status = hdspm_read(hdspm, HDSPM_statusRegister2);
|
|
|
+ status = hdspm_read(hdspm, HDSPM_statusRegister);
|
|
|
lock = (status & HDSPM_syncInLock) ? 1 : 0;
|
|
|
sync = (status & HDSPM_syncInSync) ? 1 : 0;
|
|
|
break;
|
|
|
|
|
|
+ case AES32:
|
|
|
+ status = hdspm_read(hdspm, HDSPM_statusRegister2);
|
|
|
+ lock = (status & 0x100000) ? 1 : 0;
|
|
|
+ sync = (status & 0x200000) ? 1 : 0;
|
|
|
+ break;
|
|
|
+
|
|
|
case MADIface:
|
|
|
break;
|
|
|
}
|
|
@@ -3942,6 +3981,7 @@ static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
|
|
|
default:
|
|
|
val = hdspm_s1_sync_check(hdspm, ucontrol->id.index-1);
|
|
|
}
|
|
|
+ break;
|
|
|
|
|
|
case AIO:
|
|
|
switch (kcontrol->private_value) {
|
|
@@ -3954,6 +3994,7 @@ static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
|
|
|
default:
|
|
|
val = hdspm_s1_sync_check(hdspm, ucontrol->id.index-1);
|
|
|
}
|
|
|
+ break;
|
|
|
|
|
|
case MADI:
|
|
|
switch (kcontrol->private_value) {
|
|
@@ -3966,6 +4007,7 @@ static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
|
|
|
case 3: /* SYNC_IN */
|
|
|
val = hdspm_sync_in_sync_check(hdspm); break;
|
|
|
}
|
|
|
+ break;
|
|
|
|
|
|
case MADIface:
|
|
|
val = hdspm_madi_sync_check(hdspm); /* MADI */
|
|
@@ -3983,6 +4025,7 @@ static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
|
|
|
val = hdspm_aes_sync_check(hdspm,
|
|
|
kcontrol->private_value-1);
|
|
|
}
|
|
|
+ break;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -4427,9 +4470,10 @@ static struct snd_kcontrol_new snd_hdspm_controls_madi[] = {
|
|
|
HDSPM_PREF_SYNC_REF("Preferred Sync Reference", 0),
|
|
|
HDSPM_AUTOSYNC_REF("AutoSync Reference", 0),
|
|
|
HDSPM_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
|
|
|
+ HDSPM_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
|
|
|
HDSPM_SYNC_CHECK("WC SyncCheck", 0),
|
|
|
HDSPM_SYNC_CHECK("MADI SyncCheck", 1),
|
|
|
- HDSPM_SYNC_CHECK("TCO SyncCHeck", 2),
|
|
|
+ HDSPM_SYNC_CHECK("TCO SyncCheck", 2),
|
|
|
HDSPM_SYNC_CHECK("SYNC IN SyncCheck", 3),
|
|
|
HDSPM_LINE_OUT("Line Out", 0),
|
|
|
HDSPM_TX_64("TX 64 channels mode", 0),
|