Filewatcher File Search
FTP Search
  
Directory 
  
Content Search 
   
pkg://xltmix-1.1.tar.gz:26246/xltmix-1.1/xltmix.c  downloads

/* $Header: /wwg/motif/xltmix/RCS/xltmix.c,v 1.1 1997/03/16 04:54:07 wwg Exp $
 * Warren W. Gay VE3WWG		Wed Mar  5 22:09:52 1997
 *
 * 	X LessTif Mix :
 * 
 * 	Copyright (C) 1997  Warren W. Gay VE3WWG
 * 
 * This  program is free software; you can redistribute it and/or modify it
 * under the  terms  of  the GNU General Public License as published by the
 * Free Software Foundation version 2 of the License.
 * 
 * This  program  is  distributed  in  the hope that it will be useful, but
 * WITHOUT   ANY   WARRANTY;   without   even  the   implied   warranty  of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 * Public License for more details (see enclosed file COPYING).
 * 
 * You  should have received a copy of the GNU General Public License along
 * with this  program; if not, write to the Free Software Foundation, Inc.,
 * 675 Mass Ave, Cambridge, MA 02139, USA.
 * 
 * Send correspondance to:
 * 
 * 	Warren W. Gay VE3WWG
 * 	5536 Montevideo Road #17
 *	Mississauga, Ontario L5N 2P4
 * 
 * Email:
 * 	wwg@ica.net			(current ISP of the month :-) )
 * 	bx249@freenet.toronto.on.ca	(backup)
 *
 * $Log: xltmix.c,v $
 * Revision 1.1  1997/03/16 04:54:07  wwg
 * Initial revision
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdarg.h>
#include <time.h>
#include <signal.h>
#include <string.h>
#include <getopt.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <linux/soundcard.h>
#include <assert.h>

#include <Xm/Xm.h>
#include <Xm/MainW.h>
#include <Xm/Form.h>
#include <Xm/PushB.h>
#include <Xm/Text.h>
#include <Xm/Label.h>
#include <Xm/ToggleB.h>
#include <Xm/ScrollBar.h>
#include <Xm/RowColumn.h>
#include <Xm/Frame.h>
#include <Xm/MessageB.h>

#include "xltmix.h"

static char *rcsid[] = { "@(#)xltmix.c $Revision: 1.1 $", _xltmix_h_ };

char vers[] = "$Revision: 1.1 $";			/* This gets edited at startup */
int frame_margin = 6;				/* Use 6 pixels for a margin */

/*
 * Damage Control:
 */
Boolean bFatal = 0;				/* True if fatal error hit */
Boolean bPortAccessFailed = False;		/* Set by MixInit() if ports cannot be accessed */
Boolean bPortInvalid = False;			/* Set by MixInit() if port is bad */
char fatalMsg[512];				/* Fatal message text is put here */

/*
 * FALLBACK RESOURCES :
 */
static String fallback_resources[] = {
	"XLTMix.geometry: +250+200",
	"XLTMix*background: grey75",
	"XLTMix.*fontList: *helvetica-bold-r-normal--14*",

	"XLTMix.main.menubar.spacing: 10",
	"XLTMix.main.menubar.filemenucascade.labelString: File",
	"XLTMix*filemenu.exit.labelString: Exit",
	"XLTMix.main.menubar.helpmenucascade.labelString: Help",
	"XLTMix*helpmenu.about.labelString: About",

	"XLTMix*AboutDlg.fontList: -adobe-helvetica-medium-r-normal-*-10-100-75-75-p-*-iso8859-1",

	"XLTMix*dev_lbl.labelString: Input Levels",
	"XLTMix*dev_lbl.fontList: *helvetica-bold-r-normal--12*",

	"XLTMix*dev_rc1*fontList: *helvetica-bold-r-normal--8*",
	"XLTMix*ctlvoc_lbl.labelString: Voice",
	"XLTMix*ctlmidi_lbl.labelString: MIDI",
	"XLTMix*ctlcd_lbl.labelString: CD",
	"XLTMix*ctlline_lbl.labelString: Line",
	"XLTMix*ctlmic_lbl.labelString: Mic",
	"XLTMix*ctlspk_lbl.labelString: Spk",

	"XLTMix*gain_lbl.labelString: Gain Levels",
	"XLTMix*gain_lbl.fontList: *helvetica-bold-r-normal--12*",

	"XLTMix*gain_rc1*fontList: *helvetica-bold-r-normal--8*",
	"XLTMix*igain_lbl.labelString: Rec. Gain",
	"XLTMix*ogain_lbl.labelString: Mixer Gain",

	"XLTMix*mctl_lbl.labelString: Master Levels",
	"XLTMix*mctl_lbl.fontList: *helvetica-bold-r-normal--12*",

	"XLTMix*mctl_rc1*fontList: *helvetica-bold-r-normal--8*",
	"XLTMix*vol_lbl.labelString: Volume",
	"XLTMix*treble_lbl.labelString: Treble",
	"XLTMix*bass_lbl.labelString: Bass",

	"XLTMix*inpLeft_lbl.labelString: Left Record Inputs:",
	"XLTMix*inpLeft_lbl.fontList: *helvetica-bold-r-normal--12*",
	"XLTMix*inpLeft_rc2*fontList: *helvetica-bold-r-normal--10*",
	"XLTMix*inpLeft0_tgl.labelString: MIDI Left",
	"XLTMix*inpLeft1_tgl.labelString: Line Left",
	"XLTMix*inpLeft2_tgl.labelString: CD Left",
	"XLTMix*inpLeft3_tgl.labelString: Microphone",
	"XLTMix*inpLeft4_tgl.labelString: MIDI Right",
	"XLTMix*inpLeft5_tgl.labelString: Line Right",
	"XLTMix*inpLeft6_tgl.labelString: CD Right",

	"XLTMix*inpRight_lbl.labelString: Right Record Inputs:",
	"XLTMix*inpRight_lbl.fontList: *helvetica-bold-r-normal--12*",
	"XLTMix*inpRight_rc2*fontList: *helvetica-bold-r-normal--10*",
	"XLTMix*inpRight0_tgl.labelString: MIDI Left",
	"XLTMix*inpRight1_tgl.labelString: Line Left",
	"XLTMix*inpRight2_tgl.labelString: CD Left",
	"XLTMix*inpRight3_tgl.labelString: Microphone",
	"XLTMix*inpRight4_tgl.labelString: MIDI Right",
	"XLTMix*inpRight5_tgl.labelString: Line Right",
	"XLTMix*inpRight6_tgl.labelString: CD Right",

	"XLTMix*controls_lbl.labelString: Mixer Controls:",
	"XLTMix*controls_lbl.fontList: *helvetica-bold-r-normal--12*",
	"XLTMix*controls_rc2*fontList: *helvetica-bold-r-normal--10*",
	"XLTMix*controls0_tgl.labelString: AGC",

	"XLTMix*output_lbl.labelString: Mixer Outputs:",
	"XLTMix*output_lbl.fontList: *helvetica-bold-r-normal--12*",
	"XLTMix*output_rc2*fontList: *helvetica-bold-r-normal--10*",
	"XLTMix*output0_tgl.labelString: Line Left",
	"XLTMix*output1_tgl.labelString: CD Left",
	"XLTMix*output2_tgl.labelString: Microphone",
	"XLTMix*output3_tgl.labelString: Line Right",
	"XLTMix*output4_tgl.labelString: CD Right",
	"XLTMix*output5_tgl.labelString: MUTE",

	NULL
};

/*
 * WIDGETS :
 */
Widget wParent;						/* Parent shell widget */
XtAppContext aContext;					/* Application context */

Widget wMain;						/* Main widget */
Widget wMain_RC1;
Widget wMain_RC2;
Widget wMenuBar;					/* Main menu bar */
Widget wFileMenuCascade;				/* Cascade button for File Menu */
Widget wFileMenu;					/* File menu itself */
Widget wExit;						/* File->Exit */

Widget wHelpMenuCascade;				/* Cascade button for Help Menu */
Widget wHelpMenu;					/* Help menu itself */
Widget wAbout;						/* Help->About */

Widget wErrDlg;						/* Error Dialog Box */
XmString sErrDlgTitle;					/* Title for the Error Dialog Box */

Widget wAboutDlg;					/* About Dialog Box */
XmString sAboutDlgTitle;				/* About Dialog Title String */
XmString sAboutDlgMessage;				/* About Dialog message and copyright */

Widget wDevFrame;					/* Frame about device controls */
Widget wDevFrame_Lbl;					/* Label for this Frame */
Widget wDevFrame_RC0;					/* Vertical RC */
Widget wDevFrame_RC1;					/* Horizontal RC */
DevSliders devVoice;					/* Digitized voice */
DevSliders devMIDI;					/* MIDI device */
DevSliders devCD;					/* CD Audio */
DevSliders devLine;					/* Line in jack */
Widget wMicSpk_RC;
DevSliders devMic;					/* Microphone */
DevSliders devSpk;					/* PC Speaker */

Widget wGainFrame;					/* Gain controls */
Widget wGainFrame_Lbl;
Widget wGainFrame_RC0;					/* Holds wGainFrame_Lbl + wGainFrame_RC1 */
Widget wGainFrame_RC1;					/* Gain controls: Row column */
DevSliders inpGain;					/* Input Gain: Left + Right */
DevSliders outGain;					/* Output Gain: Left + Right */

Widget wMctlFrame;					/* Master controls */
Widget wMctlFrame_Lbl;
Widget wMctlFrame_RC0;					/* Holds a label + RC1 */
Widget wMctlFrame_RC1;					/* Master controls: Row column */
DevSliders mctlVol;					/* Volume left + right */
DevSliders mctlTreble;					/* Treble left + right */
DevSliders mctlBass;					/* Bass left + right */

Widget wTgl_RC;						/* Toggles row across bottom */
TglGroup gInpLeft;					/* Input Left switches */
TglGroup gInpRight;					/* Input Right switches */
TglGroup gControls;					/* Controls Group */
TglGroup gOutput;					/* Output switches */
Widget *pwMUTE = &gOutput.tgl[5].Toggle;		/* Point to MUTE widget */

/*
 * Initialization Lists:
 */
static TglDesc bInpLeftSet[8] = {
	{ MIXREG_INMIX_SW_L, 0x40, False },		/* MIDI-L */
	{ MIXREG_INMIX_SW_L, 0x10, False },		/* Line-L */
	{ MIXREG_INMIX_SW_L, 0x04, False },		/* CD-L */
	{ MIXREG_INMIX_SW_L, 0x01, False },		/* Mic */
	{ MIXREG_INMIX_SW_L, 0x20, False },		/* MIDI-R */
	{ MIXREG_INMIX_SW_L, 0x08, False },		/* Line-R */
	{ MIXREG_INMIX_SW_L, 0x02, False },		/* CD-R */
	{ MIXREG_AGC,        0x01, False },		/* AGC */
};
static TglDesc bInpRightSet[7] = {
	{ MIXREG_INMIX_SW_R, 0x40, False },		/* MIDI-L */
	{ MIXREG_INMIX_SW_R, 0x10, False },		/* Line-L */
	{ MIXREG_INMIX_SW_R, 0x04, False },		/* CD-L */
	{ MIXREG_INMIX_SW_R, 0x01, False },		/* Mic */
	{ MIXREG_INMIX_SW_R, 0x20, False },		/* MIDI-R */
	{ MIXREG_INMIX_SW_R, 0x08, False },		/* Line-R */
	{ MIXREG_INMIX_SW_R, 0x02, False },		/* CD-R */
};
static TglDesc bControlsSet[1] = {
	{ MIXREG_AGC,        0x01, True },		/* AGC */
};
static TglDesc bOutSet[6] = {
	{ MIXREG_OUTMIX_SW, 0x10, False },		/* Line-L */
	{ MIXREG_OUTMIX_SW, 0x04, False },		/* CD-L */
	{ MIXREG_OUTMIX_SW, 0x01, False },		/* Mic */
	{ MIXREG_OUTMIX_SW, 0x08, False },		/* Line-R */
	{ MIXREG_OUTMIX_SW, 0x02, False },		/* CD-R */
	{ MIXREG_NONE,      0x00, False },		/* MUTE (not a mixer function) */
};

