Blame rmedigicontrol/rmedigicontrol.c

Packit Service b98cfc
/*****************************************************************************
Packit Service b98cfc
   rmedigicontrol.c
Packit Service b98cfc
   Copyright (C) 2003 by Robert Vetter <postmaster@robertvetter.com>
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
Packit Service b98cfc
#include "rmedigicontrol.h"
Packit Service b98cfc
Packit Service b98cfc
snd_ctl_t *ctl;
Packit Service b98cfc
ctl_elem_info_val_t input_iv;
Packit Service b98cfc
ctl_elem_info_val_t clock_iv;
Packit Service b98cfc
ctl_elem_info_val_t monitor_iv;
Packit Service b98cfc
ctl_elem_info_val_t att_iv;
Packit Service b98cfc
Packit Service b98cfc
void destroy(GtkWidget *widget,gpointer data)
Packit Service b98cfc
{
Packit Service b98cfc
	snd_ctl_close(ctl);	
Packit Service b98cfc
    gtk_main_quit();
Packit Service b98cfc
}
Packit Service b98cfc
int main(int argc, char *argv[])
Packit Service b98cfc
{
Packit Service b98cfc
	int card;
Packit Service b98cfc
	char name[8],*err;
Packit Service b98cfc
	snd_ctl_card_info_t *hw_info;
Packit Service b98cfc
	card_type_t type;
Packit Service b98cfc
	
Packit Service b98cfc
	GtkWidget *window,*main_box,*input_box,*loopback_box,*clock_box,*monitor_box,*att_box,*level_box;
Packit Service b98cfc
	GtkWidget *col1_box,*col2_box,*err_lbl;
Packit Service b98cfc
	snd_ctl_card_info_alloca(&hw_info);
Packit Service b98cfc
Packit Service b98cfc
	card = -1;
Packit Service b98cfc
	type = NO_CARD;
Packit Service b98cfc
	err=NULL;
Packit Service b98cfc
	if(snd_card_next(&card)<0 || card<0)
Packit Service b98cfc
		err="no soundcards found...";
Packit Service b98cfc
	while(card>=0)
Packit Service b98cfc
	{
Packit Service b98cfc
		sprintf(name,"hw:%d",card);
Packit Service b98cfc
		if(snd_ctl_open(&ctl, name, 0)<0)
Packit Service b98cfc
		{
Packit Service b98cfc
			err="snd_ctl_open Error";
Packit Service b98cfc
			break;
Packit Service b98cfc
			exit(EXIT_FAILURE);
Packit Service b98cfc
		}
Packit Service b98cfc
		if(snd_ctl_card_info(ctl, hw_info)< 0)
Packit Service b98cfc
		{
Packit Service b98cfc
			err="snd_ctl_card_info Error";
Packit Service b98cfc
			break;
Packit Service b98cfc
			exit(EXIT_FAILURE);
Packit Service b98cfc
		}
Packit Service b98cfc
		if(strcmp(snd_ctl_card_info_get_driver(hw_info),"Digi32")==0)
Packit Service b98cfc
		{
Packit Service b98cfc
			type=DIGI32;
Packit Service b98cfc
			break;
Packit Service b98cfc
		}
Packit Service b98cfc
		if(strcmp(snd_ctl_card_info_get_driver(hw_info),"Digi96")==0)
Packit Service b98cfc
		{
Packit Service b98cfc
			if(strcmp(snd_ctl_card_info_get_name(hw_info),"RME Digi96")==0)
Packit Service b98cfc
				type=DIGI96;
Packit Service b98cfc
			else if(strcmp(snd_ctl_card_info_get_name(hw_info),"RME Digi96/8")==0)
Packit Service b98cfc
				type=DIGI96_8;
Packit Service b98cfc
			else
Packit Service b98cfc
				type=DIGI96_8_OTHER;
Packit Service b98cfc
			break;
Packit Service b98cfc
		}
Packit Service b98cfc
		snd_card_next(&card;;
Packit Service b98cfc
	}
Packit Service b98cfc
	if(card<0)
Packit Service b98cfc
		err="No RME Digi Soundcard found...";
Packit Service b98cfc
	gtk_init(&argc, &argv);	
Packit Service b98cfc
	window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
Packit Service b98cfc
	gtk_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(destroy),NULL);
Packit Service b98cfc
	if(err)
Packit Service b98cfc
	{
Packit Service b98cfc
		err_lbl=gtk_label_new(err);
Packit Service b98cfc
		gtk_container_add(GTK_CONTAINER(window),err_lbl);
Packit Service b98cfc
		gtk_widget_show_all(window);
Packit Service b98cfc
		gtk_main ();	
Packit Service b98cfc
		exit(EXIT_FAILURE);	
Packit Service b98cfc
	}
Packit Service b98cfc
Packit Service b98cfc
	gtk_window_set_title(GTK_WINDOW(window),snd_ctl_card_info_get_name(hw_info));
Packit Service b98cfc
	
Packit Service b98cfc
	main_box=gtk_hbox_new(FALSE,0);
Packit Service b98cfc
	col1_box=gtk_vbox_new(FALSE,0);	
Packit Service b98cfc
	col2_box=gtk_vbox_new(FALSE,0);	
Packit Service b98cfc
	
Packit Service b98cfc
	input_box=create_enum_elem_radio("Input Connector",&input_iv);
Packit Service b98cfc
	gtk_box_pack_start(GTK_BOX(col1_box),input_box,TRUE,FALSE,0);
Packit Service b98cfc
	
Packit Service b98cfc
	loopback_box=create_loopback_toggle();
Packit Service b98cfc
	gtk_box_pack_start(GTK_BOX(col1_box),loopback_box,TRUE,FALSE,0);
Packit Service b98cfc
Packit Service b98cfc
	clock_box=create_enum_elem_radio("Sample Clock Source",&clock_iv);
Packit Service b98cfc
	gtk_box_pack_start(GTK_BOX(col1_box),clock_box,TRUE,FALSE,0);
Packit Service b98cfc
Packit Service b98cfc
	gtk_box_pack_start(GTK_BOX(main_box),col1_box,TRUE,FALSE,8);
Packit Service b98cfc
Packit Service b98cfc
	if(type==DIGI96_8_OTHER)
Packit Service b98cfc
	{
Packit Service b98cfc
		monitor_box=create_enum_elem_radio("Monitor Tracks",&monitor_iv);
Packit Service b98cfc
		gtk_box_pack_start(GTK_BOX(col2_box),monitor_box,TRUE,FALSE,0);
Packit Service b98cfc
	
Packit Service b98cfc
		att_box=create_enum_elem_radio("Attenuation",&att_iv);
Packit Service b98cfc
		gtk_box_pack_start(GTK_BOX(col2_box),att_box,TRUE,FALSE,0);
Packit Service b98cfc
Packit Service b98cfc
		gtk_box_pack_start(GTK_BOX(main_box),col2_box,TRUE,TRUE,8);
Packit Service b98cfc
Packit Service b98cfc
		level_box=create_level_box();
Packit Service b98cfc
		gtk_box_pack_start(GTK_BOX(main_box),level_box,TRUE,TRUE,8);
Packit Service b98cfc
	}
Packit Service b98cfc
	gtk_container_add(GTK_CONTAINER(window),main_box);		
Packit Service b98cfc
	gtk_widget_show_all(window);
Packit Service b98cfc
	gtk_main ();
Packit Service b98cfc
	return EXIT_SUCCESS;
Packit Service b98cfc
}
Packit Service b98cfc
void elem_radio_toggled(GtkRadioButton *r,gpointer p)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	GSList *l;
Packit Service b98cfc
	ctl_elem_info_val_t *iv;
Packit Service b98cfc
	
Packit Service b98cfc
	iv=(ctl_elem_info_val_t *)p;
Packit Service b98cfc
	l=gtk_radio_button_group(r);
Packit Service b98cfc
	i=snd_ctl_elem_info_get_items(iv->info);
Packit Service b98cfc
	while(l)
Packit Service b98cfc
	{
Packit Service b98cfc
		i--;
Packit Service b98cfc
		if(l->data==r && i>=0)
Packit Service b98cfc
		{
Packit Service b98cfc
			snd_ctl_elem_value_set_enumerated(iv->val,0,i);
Packit Service b98cfc
			snd_ctl_elem_write(ctl, iv->val);
Packit Service b98cfc
		}
Packit Service b98cfc
		l=l->next;
Packit Service b98cfc
	}
Packit Service b98cfc
}
Packit Service b98cfc
GtkWidget *create_enum_elem_radio(char *elem_name,ctl_elem_info_val_t *iv)
Packit Service b98cfc
{
Packit Service b98cfc
	GtkWidget *r,*box,*active,*frame;
Packit Service b98cfc
	int i;
Packit Service b98cfc
	GSList *group;
Packit Service b98cfc
Packit Service b98cfc
	snd_ctl_elem_info_malloc(&iv->info);
Packit Service b98cfc
	snd_ctl_elem_value_malloc(&iv->val);
Packit Service b98cfc
	
Packit Service b98cfc
	group=NULL;
Packit Service b98cfc
	active=NULL;
Packit Service b98cfc
	box=gtk_vbox_new(TRUE,0);
Packit Service b98cfc
	
Packit Service b98cfc
	snd_ctl_elem_info_set_interface(iv->info, SND_CTL_ELEM_IFACE_MIXER);
Packit Service b98cfc
	snd_ctl_elem_info_set_name(iv->info,elem_name);
Packit Service b98cfc
	snd_ctl_elem_info_set_numid(iv->info,0);
Packit Service b98cfc
	snd_ctl_elem_info(ctl,iv->info);
Packit Service b98cfc
	
Packit Service b98cfc
	snd_ctl_elem_value_set_interface(iv->val, SND_CTL_ELEM_IFACE_MIXER);
Packit Service b98cfc
	snd_ctl_elem_value_set_name(iv->val,elem_name);
Packit Service b98cfc
	snd_ctl_elem_read(ctl,iv->val);
Packit Service b98cfc
	
Packit Service b98cfc
	for(i=0;i<snd_ctl_elem_info_get_items(iv->info);i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		snd_ctl_elem_info_set_item(iv->info, i);
Packit Service b98cfc
		snd_ctl_elem_info(ctl,iv->info);
Packit Service b98cfc
		r=gtk_radio_button_new_with_label(group,snd_ctl_elem_info_get_item_name(iv->info));
Packit Service b98cfc
		group=gtk_radio_button_group(GTK_RADIO_BUTTON(r));
Packit Service b98cfc
		gtk_signal_connect(GTK_OBJECT(r),"toggled",GTK_SIGNAL_FUNC(elem_radio_toggled),(gpointer)iv);
Packit Service b98cfc
		if(i==snd_ctl_elem_value_get_integer(iv->val,0))
Packit Service b98cfc
			active=r;
Packit Service b98cfc
		gtk_box_pack_start(GTK_BOX(box),r,TRUE,FALSE,0);
Packit Service b98cfc
	}
Packit Service b98cfc
	if(active)
Packit Service b98cfc
		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(active),TRUE);
Packit Service b98cfc
	frame=gtk_frame_new(elem_name);
Packit Service b98cfc
	gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_IN);
Packit Service b98cfc
	gtk_container_add(GTK_CONTAINER(frame),box);
Packit Service b98cfc
	return frame;
Packit Service b98cfc
}
Packit Service b98cfc