Blame envy24control/hardware.c

Packit 427e91
/*****************************************************************************
Packit 427e91
   hardware.c - Hardware Settings
Packit 427e91
   Copyright (C) 2000 by Jaroslav Kysela <perex@perex.cz>
Packit 427e91
   
Packit 427e91
   This program is free software; you can redistribute it and/or
Packit 427e91
   modify it under the terms of the GNU General Public License
Packit 427e91
   as published by the Free Software Foundation; either version 2
Packit 427e91
   of the License, or (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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit 427e91
******************************************************************************/
Packit 427e91
Packit 427e91
#include "envy24control.h"
Packit 427e91
Packit 427e91
static snd_ctl_elem_value_t *internal_clock;
Packit 427e91
static snd_ctl_elem_value_t *internal_clock_default;
Packit 427e91
static snd_ctl_elem_value_t *word_clock_sync;
Packit 427e91
static snd_ctl_elem_value_t *rate_locking;
Packit 427e91
static snd_ctl_elem_value_t *rate_reset;
Packit 427e91
static snd_ctl_elem_value_t *volume_rate;
Packit 427e91
static snd_ctl_elem_value_t *spdif_input;
Packit 427e91
static snd_ctl_elem_value_t *spdif_output;
Packit 427e91
static snd_ctl_elem_value_t *analog_input_select;
Packit 427e91
static snd_ctl_elem_value_t *breakbox_led;
Packit 427e91
static snd_ctl_elem_value_t *spdif_on_off;
Packit 427e91
static snd_ctl_elem_value_t *phono_input;
Packit 427e91
Packit 427e91
static inline int is_update_needed(void);
Packit 427e91
Packit 427e91
#define toggle_set(widget, state) \
Packit 427e91
	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), state);
Packit 427e91
Packit 427e91
static int is_active(GtkWidget *widget)
Packit 427e91
{
Packit 427e91
	return GTK_TOGGLE_BUTTON(widget)->active ? 1 : 0;
Packit 427e91
}
Packit 427e91
Packit 427e91
void master_clock_update(void)
Packit 427e91
{
Packit 427e91
	int err, rate, need_default_update;
Packit 427e91
	
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, internal_clock)) < 0)
Packit 427e91
		g_print("Unable to read Internal Clock state: %s\n", snd_strerror(err));
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, internal_clock_default)) < 0)
Packit 427e91
		g_print("Unable to read Internal Clock Default state: %s\n", snd_strerror(err));
Packit 427e91
	if (card_eeprom.subvendor == ICE1712_SUBDEVICE_DELTA1010 ||
Packit 427e91
	    card_eeprom.subvendor == ICE1712_SUBDEVICE_DELTA1010LT) {
Packit 427e91
		if ((err = snd_ctl_elem_read(ctl, word_clock_sync)) < 0)
Packit 427e91
			g_print("Unable to read word clock sync selection: %s\n", snd_strerror(err));
Packit 427e91
	}
Packit 427e91
	if (snd_ctl_elem_value_get_enumerated(internal_clock, 0) == 13) {
Packit 427e91
		if (snd_ctl_elem_value_get_boolean(word_clock_sync, 0)) {
Packit 427e91
			toggle_set(hw_master_clock_word_radio, TRUE);
Packit 427e91
		} else {
Packit 427e91
			toggle_set(hw_master_clock_spdif_radio, TRUE);
Packit 427e91
		}
Packit 427e91
	} else {
Packit 427e91
//		toggle_set(hw_master_clock_xtal_radio, TRUE);
Packit 427e91
		need_default_update = !is_update_needed() ? 1 : 0;
Packit 427e91
		if (need_default_update) {
Packit 427e91
			rate = snd_ctl_elem_value_get_enumerated(internal_clock_default, 0);
Packit 427e91
		} else {
Packit 427e91
			rate = snd_ctl_elem_value_get_enumerated(internal_clock, 0);
Packit 427e91
		}
Packit 427e91
		switch (rate) {
Packit 427e91
		case 5: toggle_set(hw_master_clock_xtal_22050, TRUE); break;
Packit 427e91
		case 7: toggle_set(hw_master_clock_xtal_32000, TRUE); break;
Packit 427e91
		case 8: toggle_set(hw_master_clock_xtal_44100, TRUE); break;
Packit 427e91
		case 9: toggle_set(hw_master_clock_xtal_48000, TRUE); break;
Packit 427e91
		case 11: toggle_set(hw_master_clock_xtal_88200, TRUE); break;
Packit 427e91
		case 12: toggle_set(hw_master_clock_xtal_96000, TRUE); break;
Packit 427e91
		default:
Packit 427e91
			    g_print("Error in rate: %d\n", rate);
Packit 427e91
			    break;
Packit 427e91
		}
Packit 427e91
	}
Packit 427e91
	internal_clock_status_timeout_callback(NULL);
Packit 427e91
	master_clock_status_timeout_callback(NULL);
Packit 427e91
}
Packit 427e91
Packit 427e91
static void master_clock_word_select(int on)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
Packit 427e91
	if (card_eeprom.subvendor != ICE1712_SUBDEVICE_DELTA1010 &&
Packit 427e91
	    card_eeprom.subvendor != ICE1712_SUBDEVICE_DELTA1010LT)
Packit 427e91
		return;
Packit 427e91
	snd_ctl_elem_value_set_boolean(word_clock_sync, 0, on ? 1 : 0);
Packit 427e91
	if ((err = snd_ctl_elem_write(ctl, word_clock_sync)) < 0)
