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 $ */