/*
 * The infamous "main" program:
 */
int
main(int argc,char **argv) {
	Arg al[20];					/* Arg list */
	Cardinal ac;					/* Args count */
	
	/*
	 * Do mixer initialization:
	 */
	MixInit();

	/*
	 * When this program runs as setuid 'root', we want to switch back to ourself
	 * as soon as possible. We do that here, since after we have access from the
	 * MixInit() call, we can be ourselves again.
	 */
	setuid(getuid());

	/*
	 * Do some text editing on the RCS Id strings for display purposes:
	 */
	EditVersionInit();				/* Edit $ Revision $ string into vers[] */
	{
		char edited_title[1024];

		EditVersion("X LessTif Mix Version $",edited_title);

		/*
		 * CreateApplication Context:
		 */
		ac = 0;
		XtSetArg(al[ac],XmNtitle,edited_title); ++ac;
		wParent = XtAppInitialize(&aContext,
			"XLTMix",			/* app. class */
			(XrmOptionDescList) NULL, 0,	/* options */
			&argc, argv,			/* cmd line */
			fallback_resources,		/* fallback resources */
			al,ac);				/* hard coded resources */
	}

	/*
	 * Create Main widget:
	 */
	ac = 0;
	wMain = XmCreateMainWindow(wParent,"main",al,ac);
	XtManageChild(wMain);				/* Main window widget */

	/*
	 * Create the Menu Bar:
	 */
	ac = 0;
	wMenuBar = XmCreateMenuBar(wMain,"menubar",al,ac);
	XtManageChild(wMenuBar);			/* Main window menu bar */

	CreateMenu(wMenuBar,&wFileMenu,"filemenu",&wFileMenuCascade,"filemenucascade",
		"exit",'M',ExitCB,&wExit,
		NULL);

	CreateMenu(wMenuBar,&wHelpMenu,"helpmenu",&wHelpMenuCascade,"helpmenucascade",
		"about",'M',AboutCB,&wAbout,
		NULL);

	XtManageChild(wFileMenuCascade);			/* File Menu cascade button */
	XtManageChild(wExit);					/* File->Exit */
	XtManageChild(wHelpMenuCascade);			/* Help menu cascade bytton */

	/*
	 * main_rc1 is the vertical Row/Col manager for the main window:
	 */
	ac = 0;
	XtSetArg(al[ac],XmNorientation,XmVERTICAL); ++ac;
	XtSetArg(al[ac],XmNpacking,XmPACK_TIGHT); ++ac;
	wMain_RC1 = XmCreateRowColumn(wMain,"main_rc1",al,ac);
	XtManageChild(wMain_RC1);				/* Main window widget */

	/*
	 * main_rc2 is the horizontal top row Row/Col manager for the
	 * scroll bar controls.
	 */
	ac = 0;
	XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ++ac;
	XtSetArg(al[ac],XmNpacking,XmPACK_TIGHT); ++ac;
	wMain_RC2 = XmCreateRowColumn(wMain_RC1,"main_rc2",al,ac);
	XtManageChild(wMain_RC2);				/* Main window widget */

	/*
	 * Create the error message dialog:
	 */
	sErrDlgTitle = XmStringCreate("X LessTif Mix : Error Message",XmSTRING_DEFAULT_CHARSET);
	ac = 0;
	XtSetArg(al[ac],XmNdialogStyle,XmDIALOG_APPLICATION_MODAL); ac++;
	XtSetArg(al[ac],XmNtitle,"Error Report"); ac++;
	XtSetArg(al[ac],XmNdefaultButtonType,XmDIALOG_OK_BUTTON); ++ac;
	XtSetArg(al[ac],XmNmessageAlignment,XmALIGNMENT_CENTER); ++ac;
	XtSetArg(al[ac],XmNdialogTitle,sErrDlgTitle); ++ac;
	XtSetArg(al[ac],XmNallowResize,False); ++ac;
	wErrDlg = XmCreateErrorDialog(wParent,"ErrDlg",al,ac);
	XtAddCallback(wErrDlg,XmNokCallback,ExitDlgCB,NULL);
	XtUnmanageChild(XmMessageBoxGetChild(wErrDlg,XmDIALOG_CANCEL_BUTTON));
	XtUnmanageChild(XmMessageBoxGetChild(wErrDlg,XmDIALOG_HELP_BUTTON));

	/*
	 * Create About Dialog Title and Message strings:
	 */
	sAboutDlgTitle = XmStringCreate("X LessTif Mix : Help->About",XmSTRING_DEFAULT_CHARSET);
	{
		char buf[1024];

		EditVersion(
			"X LessTif Mix Version $\n"
			"was written by and is\n"
			"Copyright (C) 1997 by Warren W. Gay VE3WWG\n"
			"---\n"
			"Many thanks to the LINUX folks,\n"
			"the XFree86 folks,\n"
			"and of course the LessTif group\n"
			"for making this application possible.\n"
			"---\n"
			"This program comes with\n"
			"ABSOLUTELY NO WARRANTY.",
			buf);

		sAboutDlgMessage = XmStringCreateLtoR(buf,XmSTRING_DEFAULT_CHARSET);
	}
		
	/*
	 * Create About Dialog Box itself:
	 */
	ac = 0;
	XtSetArg(al[ac],XmNdefaultPosition,False); ac++;
	XtSetArg(al[ac],XmNtitle,"Error Report"); ac++;
	XtSetArg(al[ac],XmNdefaultButtonType,XmDIALOG_OK_BUTTON); ++ac;
	XtSetArg(al[ac],XmNmessageAlignment,XmALIGNMENT_CENTER); ++ac;
	XtSetArg(al[ac],XmNdialogTitle,sAboutDlgTitle); ++ac;
	XtSetArg(al[ac],XmNallowResize,False); ++ac;
	wAboutDlg = XmCreateMessageDialog(wParent,"AboutDlg",al,ac);
	XtAddCallback(wAboutDlg,XmNokCallback,AboutDlgOkCB,NULL);
	XtUnmanageChild(XmMessageBoxGetChild(wAboutDlg,XmDIALOG_CANCEL_BUTTON));
	XtUnmanageChild(XmMessageBoxGetChild(wAboutDlg,XmDIALOG_HELP_BUTTON));
	XtManageChild(wAbout);					/* Help->About */

	/*
	 * Now if the mixer did not initialize successfully, we must put up the
	 * error dialog now, and then bail out.
	 */
	if ( bPortAccessFailed || bPortInvalid ) {
		bFatal = True;
		ReportError(__FILE__,__LINE__,"%s",fatalMsg);
		XtRealizeWidget(wParent);			/* OK, realize it all.. */
		XtAppMainLoop(aContext);
		exit(1);					/* Should never get here */
	}

	/*
	 * Device Frame (Input Levels):
	 */
	ac = 0;
	XtSetArg(al[ac],XmNmarginHeight,frame_margin); ++ac;
	XtSetArg(al[ac],XmNmarginWidth,frame_margin); ++ac;
	wDevFrame = XmCreateFrame(wMain_RC2,"dev_frame",al,ac);
	XtManageChild(wDevFrame);

	/*
	 * dev_rc0 holds the "Input Level" label + the scroll bars beneath
	 */
	ac = 0;
	XtSetArg(al[ac],XmNorientation,XmVERTICAL); ++ac;
	XtSetArg(al[ac],XmNpacking,XmPACK_TIGHT); ++ac;
	wDevFrame_RC0 = XmCreateRowColumn(wDevFrame,"dev_rc0",al,ac);
	XtManageChild(wDevFrame_RC0);

	/*
	 * Label "Input Levels"
	 */
	ac = 0;
	wDevFrame_Lbl = XmCreateLabel(wDevFrame_RC0,"dev_lbl",al,ac);
	XtManageChild(wDevFrame_Lbl);

	/*
	 * dev_rc1 holds the various controls horizontally
	 */
	ac = 0;
	XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ++ac;
	XtSetArg(al[ac],XmNpacking,XmPACK_TIGHT); ++ac;
	wDevFrame_RC1 = XmCreateRowColumn(wDevFrame_RC0,"dev_rc1",al,ac);
	XtManageChild(wDevFrame_RC1);

	/*
	 * Create the input level controls:
	 */
	CreateSliders(wDevFrame_RC1,"ctlvoc",&devVoice,1,31,MIXREG_VOICE_L5,MIXREG_VOICE_R5);
	CreateSliders(wDevFrame_RC1,"ctlmidi",&devMIDI,1,31,MIXREG_MIDI_L5,MIXREG_MIDI_R5);
	CreateSliders(wDevFrame_RC1,"ctlcd",&devCD,1,31,MIXREG_CD_L5,MIXREG_CD_R5);
	CreateSliders(wDevFrame_RC1,"ctlline",&devLine,1,31,MIXREG_LINE_L5,MIXREG_LINE_R5);

	/*
	 * Container for the Mic and Spk level controls:
	 */
	ac = 0;
	XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ++ac;
	XtSetArg(al[ac],XmNpacking,XmPACK_COLUMN); ++ac;
	XtSetArg(al[ac],XmNmarginHeight,0); ++ac;
	XtSetArg(al[ac],XmNmarginWidth,0); ++ac;
	wMicSpk_RC = XmCreateRowColumn(wDevFrame_RC1,"micspk_rc",al,ac);
	XtManageChild(wMicSpk_RC);

	/*
	 * Create the Mic and Spkr level controls:
	 */
	CreateSliders(wMicSpk_RC,"ctlmic",&devMic,0,31,MIXREG_MIC_5,MIXREG_NONE);
	CreateSliders(wMicSpk_RC,"ctlspk",&devSpk,0,3,MIXREG_SPKR_2,MIXREG_NONE);

	/*
	 * Gain Control Frame:
	 */
	ac = 0;
	XtSetArg(al[ac],XmNmarginHeight,frame_margin); ++ac;
	XtSetArg(al[ac],XmNmarginWidth,frame_margin); ++ac;
	wGainFrame = XmCreateFrame(wMain_RC2,"gain_frame",al,ac);
	XtManageChild(wGainFrame);

	/*
	 * gain_rc0 holds the "Mixer Gain" label + controls (vertical)
	 */
	ac = 0;
	XtSetArg(al[ac],XmNorientation,XmVERTICAL); ++ac;
	XtSetArg(al[ac],XmNpacking,XmPACK_TIGHT); ++ac;
	wGainFrame_RC0 = XmCreateRowColumn(wGainFrame,"gain_rc0",al,ac);
	XtManageChild(wGainFrame_RC0);

	/*
	 * "Mixer Gain" Label:
	 */
	ac = 0;
	wGainFrame_Lbl = XmCreateLabel(wGainFrame_RC0,"gain_lbl",al,ac);
	XtManageChild(wGainFrame_Lbl);

	/*
	 * gain_rc1 holds the Mixer Gain controls horizontally:
	 */
	ac = 0;
	XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ++ac;
	XtSetArg(al[ac],XmNpacking,XmPACK_TIGHT); ++ac;
	wGainFrame_RC1 = XmCreateRowColumn(wGainFrame_RC0,"gain_rc1",al,ac);
	XtManageChild(wGainFrame_RC1);

	/*
	 * Create input and output gain level controls:
	 */
	CreateSliders(wGainFrame_RC1,"igain",&inpGain,1,3,MIXREG_IGAIN_L2,MIXREG_IGAIN_R2);
	CreateSliders(wGainFrame_RC1,"ogain",&outGain,1,3,MIXREG_OGAIN_L2,MIXREG_OGAIN_R2);

	/*
	 * Master Control Frame (Master Levels):
	 */
	ac = 0;
	XtSetArg(al[ac],XmNmarginHeight,frame_margin); ++ac;
	XtSetArg(al[ac],XmNmarginWidth,frame_margin); ++ac;
	wMctlFrame = XmCreateFrame(wMain_RC2,"mctl_frame",al,ac);
	XtManageChild(wMctlFrame);

	/*
	 * mctl_rc0 holds the label + controls (vertically)
	 */
	ac = 0;
	XtSetArg(al[ac],XmNorientation,XmVERTICAL); ++ac;
	XtSetArg(al[ac],XmNpacking,XmPACK_TIGHT); ++ac;
	wMctlFrame_RC0 = XmCreateRowColumn(wMctlFrame,"mctl_rc0",al,ac);
	XtManageChild(wMctlFrame_RC0);

	/*
	 * "Master Levels" Label:
	 */
	ac = 0;
	wMctlFrame_Lbl = XmCreateLabel(wMctlFrame_RC0,"mctl_lbl",al,ac);
	XtManageChild(wMctlFrame_Lbl);

	/*
	 * mctl_rc1 holds the master level controls horizontally
	 */
	ac = 0;
	XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ++ac;
	XtSetArg(al[ac],XmNpacking,XmPACK_TIGHT); ++ac;
	wMctlFrame_RC1 = XmCreateRowColumn(wMctlFrame_RC0,"mctl_rc1",al,ac);
	XtManageChild(wMctlFrame_RC1);

	/*
	 * Create Master Level controls for volume, treble and bass
	 */
	CreateSliders(wMctlFrame_RC1,"vol",&mctlVol,1,31,MIXREG_MSTR_L5,MIXREG_MSTR_R5);
	CreateSliders(wMctlFrame_RC1,"treble",&mctlTreble,1,15,MIXREG_TREBLE_L4,MIXREG_TREBLE_R4);
	CreateSliders(wMctlFrame_RC1,"bass",&mctlBass,1,15,MIXREG_BASS_L4,MIXREG_BASS_R4);

	/*
	 * tgl_rc holds the groups of toggles horizontally:
	 */
	ac = 0;
	XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ++ac;
	XtSetArg(al[ac],XmNpacking,XmPACK_TIGHT); ++ac;
	XtSetArg(al[ac],XmNisAligned,False); ++ac;
	wTgl_RC = XmCreateRowColumn(wMain_RC1,"tgl_rc",al,ac);
	XtManageChild(wTgl_RC);

	/*
	 * Create toggle groups:	Record Left and Right Record Inputs,
	 *				Mixer Controls, and
	 *				Mixer Outputs
	 */
	CreateToggleGroup(wTgl_RC,"inpLeft",&gInpLeft,7,bInpLeftSet);
	CreateToggleGroup(wTgl_RC,"inpRight",&gInpRight,7,bInpRightSet);
	CreateToggleGroup(wTgl_RC,"controls",&gControls,1,bControlsSet);
	CreateToggleGroup(wTgl_RC,"output",&gOutput,6,bOutSet);

	/*
	 * The MOTIF Main Loop:
	 */
	XtRealizeWidget(wParent);				/* OK, realize it all.. */
	XtAppMainLoop(aContext);
	return 0;						/* A cookie for the compiler */
}                       

/* $Source: /wwg/motif/xltmix/RCS/xltmix.c,v $ */

Results 1 - 1
Help - FTP Sites List - Software Dir.
Searching half a billion files worldwide
© 1997-2009 MARUHN Internet Solutions