Packit 427e91
		g_print("Unable to write word clock sync selection: %s\n", snd_strerror(err));
Packit 427e91
}
Packit 427e91
Packit 427e91
static void internal_clock_set(int xrate)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
Packit 427e91
	master_clock_word_select(0);
Packit 427e91
	snd_ctl_elem_value_set_enumerated(internal_clock, 0, xrate);
Packit 427e91
	if ((err = snd_ctl_elem_write(ctl, internal_clock)) < 0)
Packit 427e91
		g_print("Unable to write internal clock rate: %s\n", snd_strerror(err));
Packit 427e91
}
Packit 427e91
Packit 427e91
void internal_clock_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *what = (char *) data;
Packit 427e91
Packit 427e91
	if (!is_active(togglebutton))
Packit 427e91
		return;
Packit 427e91
	if (!strcmp(what, "22050")) {
Packit 427e91
		internal_clock_set(5);
Packit 427e91
	} else if (!strcmp(what, "32000")) {
Packit 427e91
		internal_clock_set(7);
Packit 427e91
	} else if (!strcmp(what, "44100")) {
Packit 427e91
		internal_clock_set(8);
Packit 427e91
	} else if (!strcmp(what, "48000")) {
Packit 427e91
		internal_clock_set(9);
Packit 427e91
	} else if (!strcmp(what, "88200")) {
Packit 427e91
		internal_clock_set(11);
Packit 427e91
	} else if (!strcmp(what, "96000")) {
Packit 427e91
		internal_clock_set(12);
Packit 427e91
	} else if (!strcmp(what, "SPDIF")) {
Packit 427e91
		internal_clock_set(13);
Packit 427e91
	} else if (!strcmp(what, "WordClock")) {
Packit 427e91
		internal_clock_set(13); // 13 should be considered '!internal'
Packit 427e91
		master_clock_word_select(1);
Packit 427e91
	} else {
Packit 427e91
		g_print("internal_clock_toggled: %s ???\n", what);
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
static int is_rate_locked(void)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
	
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, rate_locking)) < 0)
Packit 427e91
		g_print("Unable to read rate locking state: %s\n", snd_strerror(err));
Packit 427e91
	return snd_ctl_elem_value_get_boolean(rate_locking, 0) ? 1 : 0;
Packit 427e91
}
Packit 427e91
Packit 427e91
static int is_rate_reset(void)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
	
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, rate_reset)) < 0)
Packit 427e91
		g_print("Unable to read rate reset state: %s\n", snd_strerror(err));
Packit 427e91
	return snd_ctl_elem_value_get_boolean(rate_reset, 0) ? 1 : 0;
Packit 427e91
}
Packit 427e91
Packit 427e91
static inline int is_update_needed(void)
Packit 427e91
{
Packit 427e91
	return (is_rate_locked() || !is_rate_reset());
Packit 427e91
}
Packit 427e91
Packit 427e91
gint master_clock_status_timeout_callback(gpointer data)
Packit 427e91
{
Packit 427e91
	snd_ctl_elem_value_t *sw;
Packit 427e91
	int err;
Packit 427e91
	
Packit 427e91
	if (card_eeprom.subvendor != ICE1712_SUBDEVICE_DELTA1010 && card_eeprom.subvendor != ICE1712_SUBDEVICE_DELTA1010LT)
Packit 427e91
		return FALSE;
Packit 427e91
	snd_ctl_elem_value_alloca(&sw);
Packit 427e91
	snd_ctl_elem_value_set_interface(sw, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
	snd_ctl_elem_value_set_name(sw, "Word Clock Status");
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, sw)) < 0)
Packit 427e91
		g_print("Unable to determine word clock status: %s\n", snd_strerror(err));
Packit 427e91
	gtk_label_set_text(GTK_LABEL(hw_master_clock_status_label),
Packit 427e91
			   snd_ctl_elem_value_get_boolean(sw, 0) ? "No signal" : "Locked");
Packit 427e91
	return TRUE;
Packit 427e91
}
Packit 427e91
Packit 427e91
gint internal_clock_status_timeout_callback(gpointer data)
Packit 427e91
{
Packit 427e91
	int err, rate, need_update;
Packit 427e91
	char *label;
Packit 427e91
	
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, internal_clock)) < 0)
Packit 427e91
		g_print("Unable to read Internal Clock state: %s\n", snd_strerror(err));
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, internal_clock_default)) < 0)
Packit 427e91
		g_print("Unable to read Internal Clock Default state: %s\n", snd_strerror(err));
Packit 427e91
	if (card_eeprom.subvendor == ICE1712_SUBDEVICE_DELTA1010 ||
Packit 427e91
	    card_eeprom.subvendor == ICE1712_SUBDEVICE_DELTA1010LT) {
Packit 427e91
		if ((err = snd_ctl_elem_read(ctl, word_clock_sync)) < 0)
Packit 427e91
			g_print("Unable to read word clock sync selection: %s\n", snd_strerror(err));
Packit 427e91
	}
Packit 427e91
	need_update = is_update_needed() ? 1 : 0;
