mirror of
https://github.com/alsa-project/alsa-tools.git
synced 2025-11-27 07:00:09 -05:00
Add support for RME MADI, RayDAT and AIO
Merged the work by Florian Faber that's distributed separately as hdspmixer64. Code taken from http://wiki.linuxproaudio.org/index.php/App:hdspmixer_64 Signed-off-by: Adrian Knoth <adi@drcomp.erfurt.thur.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
6af3047947
commit
e24e56795e
20 changed files with 651 additions and 187 deletions
|
|
@ -45,6 +45,66 @@ static char channel_map_ds[26] = {
|
|||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
|
||||
};
|
||||
|
||||
static char dest_map_madi_ss[32] = {
|
||||
0, 2, 4, 6, 8, 10, 12, 14,
|
||||
16, 18, 20, 22, 24, 26, 28, 30,
|
||||
32, 34, 36, 38, 40, 42, 44, 46,
|
||||
48, 50, 52, 54, 56, 58, 60, 62
|
||||
};
|
||||
|
||||
|
||||
static char dest_map_raydat_ss[18] = {
|
||||
4, 6, 8, 10,
|
||||
12, 14, 16, 18,
|
||||
20, 22, 24, 26,
|
||||
28, 30, 32, 34,
|
||||
0, 2
|
||||
};
|
||||
|
||||
static char dest_map_raydat_ds[10] = {
|
||||
4, 6,
|
||||
8, 10,
|
||||
12, 14,
|
||||
16, 18,
|
||||
0, 2
|
||||
};
|
||||
|
||||
static char dest_map_raydat_qs[6] = {
|
||||
4,
|
||||
6,
|
||||
8,
|
||||
10,
|
||||
0, 2
|
||||
};
|
||||
|
||||
|
||||
|
||||
static char dest_map_aio_ss[8] = {
|
||||
0, // Analogue
|
||||
8, // AES
|
||||
10, // SPDIF
|
||||
12, 14, 16, 18, // ADAT
|
||||
6 // Phones
|
||||
};
|
||||
|
||||
|
||||
static char dest_map_aio_ds[6] = {
|
||||
0, // Analogue
|
||||
8, // AES
|
||||
10, // SPDIF
|
||||
12, 16, // ADAT
|
||||
6 // Phones
|
||||
};
|
||||
|
||||
static char dest_map_aio_qs[5] = {
|
||||
0, // Analogue
|
||||
8, // AES
|
||||
10, // SPDIF
|
||||
12, // ADAT
|
||||
6 // Phone
|
||||
};
|
||||
|
||||
|
||||
static char dest_map_mf_ss[10] = {
|
||||
0, 2, 4, 6, 16, 18, 20, 22, 24, 26
|
||||
};
|
||||
|
|
@ -181,8 +241,10 @@ int HDSPMixerCard::getSpeed()
|
|||
snd_ctl_elem_value_t *elemval;
|
||||
snd_ctl_elem_id_t * elemid;
|
||||
snd_ctl_t *handle;
|
||||
|
||||
snd_ctl_elem_value_alloca(&elemval);
|
||||
snd_ctl_elem_id_alloca(&elemid);
|
||||
|
||||
if ((err = snd_ctl_open(&handle, name, SND_CTL_NONBLOCK)) < 0) {
|
||||
fprintf(stderr, "Error accessing ctl interface on card %s\n.", name);
|
||||
return -1;
|
||||
|
|
@ -198,6 +260,7 @@ int HDSPMixerCard::getSpeed()
|
|||
}
|
||||
val = snd_ctl_elem_value_get_enumerated(elemval, 0);
|
||||
snd_ctl_close(handle);
|
||||
|
||||
switch (val) {
|
||||
case 0:
|
||||
/* Autosync mode : We need to determine sample rate */
|
||||
|
|
@ -225,7 +288,7 @@ int HDSPMixerCard::getSpeed()
|
|||
return 0;
|
||||
}
|
||||
|
||||
HDSPMixerCard::HDSPMixerCard(HDSP_IO_Type cardtype, int id)
|
||||
HDSPMixerCard::HDSPMixerCard(int cardtype, int id)
|
||||
{
|
||||
type = cardtype;
|
||||
card_id = id;
|
||||
|
|
@ -238,6 +301,7 @@ HDSPMixerCard::HDSPMixerCard(HDSP_IO_Type cardtype, int id)
|
|||
} else {
|
||||
playbacks_offset = 26;
|
||||
}
|
||||
|
||||
speed_mode = getSpeed();
|
||||
if (speed_mode < 0) {
|
||||
fprintf(stderr, "Error trying to determine speed mode for card %s, exiting.\n", name);
|
||||
|
|
@ -271,18 +335,18 @@ void HDSPMixerCard::adjustSettings() {
|
|||
if (type == Multiface) {
|
||||
switch (speed_mode) {
|
||||
case 0:
|
||||
channels = 18;
|
||||
channel_map = channel_map_mf_ss;
|
||||
channels_input = 18;
|
||||
channels_playback = 20;
|
||||
channel_map_input = channel_map_playback = channel_map_mf_ss;
|
||||
dest_map = dest_map_mf_ss;
|
||||
meter_map = channel_map_mf_ss;
|
||||
lineouts = 2;
|
||||
meter_map_input = meter_map_playback = channel_map_mf_ss;
|
||||
break;
|
||||
case 1:
|
||||
channels = 14;
|
||||
channel_map = meter_map_ds;
|
||||
channels_input = 14;
|
||||
channels_playback = 16;
|
||||
channel_map_input = channel_map_playback = meter_map_ds;
|
||||
dest_map = dest_map_ds;
|
||||
meter_map = meter_map_ds;
|
||||
lineouts = 2;
|
||||
meter_map_input = meter_map_playback = meter_map_ds;
|
||||
break;
|
||||
case 2:
|
||||
/* should never happen */
|
||||
|
|
@ -291,18 +355,16 @@ void HDSPMixerCard::adjustSettings() {
|
|||
} else if (type == Digiface) {
|
||||
switch (speed_mode) {
|
||||
case 0:
|
||||
channels = 26;
|
||||
channel_map = channel_map_df_ss;
|
||||
channels_input = channels_playback = 26;
|
||||
channel_map_input = channel_map_playback = channel_map_df_ss;
|
||||
dest_map = dest_map_df_ss;
|
||||
meter_map = channel_map_df_ss;
|
||||
lineouts = 2;
|
||||
meter_map_input = meter_map_playback = channel_map_df_ss;
|
||||
break;
|
||||
case 1:
|
||||
channels = 14;
|
||||
channel_map = meter_map_ds;
|
||||
channels_input = channels_playback = 14;
|
||||
channel_map_input = channel_map_playback = meter_map_ds;
|
||||
dest_map = dest_map_ds;
|
||||
meter_map = meter_map_ds;
|
||||
lineouts = 2;
|
||||
meter_map_input = meter_map_playback = meter_map_ds;
|
||||
break;
|
||||
case 2:
|
||||
/* should never happen */
|
||||
|
|
@ -311,18 +373,16 @@ void HDSPMixerCard::adjustSettings() {
|
|||
} else if (type == H9652) {
|
||||
switch (speed_mode) {
|
||||
case 0:
|
||||
channels = 26;
|
||||
channel_map = channel_map_df_ss;
|
||||
channels_input = channels_playback = 26;
|
||||
channel_map_input = channel_map_playback = channel_map_df_ss;
|
||||
dest_map = dest_map_h9652_ss;
|
||||
meter_map = channel_map_df_ss;
|
||||
lineouts = 0;
|
||||
meter_map_input = meter_map_playback = channel_map_df_ss;
|
||||
break;
|
||||
case 1:
|
||||
channels = 14;
|
||||
channel_map = channel_map_ds;
|
||||
channels_input = channels_playback = 14;
|
||||
channel_map_input = channel_map_playback = channel_map_ds;
|
||||
dest_map = dest_map_h9652_ds;
|
||||
meter_map = meter_map_ds;
|
||||
lineouts = 0;
|
||||
meter_map_input = meter_map_playback = meter_map_ds;
|
||||
break;
|
||||
case 2:
|
||||
/* should never happen */
|
||||
|
|
@ -331,29 +391,111 @@ void HDSPMixerCard::adjustSettings() {
|
|||
} else if (type == H9632) {
|
||||
switch (speed_mode) {
|
||||
case 0:
|
||||
channels = 12 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0);
|
||||
channel_map = channel_map_h9632_ss;
|
||||
channels_input = channels_playback = 12 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0);
|
||||
channel_map_input = channel_map_playback = channel_map_h9632_ss;
|
||||
dest_map = dest_map_h9632_ss;
|
||||
meter_map = channel_map_h9632_ss;
|
||||
lineouts = 0;
|
||||
meter_map_input = meter_map_playback = channel_map_h9632_ss;
|
||||
break;
|
||||
case 1:
|
||||
channels = 8 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0);
|
||||
channel_map = channel_map_h9632_ds;
|
||||
channels_input = channels_playback = 8 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0);
|
||||
channel_map_input = channel_map_playback = channel_map_h9632_ds;
|
||||
dest_map = dest_map_h9632_ds;
|
||||
meter_map = channel_map_h9632_ds;
|
||||
lineouts = 0;
|
||||
meter_map_input = meter_map_playback = channel_map_h9632_ds;
|
||||
break;
|
||||
case 2:
|
||||
channels = 4 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0);
|
||||
channel_map = channel_map_h9632_qs;
|
||||
channels_input = channels_playback = 4 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0);
|
||||
channel_map_input = channel_map_playback = channel_map_h9632_qs;
|
||||
dest_map = dest_map_h9632_qs;
|
||||
meter_map = channel_map_h9632_qs;
|
||||
lineouts = 0;
|
||||
meter_map_input = meter_map_playback = channel_map_h9632_qs;
|
||||
break;
|
||||
}
|
||||
} else if (HDSPeMADI == type) {
|
||||
playbacks_offset = 64;
|
||||
|
||||
switch (speed_mode) {
|
||||
case 0: // SS
|
||||
channels_input = channels_playback = 64;
|
||||
channel_map_input = channel_map_playback = channel_map_unity_ss;
|
||||
dest_map = dest_map_madi_ss;
|
||||
meter_map_input = meter_map_playback = channel_map_unity_ss;
|
||||
break;
|
||||
case 1: // DS
|
||||
channels_input = channels_playback = 32;
|
||||
channel_map_input = channel_map_playback = channel_map_unity_ss;
|
||||
dest_map = dest_map_madi_ss;
|
||||
meter_map_input = meter_map_playback = channel_map_unity_ss;
|
||||
break;
|
||||
case 2: // QS
|
||||
channels_input = channels_playback = 16;
|
||||
channel_map_input = channel_map_playback = channel_map_unity_ss;
|
||||
dest_map = dest_map_madi_ss;
|
||||
meter_map_input = meter_map_playback = channel_map_unity_ss;
|
||||
break;
|
||||
}
|
||||
|
||||
} else if (HDSPeAIO == type) {
|
||||
playbacks_offset = 64;
|
||||
|
||||
switch (speed_mode) {
|
||||
case 0: // SS
|
||||
channels_input = 14;
|
||||
channels_playback = 16;
|
||||
channel_map_input = channel_map_aio_in_ss;
|
||||
channel_map_playback = channel_map_aio_out_ss;
|
||||
dest_map = dest_map_aio_ss;
|
||||
meter_map_input = channel_map_aio_in_ss;
|
||||
meter_map_playback = channel_map_aio_out_ss;
|
||||
break;
|
||||
case 1: // DS
|
||||
channels_input = 10;
|
||||
channels_playback = 12;
|
||||
channel_map_input = channel_map_aio_in_ds;
|
||||
channel_map_playback = channel_map_aio_out_ds;
|
||||
dest_map = dest_map_aio_ds;
|
||||
meter_map_input = channel_map_aio_in_ds;
|
||||
meter_map_playback = channel_map_aio_out_ds;
|
||||
break;
|
||||
case 2: // QS
|
||||
channels_input = 8;
|
||||
channels_playback =10;
|
||||
channel_map_input = channel_map_aio_in_qs;
|
||||
channel_map_playback = channel_map_aio_out_qs;
|
||||
dest_map = dest_map_aio_qs;
|
||||
meter_map_input = channel_map_aio_in_qs;
|
||||
meter_map_playback = channel_map_aio_out_qs;
|
||||
break;
|
||||
}
|
||||
|
||||
} else if (HDSPeRayDAT == type) {
|
||||
playbacks_offset = 64;
|
||||
|
||||
switch (speed_mode) {
|
||||
case 0: // SS
|
||||
channels_input = 36;
|
||||
channels_playback = 36;
|
||||
channel_map_input = channel_map_playback = channel_map_raydat_ss;
|
||||
dest_map = dest_map_raydat_ss;
|
||||
meter_map_input = meter_map_playback = channel_map_raydat_ss;
|
||||
break;
|
||||
case 1: // DS
|
||||
channels_input = 20;
|
||||
channels_playback = 20;
|
||||
channel_map_input = channel_map_playback = channel_map_raydat_ds;
|
||||
dest_map = dest_map_raydat_ds;
|
||||
meter_map_input = meter_map_playback = channel_map_raydat_ds;
|
||||
break;
|
||||
case 2: // QS
|
||||
channels_input = 12;
|
||||
channels_playback =12;
|
||||
channel_map_input = channel_map_playback = channel_map_raydat_qs;
|
||||
dest_map = dest_map_raydat_qs;
|
||||
meter_map_input = meter_map_playback = channel_map_raydat_qs;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
window_width = (channels+2)*STRIP_WIDTH;
|
||||
|
||||
window_width = (channels_playback+2)*STRIP_WIDTH;
|
||||
window_height = FULLSTRIP_HEIGHT*2+SMALLSTRIP_HEIGHT+MENU_HEIGHT;
|
||||
}
|
||||
|
||||
|
|
@ -363,28 +505,28 @@ void HDSPMixerCard::setMode(int mode)
|
|||
adjustSettings();
|
||||
actualizeStrips();
|
||||
|
||||
for (int i = 0; i < channels; ++i) {
|
||||
basew->inputs->strips[i]->targets->setLabels();
|
||||
basew->playbacks->strips[i]->targets->setLabels();
|
||||
basew->outputs->strips[i]->setLabels();
|
||||
for (int i = 0; i < channels_input; ++i) {
|
||||
basew->inputs->strips[i]->targets->setLabels();
|
||||
}
|
||||
for (int i = channels; i < channels+lineouts; ++i) {
|
||||
basew->outputs->strips[i]->setLabels();
|
||||
for (int i = 0; i < channels_playback; ++i) {
|
||||
basew->playbacks->strips[i]->targets->setLabels();
|
||||
basew->outputs->strips[i]->setLabels();
|
||||
}
|
||||
|
||||
if (h9632_aeb.aebo && !h9632_aeb.aebi) {
|
||||
basew->inputs->empty_aebi[0]->position(STRIP_WIDTH*(channels-4), basew->inputs->empty_aebi[0]->y());
|
||||
basew->inputs->empty_aebi[1]->position(STRIP_WIDTH*(channels-2), basew->inputs->empty_aebi[1]->y());
|
||||
basew->inputs->empty_aebi[0]->position(STRIP_WIDTH*(channels_input-4), basew->inputs->empty_aebi[0]->y());
|
||||
basew->inputs->empty_aebi[1]->position(STRIP_WIDTH*(channels_input-2), basew->inputs->empty_aebi[1]->y());
|
||||
} else if (h9632_aeb.aebi && !h9632_aeb.aebo) {
|
||||
basew->playbacks->empty_aebo[0]->position(STRIP_WIDTH*(channels-4), basew->playbacks->empty_aebo[0]->y());
|
||||
basew->playbacks->empty_aebo[1]->position(STRIP_WIDTH*(channels-2), basew->playbacks->empty_aebo[1]->y());
|
||||
basew->outputs->empty_aebo[0]->position(STRIP_WIDTH*(channels-4), basew->outputs->empty_aebo[0]->y());
|
||||
basew->outputs->empty_aebo[1]->position(STRIP_WIDTH*(channels-2), basew->outputs->empty_aebo[1]->y());
|
||||
basew->playbacks->empty_aebo[0]->position(STRIP_WIDTH*(channels_playback-4), basew->playbacks->empty_aebo[0]->y());
|
||||
basew->playbacks->empty_aebo[1]->position(STRIP_WIDTH*(channels_playback-2), basew->playbacks->empty_aebo[1]->y());
|
||||
basew->outputs->empty_aebo[0]->position(STRIP_WIDTH*(channels_playback-4), basew->outputs->empty_aebo[0]->y());
|
||||
basew->outputs->empty_aebo[1]->position(STRIP_WIDTH*(channels_playback-2), basew->outputs->empty_aebo[1]->y());
|
||||
}
|
||||
basew->inputs->buttons->position(STRIP_WIDTH*channels, basew->inputs->buttons->y());
|
||||
basew->inputs->buttons->position(STRIP_WIDTH*channels_input, basew->inputs->buttons->y());
|
||||
basew->inputs->init_sizes();
|
||||
basew->playbacks->empty->position(STRIP_WIDTH*channels, basew->playbacks->empty->y());
|
||||
basew->playbacks->empty->position(STRIP_WIDTH*channels_playback, basew->playbacks->empty->y());
|
||||
basew->playbacks->init_sizes();
|
||||
basew->outputs->empty->position(STRIP_WIDTH*(channels+lineouts), basew->outputs->empty->y());
|
||||
basew->outputs->empty->position(STRIP_WIDTH*(channels_playback), basew->outputs->empty->y());
|
||||
basew->outputs->init_sizes();
|
||||
basew->inputs->size(window_width, basew->inputs->h());
|
||||
basew->playbacks->size(window_width, basew->playbacks->h());
|
||||
|
|
@ -401,30 +543,26 @@ void HDSPMixerCard::setMode(int mode)
|
|||
void HDSPMixerCard::actualizeStrips()
|
||||
{
|
||||
for (int i = 0; i < HDSP_MAX_CHANNELS; ++i) {
|
||||
if (i < channels) {
|
||||
if (i < channels_input) {
|
||||
basew->inputs->strips[i]->show();
|
||||
} else {
|
||||
basew->inputs->strips[i]->hide();
|
||||
}
|
||||
if (i < channels_playback) {
|
||||
basew->playbacks->strips[i]->show();
|
||||
basew->outputs->strips[i]->show();
|
||||
} else {
|
||||
basew->inputs->strips[i]->hide();
|
||||
basew->playbacks->strips[i]->hide();
|
||||
basew->outputs->strips[i]->hide();
|
||||
}
|
||||
}
|
||||
for (int i = channels; i < channels+2; ++i) {
|
||||
if (i < channels+lineouts) {
|
||||
basew->outputs->strips[i]->show();
|
||||
} else {
|
||||
basew->outputs->strips[i]->hide();
|
||||
}
|
||||
}
|
||||
if (h9632_aeb.aebi && !h9632_aeb.aebo) {
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
basew->inputs->empty_aebi[i]->hide();
|
||||
basew->playbacks->empty_aebo[i]->show();
|
||||
basew->outputs->empty_aebo[i]->show();
|
||||
}
|
||||
for (int i = channels-4; i < channels; ++i) {
|
||||
for (int i = channels_playback-4; i < channels_playback; ++i) {
|
||||
basew->playbacks->strips[i]->hide();
|
||||
basew->outputs->strips[i]->hide();
|
||||
}
|
||||
|
|
@ -434,7 +572,7 @@ void HDSPMixerCard::actualizeStrips()
|
|||
basew->playbacks->empty_aebo[i]->hide();
|
||||
basew->outputs->empty_aebo[i]->hide();
|
||||
}
|
||||
for (int i = channels-4; i < channels; ++i) {
|
||||
for (int i = channels_input-4; i < channels_input; ++i) {
|
||||
basew->inputs->strips[i]->hide();
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue