Blame envy24control/hardware.c

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