Packit 427e91
	if (snd_ctl_elem_value_get_enumerated(internal_clock, 0) == 13) {
Packit 427e91
		if (snd_ctl_elem_value_get_boolean(word_clock_sync, 0)) {
Packit 427e91
			label = "Word Clock";
Packit 427e91
		} else {
Packit 427e91
			label = "S/PDIF";
Packit 427e91
		}
Packit 427e91
	} else {
Packit 427e91
//		toggle_set(hw_master_clock_xtal_radio, TRUE);
Packit 427e91
		rate = snd_ctl_elem_value_get_enumerated(internal_clock, 0);
Packit 427e91
//		g_print("Rate: %d need_update: %d\n", rate, need_update); // for debug
Packit 427e91
		switch (rate) {
Packit 427e91
		case 0: label = "8000"; break;
Packit 427e91
		case 1: label = "9600"; break;
Packit 427e91
		case 2: label = "11025"; break;
Packit 427e91
		case 3: label = "12000"; break;
Packit 427e91
		case 4: label = "16000"; break;
Packit 427e91
		case 5: label = "22050";
Packit 427e91
			if (need_update)
Packit 427e91
			toggle_set(hw_master_clock_xtal_22050, TRUE); break;
Packit 427e91
		case 6: label = "24000"; break;
Packit 427e91
		case 7: label = "32000";
Packit 427e91
			if (need_update)
Packit 427e91
			toggle_set(hw_master_clock_xtal_32000, TRUE); break;
Packit 427e91
		case 8: label = "44100";
Packit 427e91
			if (need_update)
Packit 427e91
			toggle_set(hw_master_clock_xtal_44100, TRUE); break;
Packit 427e91
		case 9: label = "48000";
Packit 427e91
			if (need_update)
Packit 427e91
			toggle_set(hw_master_clock_xtal_48000, TRUE); break;
Packit 427e91
		case 10: label = "64000"; break;
Packit 427e91
		case 11: label = "88200";
Packit 427e91
			if (need_update)
Packit 427e91
			toggle_set(hw_master_clock_xtal_88200, TRUE); break;
Packit 427e91
		case 12: label = "96000";
Packit 427e91
			if (need_update)
Packit 427e91
			toggle_set(hw_master_clock_xtal_96000, TRUE); break;
Packit 427e91
		default:
Packit 427e91
			    label = "ERROR";
Packit 427e91
			    g_print("Error in rate: %d\n", rate);
Packit 427e91
			    break;
Packit 427e91
		}
Packit 427e91
		if (!need_update) {	//default clock need update
Packit 427e91
			rate = snd_ctl_elem_value_get_enumerated(internal_clock_default, 0);
Packit 427e91
			switch (rate) {
Packit 427e91
			case 5: toggle_set(hw_master_clock_xtal_22050, TRUE); break;
Packit 427e91
			case 7: toggle_set(hw_master_clock_xtal_32000, TRUE); break;
Packit 427e91
			case 8: toggle_set(hw_master_clock_xtal_44100, TRUE); break;
Packit 427e91
			case 9: toggle_set(hw_master_clock_xtal_48000, TRUE); break;
Packit 427e91
			case 11: toggle_set(hw_master_clock_xtal_88200, TRUE); break;
Packit 427e91
			case 12: toggle_set(hw_master_clock_xtal_96000, TRUE); break;
Packit 427e91
			default:
Packit 427e91
				g_print("Error in rate: %d\n", rate);
Packit 427e91
				break;
Packit 427e91
			}
Packit 427e91
		}
Packit 427e91
	}
Packit 427e91
	gtk_label_set_text(GTK_LABEL(hw_master_clock_actual_rate_label), label);
Packit 427e91
	return TRUE;
Packit 427e91
}
Packit 427e91
Packit 427e91
gint rate_locking_status_timeout_callback(gpointer data)
Packit 427e91
{
Packit 427e91
    int state;
Packit 427e91
Packit 427e91
    if (is_active(hw_rate_locking_check) != (state = is_rate_locked())) {
Packit 427e91
	toggle_set(hw_rate_locking_check, state ? TRUE : FALSE);
Packit 427e91
    }
Packit 427e91
    return TRUE;
Packit 427e91
}
Packit 427e91
Packit 427e91
gint rate_reset_status_timeout_callback(gpointer data)
Packit 427e91
{
Packit 427e91
    int state;
Packit 427e91
Packit 427e91
    if (is_active(hw_rate_reset_check) != (state = is_rate_reset())) {
Packit 427e91
	toggle_set(hw_rate_reset_check, state ? TRUE : FALSE);
Packit 427e91
    }
Packit 427e91
    return TRUE;
Packit 427e91
}
Packit 427e91
Packit 427e91
void rate_locking_update(void)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
	
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, rate_locking)) < 0)
Packit 427e91
		g_print("Unable to read rate locking state: %s\n", snd_strerror(err));
Packit 427e91
	if (snd_ctl_elem_value_get_boolean(rate_locking, 0))
Packit 427e91
			toggle_set(hw_rate_locking_check, TRUE);
Packit 427e91
}
Packit 427e91
Packit 427e91
void rate_reset_update(void)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
	
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, rate_reset)) < 0)
Packit 427e91
		g_print("Unable to read rate reset state: %s\n", snd_strerror(err));
Packit 427e91
	if (snd_ctl_elem_value_get_boolean(rate_reset, 0))
Packit 427e91
			toggle_set(hw_rate_reset_check, TRUE);
Packit 427e91
}
Packit 427e91
Packit 427e91
static void rate_locking_set(int on)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_boolean(rate_locking, 0, on ? 1 : 0);
Packit 427e91
	if ((err = snd_ctl_elem_write(ctl, rate_locking)) < 0)
Packit 427e91
		g_print("Unable to write rate locking state: %s\n", snd_strerror(err));
