|
Packit |
427e91 |
/*
|
|
Packit |
427e91 |
* HDSPMixer
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org)
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* Copyright (C) 2011 Adrian Knoth (adi@drcomp.erfurt.thur.de)
|
|
Packit |
427e91 |
* Fredrik Lingvall (fredrik.lingvall@gmail.com)
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
427e91 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
427e91 |
* the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
427e91 |
* (at your option) any later version.
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
427e91 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
427e91 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
427e91 |
* GNU General Public License for more details.
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
427e91 |
* along with this program; if not, write to the Free Software
|
|
Packit |
427e91 |
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#pragma implementation
|
|
Packit |
427e91 |
#include "HDSPMixerCard.h"
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void alsactl_cb(snd_async_handler_t *handler)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err, clock_value;
|
|
Packit |
427e91 |
snd_ctl_t *ctl;
|
|
Packit |
427e91 |
snd_ctl_event_t *event;
|
|
Packit |
427e91 |
snd_ctl_elem_value_t *elemval;
|
|
Packit |
427e91 |
snd_ctl_elem_id_t *elemid;
|
|
Packit |
427e91 |
HDSPMixerCard *card;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
card = (HDSPMixerCard *)snd_async_handler_get_callback_private(handler);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_elem_value_alloca(&elemval);
|
|
Packit |
427e91 |
snd_ctl_elem_id_alloca(&elemid);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
ctl = snd_async_handler_get_ctl(handler);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = snd_ctl_nonblock(ctl, 1))) {
|
|
Packit |
427e91 |
printf("Error setting non blocking mode for card %s\n", card->name);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_event_malloc(&event);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
while ((err = snd_ctl_read(ctl, event)) > 0) {
|
|
Packit |
427e91 |
if (snd_ctl_event_elem_get_numid(event) == 11 && (card == card->basew->cards[card->basew->current_card])) {
|
|
Packit |
427e91 |
/* We have a clock change and are the focused card */
|
|
Packit |
427e91 |
snd_ctl_event_elem_get_id(event, elemid);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_id(elemval, elemid);
|
|
Packit |
427e91 |
if ((err = snd_ctl_elem_read(ctl, elemval)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Error reading snd_ctl_elem_t\n");
|
|
Packit |
427e91 |
snd_ctl_event_free(event);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
clock_value = snd_ctl_elem_value_get_enumerated(elemval, 0);
|
|
Packit |
427e91 |
if (clock_value == 0) {
|
|
Packit |
427e91 |
int new_speed = card->getAutosyncSpeed();
|
|
Packit |
427e91 |
if (new_speed >= 0 && new_speed != card->speed_mode) card->setMode(new_speed);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (clock_value > 3 && clock_value < 7 && card->speed_mode != 1) {
|
|
Packit |
427e91 |
card->setMode(1);
|
|
Packit |
427e91 |
} else if (clock_value < 4 && card->speed_mode != 0) {
|
|
Packit |
427e91 |
card->setMode(0);
|
|
Packit |
427e91 |
} else if (clock_value > 6 && card->speed_mode != 2) {
|
|
Packit |
427e91 |
card->setMode(2);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
snd_ctl_event_clear(event);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_event_free(event);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int HDSPMixerCard::getAutosyncSpeed()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err, rate;
|
|
Packit |
427e91 |
snd_ctl_elem_value_t *elemval;
|
|
Packit |
427e91 |
snd_ctl_elem_id_t * elemid;
|
|
Packit |
427e91 |
snd_ctl_t *handle;
|
|
Packit |
427e91 |
snd_ctl_elem_value_alloca(&elemval);
|
|
Packit |
427e91 |
snd_ctl_elem_id_alloca(&elemid);
|
|
Packit |
427e91 |
if ((err = snd_ctl_open(&handle, name, SND_CTL_NONBLOCK)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Error accessing ctl interface on card %s\n.", name);
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_name(elemid, "System Sample Rate");
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_interface(elemid, SND_CTL_ELEM_IFACE_MIXER);
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_index(elemid, 0);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_id(elemval, elemid);
|
|
Packit |
427e91 |
if (snd_ctl_elem_read(handle, elemval) < 0) {
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_interface(elemid, SND_CTL_ELEM_IFACE_HWDEP);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_id(elemval, elemid);
|
|
Packit |
427e91 |
snd_ctl_elem_read(handle, elemval);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
rate = snd_ctl_elem_value_get_integer(elemval, 0);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_close(handle);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (rate > 96000) {
|
|
Packit |
427e91 |
return 2;
|
|
Packit |
427e91 |
} else if (rate > 48000) {
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int HDSPMixerCard::getSpeed()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err, val;
|
|
Packit |
427e91 |
snd_ctl_elem_value_t *elemval;
|
|
Packit |
427e91 |
snd_ctl_elem_id_t * elemid;
|
|
Packit |
427e91 |
snd_ctl_t *handle;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_elem_value_alloca(&elemval);
|
|
Packit |
427e91 |
snd_ctl_elem_id_alloca(&elemid);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = snd_ctl_open(&handle, name, SND_CTL_NONBLOCK)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Error accessing ctl interface on card %s\n.", name);
|
|
Packit |
427e91 |
return -1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_name(elemid, "Sample Clock Source");
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_interface(elemid, SND_CTL_ELEM_IFACE_MIXER);
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_index(elemid, 0);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_id(elemval, elemid);
|
|
Packit |
427e91 |
if (snd_ctl_elem_read(handle, elemval) < 0) {
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_interface(elemid, SND_CTL_ELEM_IFACE_PCM);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_id(elemval, elemid);
|
|
Packit |
427e91 |
snd_ctl_elem_read(handle, elemval);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
val = snd_ctl_elem_value_get_enumerated(elemval, 0);
|
|
Packit |
427e91 |
snd_ctl_close(handle);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
switch (val) {
|
|
Packit |
427e91 |
case 0:
|
|
Packit |
427e91 |
/* Autosync mode : We need to determine sample rate */
|
|
Packit |
427e91 |
return getAutosyncSpeed();
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 1:
|
|
Packit |
427e91 |
case 2:
|
|
Packit |
427e91 |
case 3:
|
|
Packit |
427e91 |
/* SR <= 48000 - normal speed */
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
case 4:
|
|
Packit |
427e91 |
case 5:
|
|
Packit |
427e91 |
case 6:
|
|
Packit |
427e91 |
/* SR > 48000 Hz - double speed */
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
case 7:
|
|
Packit |
427e91 |
case 8:
|
|
Packit |
427e91 |
case 9:
|
|
Packit |
427e91 |
/* SR > 96000 Hz - quad speed */
|
|
Packit |
427e91 |
return 2;
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
/* Should never happen */
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
HDSPMixerCard::HDSPMixerCard(int cardtype, int id, char *shortname)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
type = cardtype;
|
|
Packit |
427e91 |
card_id = id;
|
|
Packit |
427e91 |
snprintf(name, 6, "hw:%i", card_id);
|
|
Packit |
427e91 |
cardname = shortname;
|
|
Packit |
427e91 |
h9632_aeb.aebi = 0;
|
|
Packit |
427e91 |
h9632_aeb.aebo = 0;
|
|
Packit |
427e91 |
if (type == H9632) {
|
|
Packit |
427e91 |
getAeb();
|
|
Packit |
427e91 |
playbacks_offset = 16;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
playbacks_offset = 26;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
speed_mode = getSpeed();
|
|
Packit |
427e91 |
if (speed_mode < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Error trying to determine speed mode for card %s, exiting.\n", name);
|
|
Packit |
427e91 |
exit(EXIT_FAILURE);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* Set channels and mappings */
|
|
Packit |
427e91 |
adjustSettings();
|
|
Packit |
427e91 |
last_preset = last_dirty = 0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
basew = NULL;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerCard::getAeb() {
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
snd_hwdep_t *hw;
|
|
Packit |
427e91 |
snd_hwdep_info_t *info;
|
|
Packit |
427e91 |
snd_hwdep_info_alloca(&info;;
|
|
Packit |
427e91 |
if ((err = snd_hwdep_open(&hw, name, SND_HWDEP_OPEN_DUPLEX)) != 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Error opening hwdep device on card %s.\n", name);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if ((err = snd_hwdep_ioctl(hw, SNDRV_HDSP_IOCTL_GET_9632_AEB, &h9632_aeb)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Hwdep ioctl error on card %s : %s.\n", name, snd_strerror(err));
|
|
Packit |
427e91 |
snd_hwdep_close(hw);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
snd_hwdep_close(hw);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerCard::adjustSettings() {
|
|
Packit |
427e91 |
if (type == Multiface) {
|
|
Packit |
427e91 |
switch (speed_mode) {
|
|
Packit |
427e91 |
case 0:
|
|
Packit |
427e91 |
channels_input = 18;
|
|
Packit |
427e91 |
channels_playback = 18;
|
|
Packit |
427e91 |
channels_output = 20; /* SS 8xAnalog+8xADAT+2xSPDIF+2xHeadphone */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_mf_ss;
|
|
Packit |
427e91 |
dest_map = dest_map_mf_ss;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_mf_ss;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 1:
|
|
Packit |
427e91 |
channels_input = 14;
|
|
Packit |
427e91 |
channels_playback = 14;
|
|
Packit |
427e91 |
channels_output = 16; /* DS 8xAnalog+4xADAT(SMUX)+2xSPDIF+2xHeadphone */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = meter_map_ds;
|
|
Packit |
427e91 |
dest_map = dest_map_ds;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = meter_map_ds;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 2:
|
|
Packit |
427e91 |
/* should never happen */
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (type == Digiface) {
|
|
Packit |
427e91 |
switch (speed_mode) {
|
|
Packit |
427e91 |
case 0:
|
|
Packit |
427e91 |
channels_input = channels_playback = 26;
|
|
Packit |
427e91 |
channels_output = 28; /* SS 3x8xADAT+2xSPDIF+2xHeadphone */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_df_ss;
|
|
Packit |
427e91 |
dest_map = dest_map_df_ss;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_df_ss;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 1:
|
|
Packit |
427e91 |
channels_input = channels_playback = 14;
|
|
Packit |
427e91 |
channels_output = 16; /* DS 3x4xADAT(SMUX)+2xSPDIF+2xHeadphone */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = meter_map_ds;
|
|
Packit |
427e91 |
dest_map = dest_map_ds;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = meter_map_ds;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 2:
|
|
Packit |
427e91 |
/* should never happen */
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (type == RPM) {
|
|
Packit |
427e91 |
/* RPM has no digital audio connectors, hence channel mappings don't
|
|
Packit |
427e91 |
* depend on speedmode */
|
|
Packit |
427e91 |
channels_input = 5;
|
|
Packit |
427e91 |
channels_playback = channels_output = 6; /* 2xMain,2xMon,2xPH */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_rpm;
|
|
Packit |
427e91 |
dest_map = dest_map_rpm;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_rpm;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (type == H9652) {
|
|
Packit |
427e91 |
switch (speed_mode) {
|
|
Packit |
427e91 |
case 0:
|
|
Packit |
427e91 |
channels_input = channels_playback = 26;
|
|
Packit |
427e91 |
channels_output = 26; /* SS like Digiface, but no Headphones */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_df_ss;
|
|
Packit |
427e91 |
dest_map = dest_map_h9652_ss;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_df_ss;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 1:
|
|
Packit |
427e91 |
channels_input = channels_playback = 14;
|
|
Packit |
427e91 |
channels_output = 14; /* DS like Digiface, but no Headphones */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_ds;
|
|
Packit |
427e91 |
dest_map = dest_map_h9652_ds;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = meter_map_ds;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 2:
|
|
Packit |
427e91 |
/* should never happen */
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (type == H9632) {
|
|
Packit |
427e91 |
switch (speed_mode) {
|
|
Packit |
427e91 |
case 0:
|
|
Packit |
427e91 |
channels_input = channels_playback = 12 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0);
|
|
Packit |
427e91 |
channels_output = channels_playback; /* untested, no idea about this card */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_h9632_ss;
|
|
Packit |
427e91 |
dest_map = dest_map_h9632_ss;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_h9632_ss;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 1:
|
|
Packit |
427e91 |
channels_input = channels_playback = 8 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0);
|
|
Packit |
427e91 |
channels_output = channels_playback; /* untested, no idea about this card */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_h9632_ds;
|
|
Packit |
427e91 |
dest_map = dest_map_h9632_ds;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_h9632_ds;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 2:
|
|
Packit |
427e91 |
channels_input = channels_playback = 4 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0);
|
|
Packit |
427e91 |
channels_output = channels_playback; /* untested, no idea about this card */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_h9632_qs;
|
|
Packit |
427e91 |
dest_map = dest_map_h9632_qs;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_h9632_qs;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (HDSPeMADI == type) {
|
|
Packit |
427e91 |
playbacks_offset = 64;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
switch (speed_mode) {
|
|
Packit |
427e91 |
case 0: // SS
|
|
Packit |
427e91 |
channels_input = channels_playback = 64;
|
|
Packit |
427e91 |
channels_output = channels_input; /* SS headphones missing, at least HDSPe MADI has some, MADIface hasn't */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_unity_ss;
|
|
Packit |
427e91 |
dest_map = dest_map_unity;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_unity_ss;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 1: // DS
|
|
Packit |
427e91 |
channels_input = channels_playback = 32;
|
|
Packit |
427e91 |
channels_output = channels_input; /* DS headphones missing, at least HDSPe MADI has some, MADIface hasn't */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_unity_ss;
|
|
Packit |
427e91 |
dest_map = dest_map_unity;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_unity_ss;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 2: // QS
|
|
Packit |
427e91 |
channels_input = channels_playback = 16;
|
|
Packit |
427e91 |
channels_output = channels_input; /* QS headphones missing, at least HDSPe MADI has some, MADIface hasn't */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_unity_ss;
|
|
Packit |
427e91 |
dest_map = dest_map_unity;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_unity_ss;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (HDSPeAIO == type) {
|
|
Packit |
427e91 |
playbacks_offset = 64;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
switch (speed_mode) {
|
|
Packit |
427e91 |
case 0: // SS
|
|
Packit |
427e91 |
channels_input = 18;
|
|
Packit |
427e91 |
channels_playback = 20;
|
|
Packit |
427e91 |
channels_output = 20; /* SS 2xAnalog+2xAES+2xSPDIF+8xADAT+2xHeadphones+4xAEB */
|
|
Packit |
427e91 |
channel_map_input = channel_map_aio_in_ss;
|
|
Packit |
427e91 |
channel_map_playback = channel_map_aio_out_ss;
|
|
Packit |
427e91 |
dest_map = dest_map_aio_ss;
|
|
Packit |
427e91 |
meter_map_input = channel_map_aio_in_ss;
|
|
Packit |
427e91 |
meter_map_playback = channel_map_aio_out_ss;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 1: // DS
|
|
Packit |
427e91 |
channels_input = 14;
|
|
Packit |
427e91 |
channels_playback = 16;
|
|
Packit |
427e91 |
channels_output = 16; /* DS 2xAnalog+2xAES+2xSPDIF+4xADAT(SMUX)+2xHeadphones+4xAEB */
|
|
Packit |
427e91 |
channel_map_input = channel_map_aio_in_ds;
|
|
Packit |
427e91 |
channel_map_playback = channel_map_aio_out_ds;
|
|
Packit |
427e91 |
dest_map = dest_map_aio_ds;
|
|
Packit |
427e91 |
meter_map_input = channel_map_aio_in_ds;
|
|
Packit |
427e91 |
meter_map_playback = channel_map_aio_out_ds;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 2: // QS
|
|
Packit |
427e91 |
channels_input = 12;
|
|
Packit |
427e91 |
channels_playback = 14;
|
|
Packit |
427e91 |
channels_output = 14; /* QS 2xAnalog+2xAES+2xSPDIF+2xADAT(SMUX)+2xHeadphones+4xAEB */
|
|
Packit |
427e91 |
channel_map_input = channel_map_aio_in_qs;
|
|
Packit |
427e91 |
channel_map_playback = channel_map_aio_out_qs;
|
|
Packit |
427e91 |
dest_map = dest_map_aio_qs;
|
|
Packit |
427e91 |
meter_map_input = channel_map_aio_in_qs;
|
|
Packit |
427e91 |
meter_map_playback = channel_map_aio_out_qs;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (HDSP_AES == type) {
|
|
Packit |
427e91 |
playbacks_offset = 64; /* not sure about this one? */
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* 16 channels for all modes */
|
|
Packit |
427e91 |
channels_input = 16;
|
|
Packit |
427e91 |
channels_playback = 16;
|
|
Packit |
427e91 |
channels_output = 16;
|
|
Packit |
427e91 |
channel_map_input = channel_map_aes32;
|
|
Packit |
427e91 |
channel_map_playback = channel_map_aes32;
|
|
Packit |
427e91 |
dest_map = dest_map_aes32;
|
|
Packit |
427e91 |
meter_map_input = channel_map_aes32;
|
|
Packit |
427e91 |
meter_map_playback = channel_map_aes32;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (HDSPeRayDAT == type) {
|
|
Packit |
427e91 |
playbacks_offset = 64;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
switch (speed_mode) {
|
|
Packit |
427e91 |
case 0: // SS
|
|
Packit |
427e91 |
channels_input = 36;
|
|
Packit |
427e91 |
channels_playback = 36;
|
|
Packit |
427e91 |
channels_output = 36; /* SS 4x8xADAT+2xAES/EBU+2xSPDIF */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_raydat_ss;
|
|
Packit |
427e91 |
dest_map = dest_map_raydat_ss;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_raydat_ss;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 1: // DS
|
|
Packit |
427e91 |
channels_input = 20;
|
|
Packit |
427e91 |
channels_playback = 20;
|
|
Packit |
427e91 |
channels_output = 20; /* DS 4x4xADAT(SMUX)+2xAES/EBU+2xSPDIF */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_raydat_ds;
|
|
Packit |
427e91 |
dest_map = dest_map_raydat_ds;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_raydat_ds;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 2: // QS
|
|
Packit |
427e91 |
channels_input = 12;
|
|
Packit |
427e91 |
channels_playback = 12;
|
|
Packit |
427e91 |
channels_output = 12; /* QS 4x2xADAT(SMUX)+2xAES/EBU+2xSPDIF */
|
|
Packit |
427e91 |
channel_map_input = channel_map_playback = channel_map_raydat_qs;
|
|
Packit |
427e91 |
dest_map = dest_map_raydat_qs;
|
|
Packit |
427e91 |
meter_map_input = meter_map_playback = channel_map_raydat_qs;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
window_width = (channels_playback+2)*STRIP_WIDTH;
|
|
Packit |
427e91 |
window_height = FULLSTRIP_HEIGHT*2+SMALLSTRIP_HEIGHT+MENU_HEIGHT;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerCard::setMode(int mode)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
speed_mode = mode;
|
|
Packit |
427e91 |
adjustSettings();
|
|
Packit |
427e91 |
actualizeStrips();
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (int i = 0; i < channels_input; ++i) {
|
|
Packit |
427e91 |
basew->inputs->strips[i]->targets->setLabels();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
for (int i = 0; i < channels_playback; ++i) {
|
|
Packit |
427e91 |
basew->playbacks->strips[i]->targets->setLabels();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
for (int i = 0; i < channels_output; ++i) {
|
|
Packit |
427e91 |
basew->outputs->strips[i]->setLabels();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (h9632_aeb.aebo && !h9632_aeb.aebi) {
|
|
Packit |
427e91 |
basew->inputs->empty_aebi[0]->position(STRIP_WIDTH*(channels_input-4), basew->inputs->empty_aebi[0]->y());
|
|
Packit |
427e91 |
basew->inputs->empty_aebi[1]->position(STRIP_WIDTH*(channels_input-2), basew->inputs->empty_aebi[1]->y());
|
|
Packit |
427e91 |
} else if (h9632_aeb.aebi && !h9632_aeb.aebo) {
|
|
Packit |
427e91 |
basew->playbacks->empty_aebo[0]->position(STRIP_WIDTH*(channels_playback-4), basew->playbacks->empty_aebo[0]->y());
|
|
Packit |
427e91 |
basew->playbacks->empty_aebo[1]->position(STRIP_WIDTH*(channels_playback-2), basew->playbacks->empty_aebo[1]->y());
|
|
Packit |
427e91 |
basew->outputs->empty_aebo[0]->position(STRIP_WIDTH*(channels_playback-4), basew->outputs->empty_aebo[0]->y());
|
|
Packit |
427e91 |
basew->outputs->empty_aebo[1]->position(STRIP_WIDTH*(channels_playback-2), basew->outputs->empty_aebo[1]->y());
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
basew->inputs->buttons->position(STRIP_WIDTH*channels_input, basew->inputs->buttons->y());
|
|
Packit |
427e91 |
basew->inputs->init_sizes();
|
|
Packit |
427e91 |
basew->playbacks->empty->position(STRIP_WIDTH*channels_playback, basew->playbacks->empty->y());
|
|
Packit |
427e91 |
basew->playbacks->init_sizes();
|
|
Packit |
427e91 |
basew->outputs->empty->position(STRIP_WIDTH*(channels_playback), basew->outputs->empty->y());
|
|
Packit |
427e91 |
basew->outputs->init_sizes();
|
|
Packit |
427e91 |
basew->inputs->size(window_width, basew->inputs->h());
|
|
Packit |
427e91 |
basew->playbacks->size(window_width, basew->playbacks->h());
|
|
Packit |
427e91 |
basew->outputs->size(window_width, basew->outputs->h());
|
|
Packit |
427e91 |
basew->scroll->init_sizes();
|
|
Packit |
427e91 |
((Fl_Widget *)(basew->menubar))->size(window_width, basew->menubar->h());
|
|
Packit |
427e91 |
basew->size_range(MIN_WIDTH, MIN_HEIGHT, window_width, window_height);
|
|
Packit |
427e91 |
basew->resize(basew->x(), basew->y(), window_width, basew->h());
|
|
Packit |
427e91 |
basew->reorder();
|
|
Packit |
427e91 |
basew->resetMixer();
|
|
Packit |
427e91 |
basew->inputs->buttons->presets->preset_change(1);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerCard::actualizeStrips()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
for (int i = 0; i < HDSP_MAX_CHANNELS; ++i) {
|
|
Packit |
427e91 |
if (i < channels_input) {
|
|
Packit |
427e91 |
basew->inputs->strips[i]->show();
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
basew->inputs->strips[i]->hide();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (i < channels_playback) {
|
|
Packit |
427e91 |
basew->playbacks->strips[i]->show();
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
basew->playbacks->strips[i]->hide();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (i < channels_output) {
|
|
Packit |
427e91 |
basew->outputs->strips[i]->show();
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
basew->outputs->strips[i]->hide();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (h9632_aeb.aebi && !h9632_aeb.aebo) {
|
|
Packit |
427e91 |
for (int i = 0; i < 2; ++i) {
|
|
Packit |
427e91 |
basew->inputs->empty_aebi[i]->hide();
|
|
Packit |
427e91 |
basew->playbacks->empty_aebo[i]->show();
|
|
Packit |
427e91 |
basew->outputs->empty_aebo[i]->show();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
for (int i = channels_playback-4; i < channels_playback; ++i) {
|
|
Packit |
427e91 |
basew->playbacks->strips[i]->hide();
|
|
Packit |
427e91 |
basew->outputs->strips[i]->hide();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else if (h9632_aeb.aebo && !h9632_aeb.aebi) {
|
|
Packit |
427e91 |
for (int i = 0; i < 2; ++i) {
|
|
Packit |
427e91 |
basew->inputs->empty_aebi[i]->show();
|
|
Packit |
427e91 |
basew->playbacks->empty_aebo[i]->hide();
|
|
Packit |
427e91 |
basew->outputs->empty_aebo[i]->hide();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
for (int i = channels_input-4; i < channels_input; ++i) {
|
|
Packit |
427e91 |
basew->inputs->strips[i]->hide();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
for (int i = 0; i < 2; ++i) {
|
|
Packit |
427e91 |
basew->inputs->empty_aebi[i]->hide();
|
|
Packit |
427e91 |
basew->playbacks->empty_aebo[i]->hide();
|
|
Packit |
427e91 |
basew->outputs->empty_aebo[i]->hide();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (type != H9652 && type != H9632) basew->outputs->empty->hide();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int HDSPMixerCard::initializeCard(HDSPMixerWindow *w)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
if ((err = snd_ctl_open(&cb_handle, name, SND_CTL_NONBLOCK)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Error opening ctl interface for card %s - exiting\n", name);
|
|
Packit |
427e91 |
exit(EXIT_FAILURE);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if ((err = snd_async_add_ctl_handler(&cb_handler, cb_handle, alsactl_cb, this)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Error registering async ctl callback for card %s - exiting\n", name);
|
|
Packit |
427e91 |
exit(EXIT_FAILURE);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if ((err = snd_ctl_subscribe_events(cb_handle, 1)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Error subscribing to ctl events for card %s - exiting\n", name);
|
|
Packit |
427e91 |
exit(EXIT_FAILURE);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
basew = w;
|
|
Packit |
427e91 |
actualizeStrips();
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|