Packit 427e91
}
Packit 427e91
Packit 427e91
static void rate_reset_set(int on)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_boolean(rate_reset, 0, on ? 1 : 0);
Packit 427e91
	if ((err = snd_ctl_elem_write(ctl, rate_reset)) < 0)
Packit 427e91
		g_print("Unable to write rate reset state: %s\n", snd_strerror(err));
Packit 427e91
}
Packit 427e91
Packit 427e91
void rate_locking_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *what = (char *) data;
Packit 427e91
Packit 427e91
	if (!is_active(togglebutton)) {
Packit 427e91
		rate_locking_set(0);
Packit 427e91
		return;
Packit 427e91
	}
Packit 427e91
	if (!strcmp(what, "locked")) {
Packit 427e91
		rate_locking_set(1);
Packit 427e91
		internal_clock_status_timeout_callback(NULL);
Packit 427e91
	} else {
Packit 427e91
		g_print("rate_locking_toggled: %s ???\n", what);
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void rate_reset_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *what = (char *) data;
Packit 427e91
Packit 427e91
	if (!is_active(togglebutton)) {
Packit 427e91
		rate_reset_set(0);
Packit 427e91
		internal_clock_status_timeout_callback(NULL);
Packit 427e91
		return;
Packit 427e91
	}
Packit 427e91
	if (!strcmp(what, "reset")) {
Packit 427e91
		rate_reset_set(1);
Packit 427e91
	} else {
Packit 427e91
		g_print("rate_reset_toggled: %s ???\n", what);
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void volume_change_rate_update(void)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
	
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, volume_rate)) < 0)
Packit 427e91
		g_print("Unable to read volume change rate: %s\n", snd_strerror(err));
Packit 427e91
	gtk_adjustment_set_value(GTK_ADJUSTMENT(hw_volume_change_adj),
Packit 427e91
				 snd_ctl_elem_value_get_integer(volume_rate, 0));
Packit 427e91
}
Packit 427e91
Packit 427e91
void volume_change_rate_adj(GtkAdjustment *adj, gpointer data)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
	
Packit 427e91
	snd_ctl_elem_value_set_integer(volume_rate, 0, adj->value);
Packit 427e91
	if ((err = snd_ctl_elem_write(ctl, volume_rate)) < 0)
Packit 427e91
		g_print("Unable to write volume change rate: %s\n", snd_strerror(err));
Packit 427e91
}
Packit 427e91
Packit 427e91
void spdif_output_update(void)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
	snd_aes_iec958_t iec958;
Packit 427e91
	
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, spdif_output)) < 0) {
Packit 427e91
		if (err == -ENOENT)
Packit 427e91
			return;
Packit 427e91
		g_print("Unable to read Delta S/PDIF output state: %s\n", snd_strerror(err));
Packit 427e91
	}
Packit 427e91
	snd_ctl_elem_value_get_iec958(spdif_output, &iec958);
Packit 427e91
	if (!(iec958.status[0] & IEC958_AES0_PROFESSIONAL)) {		/* consumer */
Packit 427e91
		toggle_set(hw_spdif_consumer_radio, TRUE);
Packit 427e91
		if (iec958.status[0] & IEC958_AES0_CON_NOT_COPYRIGHT) {
Packit 427e91
			toggle_set(hw_consumer_copyright_off_radio, TRUE);
Packit 427e91
		} else {
Packit 427e91
			toggle_set(hw_consumer_copyright_on_radio, TRUE);
Packit 427e91
		}
Packit 427e91
		if ((iec958.status[0] & IEC958_AES0_CON_EMPHASIS) != IEC958_AES0_CON_EMPHASIS_5015) {
Packit 427e91
			toggle_set(hw_consumer_emphasis_none_radio, TRUE);
Packit 427e91
		} else {
Packit 427e91
			toggle_set(hw_consumer_emphasis_5015_radio, TRUE);
Packit 427e91
		}
Packit 427e91
		switch (iec958.status[1] & IEC958_AES1_CON_CATEGORY) {
Packit 427e91
		case IEC958_AES1_CON_MAGNETIC_ID: toggle_set(hw_consumer_category_dat_radio, TRUE); break;
Packit 427e91
		case IEC958_AES1_CON_DIGDIGCONV_ID: toggle_set(hw_consumer_category_pcm_radio, TRUE); break;
Packit 427e91
		case IEC958_AES1_CON_GENERAL: toggle_set(hw_consumer_category_general_radio, TRUE); break;
Packit 427e91
		case IEC958_AES1_CON_LASEROPT_ID:
Packit 427e91
		default: toggle_set(hw_consumer_category_cd_radio, TRUE); break;
Packit 427e91
		}
Packit 427e91
		if (iec958.status[1] & IEC958_AES1_CON_ORIGINAL) {
Packit 427e91
			toggle_set(hw_consumer_copy_original_radio, TRUE);
Packit 427e91
		} else {
Packit 427e91
			toggle_set(hw_consumer_copy_1st_radio, TRUE);
Packit 427e91
		}
Packit 427e91
	} else {
Packit 427e91
		toggle_set(hw_spdif_professional_radio, TRUE);
Packit 427e91
		if (!(iec958.status[0] & IEC958_AES0_NONAUDIO)) {
Packit 427e91
			toggle_set(hw_spdif_profi_audio_radio, TRUE);
Packit 427e91
		} else {
Packit 427e91
			toggle_set(hw_spdif_profi_nonaudio_radio, TRUE);
Packit 427e91
		}
Packit 427e91
		switch (iec958.status[0] & IEC958_AES0_PRO_EMPHASIS) {
Packit 427e91
		case IEC958_AES0_PRO_EMPHASIS_CCITT: toggle_set(hw_profi_emphasis_ccitt_radio, TRUE); break;
Packit 427e91
		case IEC958_AES0_PRO_EMPHASIS_NONE: toggle_set(hw_profi_emphasis_none_radio, TRUE); break;
Packit 427e91
		case IEC958_AES0_PRO_EMPHASIS_5015: toggle_set(hw_profi_emphasis_5015_radio, TRUE); break;
Packit 427e91
		case IEC958_AES0_PRO_EMPHASIS_NOTID:
Packit 427e91
		default: toggle_set(hw_profi_emphasis_notid_radio, TRUE); break;
Packit 427e91
		}
Packit 427e91
		if ((iec958.status[1] & IEC958_AES1_PRO_MODE) == IEC958_AES1_PRO_MODE_STEREOPHONIC) {
Packit 427e91
			toggle_set(hw_profi_stream_stereo_radio, TRUE);
Packit 427e91
		} else {
Packit 427e91
			toggle_set(hw_profi_stream_notid_radio, TRUE);
Packit 427e91
		}
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
static void spdif_output_write(void)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
Packit 427e91
	if ((err = snd_ctl_elem_write(ctl, spdif_output)) < 0)
Packit 427e91
		g_print("Unable to write Delta S/PDIF Output Defaults: %s\n", snd_strerror(err));
Packit 427e91
}
Packit 427e91
Packit 427e91
void profi_data_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *str = (char *)data;
Packit 427e91
	snd_aes_iec958_t iec958;
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_get_iec958(spdif_output, &iec958);
Packit 427e91
	if (!is_active(togglebutton))
Packit 427e91
		return;
Packit 427e91
	if (!(iec958.status[0] & IEC958_AES0_PROFESSIONAL))
Packit 427e91
		return;
Packit 427e91
	if (!strcmp(str, "Audio")) {
Packit 427e91
		iec958.status[0] &= ~IEC958_AES0_NONAUDIO;
Packit 427e91
	} else if (!strcmp(str, "Non-audio")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES0_NONAUDIO;
Packit 427e91
	}
Packit 427e91
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
Packit 427e91
	spdif_output_write();
Packit 427e91
}
Packit 427e91
Packit 427e91
void profi_stream_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *str = (char *)data;
Packit 427e91
	snd_aes_iec958_t iec958;
Packit 427e91
Packit 427e91
	if (!is_active(togglebutton))
Packit 427e91
		return;
Packit 427e91
	snd_ctl_elem_value_get_iec958(spdif_output, &iec958);
Packit 427e91
	if (!(iec958.status[0] & IEC958_AES0_PROFESSIONAL))
Packit 427e91
		return;
Packit 427e91
	iec958.status[1] &= ~IEC958_AES1_PRO_MODE;
Packit 427e91
	if (!strcmp(str, "NOTID")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES1_PRO_MODE_STEREOPHONIC;
Packit 427e91
	} else if (!strcmp(str, "Stereo")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES1_PRO_MODE_NOTID;
Packit 427e91
	}
Packit 427e91
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
Packit 427e91
	spdif_output_write();
Packit 427e91
}
Packit 427e91
Packit 427e91
void profi_emphasis_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *str = (char *)data;
Packit 427e91
	snd_aes_iec958_t iec958;
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_get_iec958(spdif_output, &iec958);
Packit 427e91
	if (!is_active(togglebutton))
Packit 427e91
		return;
Packit 427e91
	if (!(iec958.status[0] & IEC958_AES0_PROFESSIONAL))
Packit 427e91
		return;
Packit 427e91
	iec958.status[0] &= ~IEC958_AES0_PRO_EMPHASIS;
Packit 427e91
	if (!strcmp(str, "CCITT")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES0_PRO_EMPHASIS_CCITT;
Packit 427e91
	} else if (!strcmp(str, "No")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES0_PRO_EMPHASIS_NONE;
Packit 427e91
	} else if (!strcmp(str, "5015")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES0_PRO_EMPHASIS_5015;
Packit 427e91
	} else if (!strcmp(str, "NOTID")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES0_PRO_EMPHASIS_NOTID;
Packit 427e91
	}
Packit 427e91
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
Packit 427e91
	spdif_output_write();
Packit 427e91
}
Packit 427e91
Packit 427e91
void consumer_copyright_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *str = (char *)data;
Packit 427e91
	snd_aes_iec958_t iec958;
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_get_iec958(spdif_output, &iec958);	
Packit 427e91
	if (!is_active(togglebutton))
Packit 427e91
		return;
Packit 427e91
	if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
Packit 427e91
		return;
Packit 427e91
	if (!strcmp(str, "Copyright")) {
Packit 427e91
		iec958.status[0] &= ~IEC958_AES0_CON_NOT_COPYRIGHT;
Packit 427e91
	} else if (!strcmp(str, "Permitted")) {
Packit 427e91
		iec958.status[1] |= IEC958_AES0_CON_NOT_COPYRIGHT;
Packit 427e91
	}
Packit 427e91
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
Packit 427e91
	spdif_output_write();
Packit 427e91
}
Packit 427e91
Packit 427e91
void consumer_copy_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *str = (char *)data;
Packit 427e91
	snd_aes_iec958_t iec958;
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_get_iec958(spdif_output, &iec958);	
Packit 427e91
	if (!is_active(togglebutton))
Packit 427e91
		return;
Packit 427e91
	if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
Packit 427e91
		return;
Packit 427e91
	if (!strcmp(str, "1st")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES1_CON_ORIGINAL;
Packit 427e91
	} else if (!strcmp(str, "Original")) {
Packit 427e91
		iec958.status[1] &= ~IEC958_AES1_CON_ORIGINAL;
Packit 427e91
	}
Packit 427e91
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
Packit 427e91
	spdif_output_write();
Packit 427e91
}
Packit 427e91
Packit 427e91
void consumer_emphasis_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *str = (char *)data;
Packit 427e91
	snd_aes_iec958_t iec958;
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_get_iec958(spdif_output, &iec958);	
Packit 427e91
	if (!is_active(togglebutton))
Packit 427e91
		return;
Packit 427e91
	if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
Packit 427e91
		return;
Packit 427e91
	iec958.status[0] &= ~IEC958_AES0_CON_EMPHASIS;
Packit 427e91
	if (!strcmp(str, "No")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES0_CON_EMPHASIS_NONE;
Packit 427e91
	} else if (!strcmp(str, "5015")) {
Packit 427e91
		iec958.status[1] |= ~IEC958_AES0_CON_EMPHASIS_5015;
Packit 427e91
	}
Packit 427e91
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
Packit 427e91
	spdif_output_write();
Packit 427e91
}
Packit 427e91
Packit 427e91
void consumer_category_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *str = (char *)data;
Packit 427e91
	snd_aes_iec958_t iec958;
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_get_iec958(spdif_output, &iec958);	
Packit 427e91
	if (!is_active(togglebutton))
Packit 427e91
		return;
Packit 427e91
	if (iec958.status[0] & IEC958_AES0_PROFESSIONAL)
Packit 427e91
		return;
Packit 427e91
	iec958.status[0] &= ~IEC958_AES1_CON_CATEGORY;
Packit 427e91
	if (!strcmp(str, "DAT")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES1_CON_DAT;
Packit 427e91
	} else if (!strcmp(str, "PCM")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES1_CON_PCM_CODER;
Packit 427e91
	} else if (!strcmp(str, "CD")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES1_CON_IEC908_CD;
Packit 427e91
	} else if (!strcmp(str, "General")) {
Packit 427e91
		iec958.status[0] |= IEC958_AES1_CON_GENERAL;
Packit 427e91
	}
Packit 427e91
	snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
Packit 427e91
	spdif_output_write();
Packit 427e91
}
Packit 427e91
Packit 427e91
void spdif_output_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *str = (char *)data;
Packit 427e91
	snd_aes_iec958_t iec958;
Packit 427e91
	int page;
Packit 427e91
Packit 427e91
	if (is_active(togglebutton)) {
Packit 427e91
		snd_ctl_elem_value_get_iec958(spdif_output, &iec958);
Packit 427e91
		if (!strcmp(str, "Professional")) {
Packit 427e91
			if (!(iec958.status[0] & IEC958_AES0_PROFESSIONAL)) {
Packit 427e91
				/* default setup: audio, no emphasis */
Packit 427e91
				memset(&iec958, 0, sizeof(iec958));
Packit 427e91
				iec958.status[0] = IEC958_AES0_PROFESSIONAL | IEC958_AES0_PRO_EMPHASIS_NONE | IEC958_AES0_PRO_FS_48000;
Packit 427e91
				iec958.status[1] = IEC958_AES1_PRO_MODE_STEREOPHONIC;
Packit 427e91
				snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
Packit 427e91
			}
Packit 427e91
			page = 0;
Packit 427e91
		} else {
Packit 427e91
			if (iec958.status[0] & IEC958_AES0_PROFESSIONAL) {
Packit 427e91
				/* default setup: no emphasis, PCM encoder */
Packit 427e91
				memset(&iec958, 0, sizeof(iec958));
Packit 427e91
				iec958.status[0] = IEC958_AES0_CON_EMPHASIS_NONE;
Packit 427e91
				iec958.status[1] = IEC958_AES1_CON_PCM_CODER | IEC958_AES1_CON_ORIGINAL;
Packit 427e91
				iec958.status[3] = IEC958_AES3_CON_FS_48000;
Packit 427e91
				snd_ctl_elem_value_set_iec958(spdif_output, &iec958);
Packit 427e91
			}
Packit 427e91
			page = 1;
Packit 427e91
		}
Packit 427e91
		spdif_output_write();
Packit 427e91
		gtk_notebook_set_page(GTK_NOTEBOOK(hw_spdif_output_notebook), page);
Packit 427e91
		spdif_output_update();
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void spdif_input_update(void)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
	int digoptical = FALSE;
Packit 427e91
	int diginternal = FALSE;
Packit 427e91
Packit 427e91
	if ((card_eeprom.subvendor != ICE1712_SUBDEVICE_DELTADIO2496) &&
Packit 427e91
	    ! card_is_dmx6fire)
Packit 427e91
		return;
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, spdif_input)) < 0)
Packit 427e91
		g_print("Unable to read S/PDIF input switch: %s\n", snd_strerror(err));
Packit 427e91
	if (snd_ctl_elem_value_get_boolean(spdif_input, 0))
Packit 427e91
		digoptical = TRUE;
Packit 427e91
	if (card_is_dmx6fire) {
Packit 427e91
        	if ((err = snd_ctl_elem_read(ctl, spdif_on_off)) < 0)
Packit 427e91
			g_print("Unable to read S/PDIF on/off switch: %s\n", snd_strerror(err));
Packit 427e91
	      	if (!(snd_ctl_elem_value_get_boolean(spdif_on_off, 0)))
Packit 427e91
			diginternal = TRUE;
Packit 427e91
	}
Packit 427e91
	if (digoptical) {
Packit 427e91
		toggle_set(hw_spdif_input_optical_radio, TRUE);
Packit 427e91
	} else {
Packit 427e91
		toggle_set(hw_spdif_input_coaxial_radio, TRUE);
Packit 427e91
	}
Packit 427e91
	if (diginternal)
Packit 427e91
		toggle_set(hw_spdif_switch_off_radio, TRUE);
Packit 427e91
 }
Packit 427e91
Packit 427e91
void spdif_input_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
	char *str = (char *)data;
Packit 427e91
	
Packit 427e91
	if (!is_active(togglebutton))
Packit 427e91
		return;
Packit 427e91
	if (!strcmp(str, "Off"))
Packit 427e91
               	snd_ctl_elem_value_set_boolean(spdif_on_off, 0, 0);
Packit 427e91
	else {
Packit 427e91
		snd_ctl_elem_value_set_boolean(spdif_on_off, 0, 1);
Packit 427e91
		if (!strcmp(str, "Optical"))
Packit 427e91
			snd_ctl_elem_value_set_boolean(spdif_input, 0, 1);
Packit 427e91
		else
Packit 427e91
			if (!strcmp(str, "Coaxial"))
Packit 427e91
				snd_ctl_elem_value_set_boolean(spdif_input, 0, 0);
Packit 427e91
	}
Packit 427e91
	if ((err = snd_ctl_elem_write(ctl, spdif_on_off)) < 0)
Packit 427e91
               g_print("Unable to write S/PDIF on/off switch: %s\n", snd_strerror(err));
Packit 427e91
	if ((err = snd_ctl_elem_write(ctl, spdif_input)) < 0)
Packit 427e91
		g_print("Unable to write S/PDIF input switch: %s\n", snd_strerror(err));
Packit 427e91
}
Packit 427e91
Packit 427e91
void analog_input_select_update(void)
Packit 427e91
{
Packit 427e91
	int err, input_interface;
Packit 427e91
Packit 427e91
	if (! card_is_dmx6fire)
Packit 427e91
		return;
Packit 427e91
	if ((err = snd_ctl_elem_read(ctl, analog_input_select)) < 0)
Packit 427e91
		g_print("Unable to read analog input switch: %s\n", snd_strerror(err));
Packit 427e91
	input_interface = snd_ctl_elem_value_get_enumerated(analog_input_select, 0);
Packit 427e91
	switch (input_interface) {
Packit 427e91
	case 0: toggle_set(input_interface_internal, TRUE); break;
Packit 427e91
	case 1: toggle_set(input_interface_front_input, TRUE); break;
Packit 427e91
	case 2: toggle_set(input_interface_rear_input, TRUE); break;
Packit 427e91
	case 3: toggle_set(input_interface_wavetable, TRUE); break;
Packit 427e91
	default:
Packit 427e91
		g_print("Error in analogue input: %d\n", input_interface);
Packit 427e91
		break;
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void analog_input_select_set(int value)
Packit 427e91
{
Packit 427e91
	int err;
Packit 427e91
Packit 427e91
        snd_ctl_elem_value_set_enumerated(analog_input_select, 0, value);
Packit 427e91
        if ((err = snd_ctl_elem_write(ctl, analog_input_select)) < 0)
Packit 427e91
                g_print("Unable to write analog input selection: %s\n", snd_strerror(err));
Packit 427e91
}
Packit 427e91
Packit 427e91
void analog_input_select_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
	char *what = (char *) data;
Packit 427e91
       int err;
Packit 427e91
Packit 427e91
        if (!is_active(togglebutton))
Packit 427e91
                return;
Packit 427e91
        if (!strcmp(what, "Internal")) {
Packit 427e91
                analog_input_select_set(0);
Packit 427e91
               snd_ctl_elem_value_set_boolean(breakbox_led, 0, 0);
Packit 427e91
        } else if (!strcmp(what, "Front Input")) {
Packit 427e91
                analog_input_select_set(1);
Packit 427e91
               snd_ctl_elem_value_set_boolean(breakbox_led, 0, 1);
Packit 427e91
        } else if (!strcmp(what, "Rear Input")) {
Packit 427e91
                analog_input_select_set(2);
Packit 427e91
               snd_ctl_elem_value_set_boolean(breakbox_led, 0, 0);
Packit 427e91
        } else if (!strcmp(what, "Wave Table")) {
Packit 427e91
                analog_input_select_set(3);
Packit 427e91
               snd_ctl_elem_value_set_boolean(breakbox_led, 0, 0);
Packit 427e91
        } else {
Packit 427e91
                g_print("analog_input_select_toggled: %s ???\n", what);
Packit 427e91
        }
Packit 427e91
       if ((err = snd_ctl_elem_write(ctl, breakbox_led)) < 0)
Packit 427e91
               g_print("Unable to write breakbox LED switch: %s\n", snd_strerror(err));
Packit 427e91
}
Packit 427e91
Packit 427e91
void phono_input_update(void)
Packit 427e91
{
Packit 427e91
        int err;
Packit 427e91
Packit 427e91
        if (! card_is_dmx6fire)
Packit 427e91
                return;
Packit 427e91
        if ((err = snd_ctl_elem_read(ctl, phono_input)) < 0)
Packit 427e91
                g_print("Unable to read phono input switch: %s\n", snd_strerror(err));
Packit 427e91
        if (snd_ctl_elem_value_get_boolean(phono_input, 0)) {
Packit 427e91
                toggle_set(hw_phono_input_on_radio, TRUE);
Packit 427e91
        } else {
Packit 427e91
                toggle_set(hw_phono_input_off_radio, TRUE);
Packit 427e91
        }
Packit 427e91
}
Packit 427e91
Packit 427e91
void phono_input_toggled(GtkWidget *togglebutton, gpointer data)
Packit 427e91
{
Packit 427e91
        int err;
Packit 427e91
        char *str = (char *) data;
Packit 427e91
Packit 427e91
        if (!is_active(togglebutton))
Packit 427e91
                return;
Packit 427e91
        if (!strcmp(str, "Phono"))
Packit 427e91
                snd_ctl_elem_value_set_boolean(phono_input, 0, 1);
Packit 427e91
        else
Packit 427e91
                snd_ctl_elem_value_set_boolean(phono_input, 0, 0);
Packit 427e91
        if ((err = snd_ctl_elem_write(ctl, phono_input)) < 0)
Packit 427e91
                g_print("Unable to write phono input switch: %s\n", snd_strerror(err));
Packit 427e91
}
Packit 427e91
Packit 427e91
void hardware_init(void)
Packit 427e91
{
Packit 427e91
	if (snd_ctl_elem_value_malloc(&internal_clock) < 0 ||
Packit 427e91
	    snd_ctl_elem_value_malloc(&internal_clock_default) < 0 ||
Packit 427e91
	    snd_ctl_elem_value_malloc(&word_clock_sync) < 0 ||
Packit 427e91
	    snd_ctl_elem_value_malloc(&rate_locking) < 0 ||
Packit 427e91
	    snd_ctl_elem_value_malloc(&rate_reset) < 0 ||
Packit 427e91
	    snd_ctl_elem_value_malloc(&volume_rate) < 0 ||
Packit 427e91
	    snd_ctl_elem_value_malloc(&spdif_input) < 0 ||
Packit 427e91
	    snd_ctl_elem_value_malloc(&spdif_output) < 0 ||
Packit 427e91
	    snd_ctl_elem_value_malloc(&analog_input_select) < 0 ||
Packit 427e91
	    snd_ctl_elem_value_malloc(&breakbox_led) < 0 ||
Packit 427e91
	    snd_ctl_elem_value_malloc(&spdif_on_off) < 0 ||
Packit 427e91
	    snd_ctl_elem_value_malloc(&phono_input) < 0) {
Packit 427e91
		g_print("Cannot allocate memory\n");
Packit 427e91
		exit(1);
Packit 427e91
	}
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_interface(internal_clock, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
	snd_ctl_elem_value_set_name(internal_clock, "Multi Track Internal Clock");
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_interface(internal_clock_default, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
	snd_ctl_elem_value_set_name(internal_clock_default, "Multi Track Internal Clock Default");
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_interface(word_clock_sync, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
	snd_ctl_elem_value_set_name(word_clock_sync, "Word Clock Sync");
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_interface(rate_locking, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
	snd_ctl_elem_value_set_name(rate_locking, "Multi Track Rate Locking");
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_interface(rate_reset, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
	snd_ctl_elem_value_set_name(rate_reset, "Multi Track Rate Reset");
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_interface(volume_rate, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
	snd_ctl_elem_value_set_name(volume_rate, "Multi Track Volume Rate");
Packit 427e91
Packit 427e91
	if (card_is_dmx6fire) {
Packit 427e91
		snd_ctl_elem_value_set_interface(spdif_input, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
		snd_ctl_elem_value_set_name(spdif_input, "Optical Digital Input Switch");
Packit 427e91
	} else {
Packit 427e91
		snd_ctl_elem_value_set_interface(spdif_input, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
		snd_ctl_elem_value_set_name(spdif_input, "IEC958 Input Optical");
Packit 427e91
	}
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_interface(spdif_output, SND_CTL_ELEM_IFACE_PCM);
Packit 427e91
	snd_ctl_elem_value_set_name(spdif_output, "IEC958 Playback Default");
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_interface(analog_input_select, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
	snd_ctl_elem_value_set_name(analog_input_select, "Analog Input Select");
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_interface(breakbox_led, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
	snd_ctl_elem_value_set_name(breakbox_led, "Breakbox LED");
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_interface(spdif_on_off, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
	snd_ctl_elem_value_set_name(spdif_on_off, "Front Digital Input Switch");
Packit 427e91
Packit 427e91
	snd_ctl_elem_value_set_interface(phono_input, SND_CTL_ELEM_IFACE_MIXER);
Packit 427e91
	snd_ctl_elem_value_set_name(phono_input, "Phono Analog Input Switch");
Packit 427e91
Packit 427e91
}
Packit 427e91
Packit 427e91
void hardware_postinit(void)
Packit 427e91
{
Packit 427e91
	master_clock_update();
Packit 427e91
	rate_locking_update();
Packit 427e91
	rate_reset_update();
Packit 427e91
	volume_change_rate_update();
Packit 427e91
	spdif_input_update();
Packit 427e91
	spdif_output_update();
Packit 427e91
	analog_input_select_update();
Packit 427e91
	phono_input_update();
Packit 427e91
}