xmix-2.1.orig/ 40755 1751 1751 0 6171253635 11674 5ustar osd1000osd1000xmix-2.1.orig/xmix.lsm100644 1751 1751 1335 5571546776 13513 0ustar osd1000osd1000Begin2 Title = xmix Version = 2.1 Desc1 = X11/Xt Mixer control for Linux + Sound Driver V2.x Desc2 = Tested with Linux 1.0.9 and included sound driver + PAS16 Desc3 = and XFree86 V2.1 Author = Hal Brand AuthorEmail = brand@netcom.com or brand1@llnl.gov Maintainer = Hal Brand MaintEmail = brand@netcom.com or brand1@llnl.gov Site1 = sunsite.unc.edu Path1 = /pub/Linux/Incoming File1 = xmix.tar.gz Required1 = Linux 0.99pl14 or newer, Sound Driver V2.0 or newer Required2 = Supported sound card CopyPolicy1 = GPL Keywords = Sound, Mixer Comment1 = This is an alternative to the XView based mixer Entered = 27-May-1994 EnteredBy = Hal Brand End xmix-2.1.orig/xmix.c100644 1751 1751 56772 5571546655 13175 0ustar osd1000osd1000/*====================================================================== xmix: An X11 interface for Linux derived from: ---------- xmix: X interface to the Sound Blaster mixer. [ This file is a part of SBlast-BSD-1.5 ] Steve Haehnichen xmix.c,v 1.5 1992/09/14 03:17:21 steve Exp Copyright (C) 1992 Steve Haehnichen. 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; either version 1, or (at your option) any later version. 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. 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. * xmix.c,v * Revision 1.5 1992/09/14 03:17:21 steve * Released with driver v1.5. * Converted over to stereo CD levels. * * Revision 1.4 1992/06/12 22:33:39 steve * Much better. * Moved many resources into source code. * Ready for release in v1.4 * * Revision 1.3 1992/06/08 04:36:26 steve * Works fine. * ---------- Linux/Sound driver V2.0 port by Hal Brand (brand@netcom.com or brand1@llnl.gov) Let's call this xmix V2.0 since it is significantly changed. Patches for using the sound driver capabilities from: I added a little bit of code to have X11 disable the controls but BIG THANKS to Rick! I'll call this version V2.1 ======================================================================*/ #include #include #include /* * Include files required for all Toolkit programs */ #include /* Intrinsics Definitions */ #include /* Standard Name-String definitions */ #include /* Shell Definitions */ /* * Public include file for widgets we actually use in this file. */ #include /* Athena Command Widget */ #include #include #include #include #include #include "xmix.icon.bit" /* The icon, of course */ #include "locked.bit" /* L & R locked together (From dirt) */ #include "unlocked.bit" /* L & R free to be different (From dirt)*/ #include "circle_on.bit" #include "circle_off.bit" #include "square_empty.bit" #include "square_with_x.bit" #include #define SOUND_FULL_SCALE 100.0 #define MAX_SOUND_VOL 95 #define MIN_SOUND_VOL 05 #define SLIDER_LENGTH (0.05) /* * Here's the debugging macro I use here and there, so I can turn * them all on or off in one place. */ /* #define DEBUG */ #ifdef DEBUG #define DPRINTF(x) printf x #else #define DPRINTF(x) #endif /* * Some of these Xt names are too long for nice formatting */ #define MW XtVaCreateManagedWidget #define PORTION(val) (1.0 - (float)val / SOUND_FULL_SCALE) #define MK_BITMAP(bits, width, height) \ XCreateBitmapFromData (XtDisplay (topLevel), \ RootWindowOfScreen (XtScreen (topLevel)),\ bits, width, height) #define SCROLLBAR_RES XtNwidth, 23, XtNheight, 100 #define CENTER(widg) XtVaSetValues (widg, XtNwidth,\ centering_width, NULL) typedef struct stereovolume { unsigned char left; unsigned char right; } StereoVolume; typedef struct volctrl { int mixer_id; Widget formw; Widget labelw; Widget leftw; Widget rightw; Widget lockw; int locked; StereoVolume volume; int supported; } VolumeControl; /* * I'm lazy. Everything is global today. */ Pixmap icon_pixmap, locked_pixmap, unlocked_pixmap; Pixmap circle_on_pixmap, circle_off_pixmap; Pixmap square_empty_pixmap, square_with_x_pixmap; Widget topLevel, quit, whole, buttons, sliders; Widget sources, line_src, mic_src, cd_src, source_label; Widget line_src_label, mic_src_label, cd_src_label; int centering_width; int mixer_fd; VolumeControl master, line, dsp, fm, cd, mic, bass, treble, reclvl; /* * Convert all the pixmap data into Pixmap objects. */ static void install_pixmaps (void) { /* The icon bitmap */ icon_pixmap = MK_BITMAP (xmix_bits, xmix_width, xmix_height); XtVaSetValues (topLevel, XtNiconPixmap, icon_pixmap, NULL); locked_pixmap = MK_BITMAP (locked_bits, locked_width, locked_height); unlocked_pixmap = MK_BITMAP (unlocked_bits, unlocked_width, unlocked_height); circle_on_pixmap = MK_BITMAP (circle_on_bits, circle_on_width, circle_on_height); circle_off_pixmap = MK_BITMAP (circle_off_bits, circle_off_width, circle_off_height); square_empty_pixmap = MK_BITMAP (square_empty_bits, square_empty_width, square_empty_height); square_with_x_pixmap = MK_BITMAP (square_with_x_bits, square_with_x_width, square_with_x_height); } static void sync_slider(VolumeControl *vcptr) { float portion; if (!vcptr->supported) return; if (ioctl(mixer_fd,MIXER_READ(vcptr->mixer_id),&vcptr->volume) == -1) perror("Error reading volumes in sync_slider"); portion = PORTION(vcptr->volume.left); XawScrollbarSetThumb (vcptr->leftw, portion, SLIDER_LENGTH); if (vcptr->rightw != NULL) { portion = PORTION(vcptr->volume.right); XawScrollbarSetThumb (vcptr->rightw, portion, SLIDER_LENGTH); } return; } static void sync_lock(VolumeControl *vcptr) { if (vcptr->locked) XtVaSetValues (vcptr->lockw, XtNbitmap, locked_pixmap, NULL); else XtVaSetValues (vcptr->lockw, XtNbitmap, unlocked_pixmap, NULL); CENTER (vcptr->lockw); } static void Handle_lock(Widget w, XtPointer client_data, XtPointer call_data) { VolumeControl *vcptr = client_data; vcptr->locked = !(vcptr->locked); if (vcptr->locked && vcptr->volume.left != vcptr->volume.right) { vcptr->volume.left = vcptr->volume.right = ((vcptr->volume.left + vcptr->volume.right)/2); if (ioctl(mixer_fd,MIXER_WRITE(vcptr->mixer_id),&vcptr->volume) == -1) perror("Error in Handle_lock writing volumes"); sync_slider(vcptr); } sync_lock(vcptr); } /* * Match the shown button to the mixer's idea of the recording source. */ static void sync_source_display(void) { int source,id; if (ioctl(mixer_fd,SOUND_MIXER_READ_RECSRC,&source) == -1) perror("Error reading mixer recording source"); DPRINTF(("Current recording source is %d\n",source)); id = 0; if (source == 0) { id = SOUND_MIXER_MIC; source = 1 << id; if (ioctl(mixer_fd,SOUND_MIXER_WRITE_RECSRC,&source) == -1) perror("Error setting mixer recording source to MIC!"); } else { while ((source & 1) == 0) { source = source>>1; ++id; } } DPRINTF(("Current recording source ID=%d\n",id)); switch (id) { case SOUND_MIXER_MIC: XtVaSetValues (mic_src, XtNbitmap, circle_on_pixmap, NULL); XtVaSetValues (cd_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (line_src, XtNbitmap, circle_off_pixmap, NULL); break; case SOUND_MIXER_CD: XtVaSetValues (mic_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (cd_src, XtNbitmap, circle_on_pixmap, NULL); XtVaSetValues (line_src, XtNbitmap, circle_off_pixmap, NULL); break; case SOUND_MIXER_LINE: XtVaSetValues (mic_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (cd_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (line_src, XtNbitmap, circle_on_pixmap, NULL); break; default: fprintf (stderr, "Invalid recording source!\n"); } return; } /* * Callback for selecting a new source. * Basically, we set the mixer to the new source, and then * let sync_source_display handle the visual feedback. * (Easier than radioGroups.) */ static void Handle_source(Widget w, XtPointer client_data, XtPointer call_data) { int source = 1 << ((int) client_data); DPRINTF(("Setting recording source to %d (%d)\n",source,(int)client_data)); if (ioctl(mixer_fd,SOUND_MIXER_WRITE_RECSRC,&source) == -1) perror("Error writing mixer recording source"); sync_source_display(); } /* * Quit button callback function */ void Quit(Widget w, XtPointer client_data, XtPointer call_data) { DPRINTF (("Exiting...\n")); exit (0); } static void set_slider(VolumeControl *vcptr, Widget w, int value) { float portion = PORTION(value); int update_needed; DPRINTF (("set_slider: val = %d, portion = %f\n",value,portion)); if (vcptr->locked) { update_needed = (vcptr->volume.left != value); DPRINTF (("set_slider: locked; updating\n")); vcptr->volume.left = vcptr->volume.right = value; XawScrollbarSetThumb(vcptr->leftw, portion, SLIDER_LENGTH); XawScrollbarSetThumb(vcptr->rightw, portion, SLIDER_LENGTH); } else { if (vcptr->leftw == w) { update_needed = (vcptr->volume.left != value); vcptr->volume.left = value; } else { update_needed = (vcptr->volume.right != value); vcptr->volume.right = value; } XawScrollbarSetThumb(w, portion, SLIDER_LENGTH); } /* * If the new value is at a different notch than the current setting, * then inform the mixer, and adopt the setting. * Otherwise, don't waste time setting the mixer. */ if (update_needed) { DPRINTF (("set_slider: updating mixer\n")); if (vcptr->supported && ioctl(mixer_fd,MIXER_WRITE(vcptr->mixer_id),&vcptr->volume) == -1) perror("Error writing mixer in Handle_slider"); } return; } /* * This is for pushing a slider to MAX or MIN position. * Of questionable utility, yes.. */ static void Handle_slam_slider(Widget w, XtPointer client_data, XtPointer call_data) { int val; VolumeControl *vcptr = client_data; val = (vcptr->leftw == w) ? vcptr->volume.left : vcptr->volume.right; if ((int)call_data < 0) { if (val >= MAX_SOUND_VOL) val = 10*((MAX_SOUND_VOL-1)/10); else val -= 10; if (val < MIN_SOUND_VOL) val = MIN_SOUND_VOL; } else { if (val <= MIN_SOUND_VOL) val = 10*((MIN_SOUND_VOL+9)/10); else val += 10; if (val > MAX_SOUND_VOL) val = MAX_SOUND_VOL; } set_slider(vcptr,w,val); return; } /* * XtNjumpProc callback for volume fader scrollbar widgets. * Great pains are taken to make the slider accurately reflect * the granular mixer setting, without actually querying the mixer * device. (This is faster.) */ static void Handle_slider(Widget w, XtPointer client_data, XtPointer call_data) { int val; VolumeControl *vcptr = client_data; DPRINTF (("Handle_slider got %f\n", *(float*)call_data)); val = (int)(.5 + (SOUND_FULL_SCALE * (1.0 - *(float*)call_data))); if (val > MAX_SOUND_VOL) val = MAX_SOUND_VOL; else if (val < MIN_SOUND_VOL) val = MIN_SOUND_VOL; set_slider(vcptr,w,val); return; } static void sync_sliders(void) { sync_slider(&master); sync_slider(&bass); sync_slider(&treble); sync_slider(&line); sync_slider(&dsp); sync_slider(&fm); sync_slider(&cd); sync_slider(&mic); sync_slider(&reclvl); } /* * Rescan the mixer settings and make all the indicators reflect * the current values. */ static void sync_display(void) { DPRINTF(("Updating..\n")); sync_source_display(); sync_sliders(); } static void set_supported(VolumeControl *vcptr, int is_sup) { vcptr->supported = is_sup; XtSetSensitive(vcptr->formw,is_sup); return; } void main (int argc, char **argv) { XtAppContext app_context; int scroll_sep, longway; Widget version; int supported; longway = (argc > 1 && strcmp(argv[1],"-l") == 0); topLevel = XtVaAppInitialize (&app_context, "XMix", /* Application class */ NULL, 0, /* command line option list */ &argc, argv, /* command line args */ NULL, /* for missing app-defaults file */ NULL); /* terminate varargs list */ whole = MW ("whole", formWidgetClass, topLevel, NULL); sliders = MW ("sliders", formWidgetClass, whole, NULL); master.mixer_id = SOUND_MIXER_VOLUME; master.formw = MW ("master_form", formWidgetClass, sliders, NULL); master.labelw = MW ("master_label", labelWidgetClass, master.formw, XtNlabel, "Master", NULL); master.leftw = MW ("master_l", scrollbarWidgetClass, master.formw, SCROLLBAR_RES, XtNfromVert, master.labelw,NULL); master.rightw = MW ("master_r", scrollbarWidgetClass, master.formw, SCROLLBAR_RES, XtNfromHoriz, master.leftw, XtNfromVert, master.labelw, NULL); master.lockw = MW ("master_lock", commandWidgetClass, master.formw, XtNfromVert, master.leftw, NULL); bass.mixer_id = SOUND_MIXER_BASS; bass.formw = MW ("bass_form", formWidgetClass, sliders, XtNfromHoriz, master.formw, NULL); bass.labelw = MW ("bass_label", labelWidgetClass, bass.formw, XtNlabel, "Bass", NULL); bass.leftw = MW ("bass_l", scrollbarWidgetClass, bass.formw, SCROLLBAR_RES, XtNfromVert, bass.labelw, NULL); bass.rightw = MW ("bass_r", scrollbarWidgetClass, bass.formw, SCROLLBAR_RES, XtNfromHoriz, bass.leftw, XtNfromVert, bass.labelw, NULL); bass.lockw = MW ("bass_lock", commandWidgetClass, bass.formw, XtNfromVert, bass.leftw, NULL); treble.mixer_id = SOUND_MIXER_TREBLE; treble.formw = MW ("treble_form", formWidgetClass, sliders, XtNfromHoriz, bass.formw, NULL); treble.labelw = MW ("treble_label", labelWidgetClass, treble.formw, XtNlabel, "Treble", NULL); treble.leftw = MW ("treble_l", scrollbarWidgetClass, treble.formw, SCROLLBAR_RES, XtNfromVert, treble.labelw, NULL); treble.rightw = MW ("treble_r", scrollbarWidgetClass, treble.formw, SCROLLBAR_RES, XtNfromHoriz, treble.leftw, XtNfromVert, treble.labelw, NULL); treble.lockw = MW ("treble_lock", commandWidgetClass, treble.formw, XtNfromVert, treble.leftw, NULL); line.mixer_id = SOUND_MIXER_LINE; line.formw = MW ("line_form", formWidgetClass, sliders, XtNfromHoriz, treble.formw, NULL); line.labelw = MW ("line_label", labelWidgetClass, line.formw, XtNlabel, "Line", NULL); line.leftw = MW ("line_l", scrollbarWidgetClass, line.formw, SCROLLBAR_RES, XtNfromVert, line.labelw, NULL); line.rightw = MW ("line_r", scrollbarWidgetClass, line.formw, SCROLLBAR_RES, XtNfromHoriz, line.leftw, XtNfromVert, line.labelw, NULL); line.lockw = MW ("line_lock", commandWidgetClass, line.formw, XtNfromVert, line.leftw, NULL); dsp.mixer_id = SOUND_MIXER_PCM; dsp.formw = MW ("dsp_form", formWidgetClass, sliders, longway ? XtNfromHoriz : XtNfromVert, longway ? line.formw : master.formw, NULL); dsp.labelw = MW ("dsp_label", labelWidgetClass, dsp.formw, XtNlabel, "DSP", NULL); dsp.leftw = MW ("dsp_l", scrollbarWidgetClass, dsp.formw, SCROLLBAR_RES, XtNfromVert, dsp.labelw, NULL); dsp.rightw = MW ("dsp_r", scrollbarWidgetClass, dsp.formw, SCROLLBAR_RES, XtNfromVert, dsp.labelw, XtNfromHoriz, dsp.leftw, NULL); dsp.lockw = MW ("dsp_lock", commandWidgetClass, dsp.formw, XtNfromVert, dsp.leftw, NULL); fm.mixer_id = SOUND_MIXER_SYNTH; fm.formw = MW ("fm_form", formWidgetClass, sliders, XtNfromHoriz, dsp.formw, longway ? NULL : XtNfromVert, bass.formw, NULL); fm.labelw = MW ("fm_label", labelWidgetClass, fm.formw, XtNlabel, "FM", NULL); fm.leftw = MW ("fm_l", scrollbarWidgetClass, fm.formw, SCROLLBAR_RES, XtNfromVert, fm.labelw, NULL); fm.rightw = MW ("fm_r", scrollbarWidgetClass, fm.formw, SCROLLBAR_RES, XtNfromVert, fm.labelw, XtNfromHoriz, fm.leftw, NULL); fm.lockw = MW ("fm_lock", commandWidgetClass, fm.formw, XtNfromVert, fm.leftw, NULL); cd.mixer_id = SOUND_MIXER_CD; cd.formw = MW ("cd_form", formWidgetClass, sliders, XtNfromHoriz, fm.formw, longway ? NULL : XtNfromVert, treble.formw, NULL); cd.labelw = MW ("cd_label", labelWidgetClass, cd.formw, XtNlabel, "CD", NULL); cd.leftw = MW ("cd_l", scrollbarWidgetClass, cd.formw, SCROLLBAR_RES, XtNfromVert, cd.labelw, NULL); cd.rightw = MW ("cd_r", scrollbarWidgetClass, cd.formw, SCROLLBAR_RES, XtNfromVert, cd.labelw, XtNfromHoriz, cd.leftw, NULL); cd.lockw = MW ("cd_lock", commandWidgetClass, cd.formw, XtNfromVert, cd.leftw, NULL); mic.mixer_id = SOUND_MIXER_MIC; mic.formw = MW ("mic_form", formWidgetClass, sliders, XtNfromHoriz, cd.formw, longway ? NULL : XtNfromVert, line.formw, NULL); mic.labelw = MW ("mic_label", labelWidgetClass, mic.formw, XtNlabel, "Mic", NULL); mic.leftw = MW ("mic_level", scrollbarWidgetClass, mic.formw, SCROLLBAR_RES, XtNfromVert, mic.labelw, NULL); mic.rightw = NULL; mic.lockw = NULL; reclvl.mixer_id = SOUND_MIXER_RECLEV; reclvl.formw = MW ("reclvl_form", formWidgetClass, sliders, XtNfromHoriz, mic.formw, longway ? NULL : XtNfromVert, line.formw, NULL); reclvl.labelw = MW ("reclvl_label", labelWidgetClass, reclvl.formw, XtNlabel, "Reclvl", NULL); reclvl.leftw = MW ("reclvl_level", scrollbarWidgetClass, reclvl.formw, SCROLLBAR_RES, XtNfromVert, reclvl.labelw, NULL); reclvl.rightw = NULL; reclvl.lockw = NULL; buttons = MW ("buttons", formWidgetClass, whole, XtNfromHoriz, sliders, NULL); version = MW ("Version", labelWidgetClass, buttons, XtNlabel, "XMix V2.1", NULL); sources = MW ("sources", formWidgetClass, buttons, XtNfromVert, version, NULL); source_label = MW ("source_label", labelWidgetClass, sources, XtNlabel, "Recording Source", NULL); line_src = MW ("line_src", commandWidgetClass, sources, XtNfromVert, source_label, NULL); line_src_label = MW ("line_src_label", labelWidgetClass, sources, XtNlabel, "Line In", XtNfromVert, source_label, XtNfromHoriz, line_src, NULL); mic_src = MW ("mic_src", commandWidgetClass, sources, XtNfromVert, line_src, NULL); mic_src_label = MW ("mic_src_label", labelWidgetClass, sources, XtNlabel, "Microphone", XtNfromVert, line_src, XtNfromHoriz, mic_src, NULL); cd_src = MW ("cd_src", commandWidgetClass, sources, XtNfromVert, mic_src, NULL); cd_src_label = MW ("cd_src_label", labelWidgetClass, sources, XtNlabel, "CD", XtNfromVert, mic_src, XtNfromHoriz, cd_src, NULL); quit = MW ("quit", commandWidgetClass, buttons, XtNfromVert, sources, XtNlabel, "Quit", XtNwidth, 50, XtNheight, 20, NULL); XtVaGetValues (mic.leftw, XtNwidth, ¢ering_width, NULL); CENTER (mic.labelw); XtVaGetValues (reclvl.leftw, XtNwidth, ¢ering_width, NULL); CENTER (reclvl.labelw); XtVaGetValues (master.formw, XtNhorizDistance, &scroll_sep, NULL); XtVaGetValues (master.leftw, XtNwidth, ¢ering_width, NULL); centering_width = centering_width * 2 + scroll_sep; CENTER (master.labelw); CENTER (bass.labelw); CENTER (treble.labelw); CENTER (line.labelw); CENTER (dsp.labelw); CENTER (fm.labelw); CENTER (cd.labelw); XtAddEventHandler (topLevel, EnterWindowMask, FALSE, (XtEventHandler) sync_display, NULL); XtAddCallback (quit, XtNcallback, Quit, 0 /* client_data */ ); XtAddCallback (master.leftw, XtNjumpProc, Handle_slider, &master); XtAddCallback (master.leftw, XtNscrollProc, Handle_slam_slider, &master); XtAddCallback (master.rightw, XtNjumpProc, Handle_slider, &master); XtAddCallback (master.rightw, XtNscrollProc, Handle_slam_slider, &master); XtAddCallback (master.lockw, XtNcallback, Handle_lock, &master); XtAddCallback (bass.leftw, XtNjumpProc, Handle_slider, &bass); XtAddCallback (bass.leftw, XtNscrollProc, Handle_slam_slider, &bass); XtAddCallback (bass.rightw, XtNjumpProc, Handle_slider, &bass); XtAddCallback (bass.rightw, XtNscrollProc, Handle_slam_slider, &bass); XtAddCallback (bass.lockw, XtNcallback, Handle_lock, &bass); XtAddCallback (treble.leftw, XtNjumpProc, Handle_slider, &treble); XtAddCallback (treble.leftw, XtNscrollProc, Handle_slam_slider, &treble); XtAddCallback (treble.rightw, XtNjumpProc, Handle_slider, &treble); XtAddCallback (treble.rightw, XtNscrollProc, Handle_slam_slider, &treble); XtAddCallback (treble.lockw, XtNcallback, Handle_lock, &treble); XtAddCallback (line.leftw, XtNjumpProc, Handle_slider, &line); XtAddCallback (line.leftw, XtNscrollProc, Handle_slam_slider, &line); XtAddCallback (line.rightw, XtNjumpProc, Handle_slider, &line); XtAddCallback (line.rightw, XtNscrollProc, Handle_slam_slider, &line); XtAddCallback (line.lockw, XtNcallback, Handle_lock, &line); XtAddCallback (dsp.leftw, XtNjumpProc, Handle_slider, &dsp); XtAddCallback (dsp.leftw, XtNscrollProc, Handle_slam_slider, &dsp); XtAddCallback (dsp.rightw, XtNjumpProc, Handle_slider, &dsp); XtAddCallback (dsp.rightw, XtNscrollProc, Handle_slam_slider, &dsp); XtAddCallback (dsp.lockw, XtNcallback, Handle_lock, &dsp); XtAddCallback (fm.leftw, XtNjumpProc, Handle_slider, &fm); XtAddCallback (fm.leftw, XtNscrollProc, Handle_slam_slider, &fm); XtAddCallback (fm.rightw, XtNjumpProc, Handle_slider, &fm); XtAddCallback (fm.rightw, XtNscrollProc, Handle_slam_slider, &fm); XtAddCallback (fm.lockw, XtNcallback, Handle_lock, &fm); XtAddCallback (cd.leftw, XtNjumpProc, Handle_slider, &cd); XtAddCallback (cd.leftw, XtNscrollProc, Handle_slam_slider, &cd); XtAddCallback (cd.rightw, XtNjumpProc, Handle_slider, &cd); XtAddCallback (cd.rightw, XtNscrollProc, Handle_slam_slider, &cd); XtAddCallback (cd.lockw, XtNcallback, Handle_lock, &cd); XtAddCallback (mic.leftw, XtNjumpProc, Handle_slider, &mic); XtAddCallback (mic.leftw, XtNscrollProc, Handle_slam_slider, &mic); XtAddCallback (reclvl.leftw, XtNjumpProc, Handle_slider, &reclvl); XtAddCallback (reclvl.leftw, XtNscrollProc, Handle_slam_slider, &reclvl); XtAddCallback (line_src, XtNcallback, Handle_source, (XtPointer)SOUND_MIXER_LINE); XtAddCallback (mic_src, XtNcallback, Handle_source, (XtPointer)SOUND_MIXER_MIC); XtAddCallback (cd_src, XtNcallback, Handle_source, (XtPointer)SOUND_MIXER_CD); install_pixmaps (); /* Open the mixer device */ mixer_fd = open ("/dev/mixer", O_RDWR, 0); if (mixer_fd < 0) perror ("Error opening mixer device"), exit (1); if (ioctl(mixer_fd, SOUND_MIXER_READ_DEVMASK, &supported) == -1) supported = 0xffff; /* Assume all are supported */ /* * Match the display settings to the current mixer configuration. */ sync_display(); /* * Pick some reasonable lock settings to start with. * Two equal volume levels start off with that pair linked. */ master.locked = (master.volume.left == master.volume.right); bass.locked = (bass.volume.left == bass.volume.right); treble.locked = (treble.volume.left == treble.volume.right); line.locked = (line.volume.left == line.volume.right); dsp.locked = (dsp.volume.left == dsp.volume.right); fm.locked = (fm.volume.left == fm.volume.right); cd.locked = (cd.volume.left == cd.volume.right); mic.locked = 0; reclvl.locked = 0; printf("supported = 0x%x\n",supported); set_supported(&master,(supported & SOUND_MASK_VOLUME) != 0); set_supported(&bass,(supported & SOUND_MASK_BASS) != 0); set_supported(&treble,(supported & SOUND_MASK_TREBLE) != 0); set_supported(&line,(supported & SOUND_MASK_LINE) != 0); set_supported(&dsp,(supported & SOUND_MASK_PCM) != 0); set_supported(&fm,(supported & SOUND_MASK_SYNTH) != 0); set_supported(&cd,(supported & SOUND_MASK_CD) != 0); set_supported(&mic,(supported & SOUND_MASK_MIC) != 0); set_supported(&reclvl,(supported & SOUND_MASK_RECLEV) != 0); /* * Update the lock bitmaps to reflect linking */ sync_lock(&master); sync_lock(&bass); sync_lock(&treble); sync_lock(&line); sync_lock(&dsp); sync_lock(&fm); sync_lock(&cd); XtRealizeWidget (topLevel); /* Action! */ XtAppMainLoop (app_context); /* Loop for events */ } xmix-2.1.orig/xmix.icon.bit100644 1751 1751 1275 5477274432 14420 0ustar osd1000osd1000#define xmix_width 40 #define xmix_height 20 static char xmix_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x18, 0x18, 0x7e, 0x18, 0x3c, 0x18, 0x18, 0x7e, 0x18, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x7e, 0x00, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x7e, 0x18, 0x18, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; xmix-2.1.orig/Imakefile100644 1751 1751 446 5523631013 13554 0ustar osd1000osd1000# # xmix Imakefile. # #CDEBUGFLAGS=-gstabs CDEBUGFLAGS=-O #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' SRCS1= xmix.c OBJS1= xmix.o PROGRAMS = xmix all:: $(PROGRAMS) LOCAL_LIBRARIES = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB) NormalProgramTarget(xmix,$(OBJS1),,$(LOCAL_LIBRARIES),) xmix-2.1.orig/XMix100644 1751 1751 740 5502254574 12562 0ustar osd1000osd1000xmix*font: -adobe-helvetica-*-r-*-*-*-*-*-*-*-*-*-* xmix.whole.background: black xmix.whole.buttons.background: black xmix*borderWidth: 0 xmix*highlightThickness: 1 xmix*background: SteelBlue4 xmix*foreground: gold xmix*sliders.background: black xmix*sliders*Label.foreground: light pink xmix*sliders*Scrollbar.background: LightSkyBlue2 xmix*sliders*Scrollbar.foreground: black xmix*buttons*Label.foreground: light pink xmix*quit.shapeStyle: oval xmix*quit.background: tomato3 xmix-2.1.orig/circle_off.bit100644 1751 1751 431 5477274217 14551 0ustar osd1000osd1000#define circle_off_width 15 #define circle_off_height 15 static char circle_off_bits[] = { 0x00, 0x00, 0xe0, 0x03, 0x18, 0x0c, 0xe4, 0x13, 0x14, 0x14, 0x0a, 0x28, 0x0a, 0x28, 0x0a, 0x28, 0x0a, 0x28, 0x0a, 0x28, 0x14, 0x14, 0xe4, 0x13, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; xmix-2.1.orig/circle_on.bit100644 1751 1751 426 5477274224 14415 0ustar osd1000osd1000#define circle_on_width 15 #define circle_on_height 15 static char circle_on_bits[] = { 0x00, 0x00, 0xe0, 0x03, 0x18, 0x0c, 0xe4, 0x13, 0xf4, 0x17, 0xfa, 0x2f, 0xfa, 0x2f, 0xfa, 0x2f, 0xfa, 0x2f, 0xfa, 0x2f, 0xf4, 0x17, 0xe4, 0x13, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00}; xmix-2.1.orig/locked.bit100644 1751 1751 431 5477274241 13714 0ustar osd1000osd1000#define locked_width 16 #define locked_height 16 static char locked_bits[] = { 0x00, 0x00, 0xf8, 0x01, 0x04, 0x02, 0xf4, 0x02, 0x94, 0x02, 0xff, 0x0f, 0xff, 0x0f, 0x9f, 0x0f, 0x0f, 0x0f, 0x6f, 0x0f, 0x6f, 0x0f, 0x6f, 0x0f, 0x6e, 0x07, 0x9e, 0x07, 0xfc, 0x03, 0xf8, 0x01}; xmix-2.1.orig/mono.bit100644 1751 1751 1531 5477274250 13445 0ustar osd1000osd1000#define mono_width 40 #define mono_height 25 static char mono_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x00, 0xc4, 0x08, 0x00, 0x00, 0x00, 0x8c, 0x18, 0x00, 0x00, 0xc0, 0x88, 0x11, 0x00, 0x00, 0x80, 0x18, 0x11, 0x00, 0x00, 0x88, 0x11, 0x11, 0x00, 0x00, 0x18, 0x11, 0x11, 0x00, 0x00, 0x10, 0x11, 0x11, 0x00, 0x00, 0x10, 0x11, 0x11, 0x00, 0x00, 0x10, 0x11, 0x11, 0x00, 0x00, 0x18, 0x11, 0x11, 0x00, 0x00, 0x88, 0x11, 0x11, 0x00, 0x00, 0x80, 0x18, 0x11, 0x00, 0x00, 0xc0, 0x88, 0x11, 0x00, 0x00, 0x00, 0x8c, 0x18, 0x00, 0x00, 0x00, 0xc4, 0x08, 0x00, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; xmix-2.1.orig/Makefile100644 1751 1751 25100 5540514025 13437 0ustar osd1000osd1000# Makefile generated by imake - do not edit! # $XConsortium: imake.c,v 1.65 91/07/25 17:50:17 rws Exp $ # ------------------------------------------------------------------------- # Makefile generated from "Imake.tmpl" and # $XFree86: mit/config/Imake.tmpl,v 2.6 1993/10/02 07:11:59 dawes Exp $ # $XConsortium: Imake.tmpl,v 1.139 91/09/16 08:52:48 rws Exp $ # # Platform-specific parameters may be set in the appropriate .cf # configuration files. Site-specific parameters should be set in the file # site.def. Full rebuilds are recommended if any parameters are changed. # # If your C preprocessor does not define any unique symbols, you will need # to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing # "make World" the first time). # # ------------------------------------------------------------------------- # site-specific configuration parameters that need to come before # the platform-specific parameters - edit site.def to change # $XFree86: mit/config/site.def,v 2.23 1993/10/16 17:28:07 dawes Exp $ # site: $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $ # ------------------------------------------------------------------------- # platform-specific configuration parameters - edit x386.cf to change # $XFree86: mit/config/x386.cf,v 2.27 1993/10/02 07:24:11 dawes Exp $ # platform: $XConsortium: x386.cf,v 1.7 91/08/16 19:30:10 gildea Exp $ # ------------------------------------------------------------------------- # XFree86 version definition # $XFree86: mit/config/xf86_vers.def,v 2.7 1993/10/08 16:11:07 dawes Exp $ # ------------------------------------------------------------------------- # XFree86 version: 2000 # ------------------------------------------------------------------------- # $XFree86: mit/config/lnuxLib.rules,v 2.5 1993/10/06 14:53:01 dawes Exp $ DLL_BINDIR = /usr/dll/bin # operating system: Linux # ------------------------------------------------------------------------- # site-specific configuration parameters that go after # the platform-specific parameters - edit site.def to change # $XFree86: mit/config/site.def,v 2.23 1993/10/16 17:28:07 dawes Exp $ # site: $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $ SHELL = /bin/sh TOP = . CURRENT_DIR = . AR = ar clq BOOTSTRAPCFLAGS = CC = gcc AS = as LEX = flex YACC = bison -y COMPRESS = compress CPP = /lib/cpp $(STD_CPP_DEFINES) PREPROCESSCMD = /lib/cpp $(STD_CPP_DEFINES) INSTALL = install LD = ld LINT = lint LINTLIBFLAG = -C LINTOPTS = -axz LN = ln -s MAKE = make MV = mv CP = cp RANLIB = ranlib RANLIBINSTFLAGS = RM = rm -f TROFF = psroff MSMACROS = -ms TBL = tbl EQN = eqn NROFF = nroff NEQN = neqn STD_INCLUDES = STD_CPP_DEFINES = -traditional -D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -Dlinux STD_DEFINES = -D_POSIX_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE -Dlinux EXTRA_LOAD_FLAGS = EXTRA_LIBRARIES = OS_LIBRARIES = TAGS = ctags SHAREDCODEDEF = SHLIBDEF = PROTO_DEFINES = -DFUNCPROTO=11 -DNARROWPROTO INSTPGMFLAGS = -s INSTBINFLAGS = -m 0755 INSTUIDFLAGS = -s -m 4755 INSTLIBFLAGS = -m 0644 INSTINCFLAGS = -m 0444 INSTMANFLAGS = -m 0444 INSTDATFLAGS = -m 0444 INSTKMEMFLAGS = -s -m 4755 PROJECTROOT = /usr/X386 TOP_INCLUDES = -I$(INCROOT) CDEBUGFLAGS = -O2 CCOPTIONS = -m486 -DNO_ASM -fwritable-strings ANSICCOPTIONS = ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES) ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(DEFINES) CFLAGS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES) LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES) LDLIBS = $(OS_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES) LDOPTIONS = $(ANSICCOPTIONS) $(CDEBUGFLAGS) $(CCOPTIONS) $(LOCAL_LDFLAGS) -L$(USRLIBDIR) LDCOMBINEFLAGS = -r DEPENDFLAGS = MACROFILE = x386.cf RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut IMAKE_DEFINES = IRULESRC = $(CONFIGDIR) IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES) ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules $(IRULESRC)/Project.tmpl $(IRULESRC)/site.def $(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES) # ------------------------------------------------------------------------- # X Window System Build Parameters # $XFree86: mit/config/Project.tmpl,v 2.1 1993/09/17 16:10:43 dawes Exp $ # $XConsortium: Project.tmpl,v 1.138.1.1 92/11/11 09:49:19 rws Exp $ _percentC_ = %C # ------------------------------------------------------------------------- # X Window System make variables; this need to be coordinated with rules PATHSEP = / USRLIBDIR = /usr/X386/lib BINDIR = /usr/X386/bin INCROOT = /usr/X386/include BUILDINCROOT = $(TOP) BUILDINCDIR = $(BUILDINCROOT)/X11 BUILDINCTOP = .. INCDIR = $(INCROOT)/X11 ADMDIR = /usr/adm LIBDIR = $(USRLIBDIR)/X11 CONFIGDIR = $(LIBDIR)/config LINTLIBDIR = $(USRLIBDIR)/lint FONTDIR = $(LIBDIR)/fonts XINITDIR = $(LIBDIR)/xinit XDMDIR = $(LIBDIR)/xdm TWMDIR = $(LIBDIR)/twm MANPATH = /usr/X386/man MANSOURCEPATH = $(MANPATH)/man MANSUFFIX = 1x LIBMANSUFFIX = 3x FILEMANSUFFIX = 5x MANDIR = $(MANSOURCEPATH)1 LIBMANDIR = $(MANSOURCEPATH)3 FILEMANDIR = $(MANSOURCEPATH)5 NLSDIR = $(LIBDIR)/nls PEXAPIDIR = $(LIBDIR)/PEX XAPPLOADDIR = $(LIBDIR)/app-defaults FONTCFLAGS = -t LINKKITDIR = $(USRLIBDIR)/Server INSTAPPFLAGS = $(INSTDATFLAGS) IMAKE = imake DEPEND = makedepend RGB = rgb FONTC = bdftopcf MKFONTDIR = mkfontdir MKDIRHIER = /bin/sh $(BINDIR)/mkdirhier CONFIGSRC = $(TOP)/config DOCUTILSRC = $(TOP)/doc/util CLIENTSRC = $(TOP)/clients DEMOSRC = $(TOP)/demos LIBSRC = $(TOP)/lib FONTSRC = $(TOP)/fonts INCLUDESRC = $(TOP)/X11 SERVERSRC = $(TOP)/server UTILSRC = $(TOP)/util SCRIPTSRC = $(UTILSRC)/scripts EXAMPLESRC = $(TOP)/examples CONTRIBSRC = $(TOP)/../contrib DOCSRC = $(TOP)/doc RGBSRC = $(TOP)/rgb DEPENDSRC = $(UTILSRC)/makedepend IMAKESRC = $(CONFIGSRC) XAUTHSRC = $(LIBSRC)/Xau XLIBSRC = $(LIBSRC)/X XMUSRC = $(LIBSRC)/Xmu TOOLKITSRC = $(LIBSRC)/Xt AWIDGETSRC = $(LIBSRC)/Xaw OLDXLIBSRC = $(LIBSRC)/oldX XDMCPLIBSRC = $(LIBSRC)/Xdmcp BDFTOSNFSRC = $(FONTSRC)/bdftosnf BDFTOSNFSRC = $(FONTSRC)/clients/bdftosnf BDFTOPCFSRC = $(FONTSRC)/clients/bdftopcf MKFONTDIRSRC = $(FONTSRC)/clients/mkfontdir FSLIBSRC = $(FONTSRC)/lib/fs FONTSERVERSRC = $(FONTSRC)/server EXTENSIONSRC = $(TOP)/extensions XILIBSRC = $(EXTENSIONSRC)/lib/xinput PEXLIBSRC = $(EXTENSIONSRC)/lib/PEXlib PHIGSLIBSRC = $(EXTENSIONSRC)/lib/PEX # $XFree86: mit/config/lnuxLib.tmpl,v 2.0 1993/08/29 14:15:39 dawes Exp $ SHLIBLDFLAGS = PICFLAGS = -B/usr/dll/jump/ DEPEXTENSIONLIB = EXTENSIONLIB = -lXext DEPXLIB = $(DEPEXTENSIONLIB) XLIB = $(EXTENSIONLIB) -lX11 DEPXMULIB = XMULIB = -lXmu DEPXTOOLLIB = XTOOLLIB = -lXt DEPXAWLIB = XAWLIB = -lXaw DEPXILIB = XILIB = -lXi DEPXTESTLIB = XTESTLIB = -lXtst DEPPEXLIB = PEXLIB = -lPEX5 SOXLIBREV = 3.1.0 SOXTREV = 3.1.0 SOXAWREV = 3.1.0 SOOLDXREV = 3.1.0 SOXMUREV = 3.1.0 SOXEXTREV = 3.1.0 SOXINPUTREV = 3.1.0 SOPEXREV = 1.1.0 DEPXAUTHLIB = $(USRLIBDIR)/libXau.a XAUTHLIB = -lXau DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a XDMCPLIB = -lXdmcp DEPOLDXLIB = $(USRLIBDIR)/liboldX.a OLDXLIB = -loldX DEPPHIGSLIB = $(USRLIBDIR)/libphigs.a PHIGSLIB = -lphigs DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a XBSDLIB = -lXbsd LINTEXTENSIONLIB = $(LINTLIBDIR)/llib-lXext.ln LINTXLIB = $(LINTLIBDIR)/llib-lX11.ln LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln LINTXTOOL = $(LINTLIBDIR)/llib-lXt.ln LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln LINTXI = $(LINTLIBDIR)/llib-lXi.ln LINTPEX = $(LINTLIBDIR)/llib-lPEX5.ln LINTPHIGS = $(LINTLIBDIR)/llib-lphigs.ln DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB) DEPLIBS1 = $(DEPLIBS) DEPLIBS2 = $(DEPLIBS) DEPLIBS3 = $(DEPLIBS) # ------------------------------------------------------------------------- # Imake rules for building libraries, programs, scripts, and data files # $XFree86: mit/config/Imake.rules,v 2.1 1993/09/29 11:06:00 dawes Exp $ # rules: $XConsortium: Imake.rules,v 1.123 91/09/16 20:12:16 rws Exp $ # ------------------------------------------------------------------------- # start of Imakefile # # xmix Imakefile. # #CDEBUGFLAGS=-gstabs CDEBUGFLAGS=-O SRCS1= xmix.c OBJS1= xmix.o PROGRAMS = xmix all:: $(PROGRAMS) LOCAL_LIBRARIES = $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB) xmix: $(OBJS1) $(RM) $@ $(CC) -o $@ $(OBJS1) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS) clean:: $(RM) xmix # ------------------------------------------------------------------------- # common rules for all Makefiles - do not edit emptyrule:: clean:: $(RM_CMD) "#"* Makefile:: -@if [ -f Makefile ]; then set -x; \ $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \ else exit 0; fi $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR) tags:: $(TAGS) -w *.[ch] $(TAGS) -xw *.[ch] > TAGS # ------------------------------------------------------------------------- # empty rules for directories that do not have SUBDIRS - do not edit install:: @echo "install in $(CURRENT_DIR) done" install.man:: @echo "install.man in $(CURRENT_DIR) done" install.linkkit:: @echo "install.linkkit in $(CURRENT_DIR) done" Makefiles:: includes:: # ------------------------------------------------------------------------- # dependencies generated by makedepend xmix-2.1.orig/stereo.bit100644 1751 1751 1537 5477274310 14001 0ustar osd1000osd1000#define stereo_width 40 #define stereo_height 25 static char stereo_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x08, 0x18, 0x01, 0x00, 0x80, 0x18, 0x88, 0x01, 0x00, 0x80, 0x11, 0x8c, 0x18, 0x00, 0x18, 0x31, 0xc4, 0x08, 0x00, 0x10, 0x23, 0x44, 0x8c, 0x00, 0x31, 0x22, 0x44, 0xc4, 0x00, 0x23, 0x22, 0x44, 0x44, 0x00, 0x22, 0x22, 0x44, 0x44, 0x00, 0x22, 0x22, 0x44, 0x44, 0x00, 0x22, 0x22, 0x44, 0xc4, 0x00, 0x23, 0x22, 0x44, 0x8c, 0x00, 0x31, 0x22, 0xc4, 0x08, 0x00, 0x10, 0x23, 0x8c, 0x18, 0x00, 0x18, 0x31, 0x88, 0x01, 0x00, 0x80, 0x11, 0x18, 0x01, 0x00, 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; xmix-2.1.orig/unlocked.bit100644 1751 1751 437 5477274331 14265 0ustar osd1000osd1000#define unlocked_width 16 #define unlocked_height 16 static char unlocked_bits[] = { 0x00, 0x00, 0x00, 0x7f, 0x80, 0xc1, 0x80, 0xbe, 0x80, 0xe2, 0xff, 0x0f, 0x01, 0x08, 0x61, 0x08, 0x91, 0x08, 0xf1, 0x08, 0x61, 0x08, 0x91, 0x08, 0xf2, 0x04, 0x02, 0x04, 0x04, 0x02, 0xf8, 0x01}; xmix-2.1.orig/xmix.1100644 1751 1751 2151 5523632155 13035 0ustar osd1000osd1000.TH xmix 1 "10 Dec 1993" .IX xmix .SH NAME xmix - X Windows (Xaw) interface to Linux Sound Driver Mixer .SH SYNOPSIS .B xmix .RI [-l] .SH DESCRIPTION This is an adaptation of Steve Haehnichen's Sound Blaster control program "xmix" to the Linux's sound driver v2.0. It should be compatible with any Linux kernel using the v2.0 sound driver (which is standard with 0.99pl14). .PP The following options are recognized: .TP .B -l .B xmix displays in long mode. In this mode, all the controls are placed side-by-side across the screen. For small displays, this probably isn't desirable. .PP Note that it is best to load the XMix Resource file into your resource database before running xmix, or else there will be no colors, and too many borders. A typical command to load the resources is: .B xrdb XMix Alternatively, you could install the XMix file in your local app-defaults directory (typically /usr/X11/lib/app-defaults). .SH OPTIONS .PP This application uses all standards X Toolkit options. .SH BUGS None known as yet. .SH SEE ALSO mixer(1) .SH AUTHOR Hal Brand xmix-2.1.orig/xmix.c.orig100644 1751 1751 54440 5523631002 14074 0ustar osd1000osd1000/*====================================================================== xmix: An X11 interface for Linux derived from: ---------- xmix: X interface to the Sound Blaster mixer. [ This file is a part of SBlast-BSD-1.5 ] Steve Haehnichen xmix.c,v 1.5 1992/09/14 03:17:21 steve Exp Copyright (C) 1992 Steve Haehnichen. 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; either version 1, or (at your option) any later version. 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. 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. * xmix.c,v * Revision 1.5 1992/09/14 03:17:21 steve * Released with driver v1.5. * Converted over to stereo CD levels. * * Revision 1.4 1992/06/12 22:33:39 steve * Much better. * Moved many resources into source code. * Ready for release in v1.4 * * Revision 1.3 1992/06/08 04:36:26 steve * Works fine. * ---------- Linux/Sound driver V2.0 port by Hal Brand (brand@netcom.com or brand1@llnl.gov) Let's call this xmix V2.0 since it is significantly changed. ======================================================================*/ #include #include #include /* * Include files required for all Toolkit programs */ #include /* Intrinsics Definitions */ #include /* Standard Name-String definitions */ #include /* Shell Definitions */ /* * Public include file for widgets we actually use in this file. */ #include /* Athena Command Widget */ #include #include #include #include #include #include "xmix.icon.bit" /* The icon, of course */ #include "locked.bit" /* L & R locked together (From dirt) */ #include "unlocked.bit" /* L & R free to be different (From dirt)*/ #include "circle_on.bit" #include "circle_off.bit" #include "square_empty.bit" #include "square_with_x.bit" #include #define SOUND_FULL_SCALE 100.0 #define MAX_SOUND_VOL 95 #define MIN_SOUND_VOL 05 #define SLIDER_LENGTH (0.05) /* * Here's the debugging macro I use here and there, so I can turn * them all on or off in one place. */ /* #define DEBUG */ #ifdef DEBUG #define DPRINTF(x) printf x #else #define DPRINTF(x) #endif /* * Some of these Xt names are too long for nice formatting */ #define MW XtVaCreateManagedWidget #define PORTION(val) (1.0 - (float)val / SOUND_FULL_SCALE) #define MK_BITMAP(bits, width, height) \ XCreateBitmapFromData (XtDisplay (topLevel), \ RootWindowOfScreen (XtScreen (topLevel)),\ bits, width, height) #define SCROLLBAR_RES XtNwidth, 23, XtNheight, 100 #define CENTER(widg) XtVaSetValues (widg, XtNwidth,\ centering_width, NULL) typedef struct stereovolume { unsigned char left; unsigned char right; } StereoVolume; typedef struct volctrl { int mixer_id; Widget formw; Widget labelw; Widget leftw; Widget rightw; Widget lockw; int locked; StereoVolume volume; } VolumeControl; /* * I'm lazy. Everything is global today. */ Pixmap icon_pixmap, locked_pixmap, unlocked_pixmap; Pixmap circle_on_pixmap, circle_off_pixmap; Pixmap square_empty_pixmap, square_with_x_pixmap; Widget topLevel, quit, whole, buttons, sliders; Widget sources, line_src, mic_src, cd_src, source_label; Widget line_src_label, mic_src_label, cd_src_label; int centering_width; int mixer_fd; VolumeControl master, line, dsp, fm, cd, mic, bass, treble, reclvl; /* * Convert all the pixmap data into Pixmap objects. */ static void install_pixmaps (void) { /* The icon bitmap */ icon_pixmap = MK_BITMAP (xmix_bits, xmix_width, xmix_height); XtVaSetValues (topLevel, XtNiconPixmap, icon_pixmap, NULL); locked_pixmap = MK_BITMAP (locked_bits, locked_width, locked_height); unlocked_pixmap = MK_BITMAP (unlocked_bits, unlocked_width, unlocked_height); circle_on_pixmap = MK_BITMAP (circle_on_bits, circle_on_width, circle_on_height); circle_off_pixmap = MK_BITMAP (circle_off_bits, circle_off_width, circle_off_height); square_empty_pixmap = MK_BITMAP (square_empty_bits, square_empty_width, square_empty_height); square_with_x_pixmap = MK_BITMAP (square_with_x_bits, square_with_x_width, square_with_x_height); } static void sync_slider(VolumeControl *vcptr) { float portion; if (ioctl(mixer_fd,MIXER_READ(vcptr->mixer_id),&vcptr->volume) == -1) perror("Error reading volumes in sync_slider"); portion = PORTION(vcptr->volume.left); XawScrollbarSetThumb (vcptr->leftw, portion, SLIDER_LENGTH); if (vcptr->rightw != NULL) { portion = PORTION(vcptr->volume.right); XawScrollbarSetThumb (vcptr->rightw, portion, SLIDER_LENGTH); } return; } static void sync_lock(VolumeControl *vcptr) { if (vcptr->locked) XtVaSetValues (vcptr->lockw, XtNbitmap, locked_pixmap, NULL); else XtVaSetValues (vcptr->lockw, XtNbitmap, unlocked_pixmap, NULL); CENTER (vcptr->lockw); } static void Handle_lock(Widget w, XtPointer client_data, XtPointer call_data) { VolumeControl *vcptr = client_data; vcptr->locked = !(vcptr->locked); if (vcptr->locked && vcptr->volume.left != vcptr->volume.right) { vcptr->volume.left = vcptr->volume.right = ((vcptr->volume.left + vcptr->volume.right)/2); if (ioctl(mixer_fd,MIXER_WRITE(vcptr->mixer_id),&vcptr->volume) == -1) perror("Error in Handle_lock writing volumes"); sync_slider(vcptr); } sync_lock(vcptr); } /* * Match the shown button to the mixer's idea of the recording source. */ static void sync_source_display(void) { int source,id; if (ioctl(mixer_fd,SOUND_MIXER_READ_RECSRC,&source) == -1) perror("Error reading mixer recording source"); DPRINTF(("Current recording source is %d\n",source)); id = 0; if (source == 0) { id = SOUND_MIXER_MIC; source = 1 << id; if (ioctl(mixer_fd,SOUND_MIXER_WRITE_RECSRC,&source) == -1) perror("Error setting mixer recording source to MIC!"); } else { while ((source & 1) == 0) { source = source>>1; ++id; } } DPRINTF(("Current recording source ID=%d\n",id)); switch (id) { case SOUND_MIXER_MIC: XtVaSetValues (mic_src, XtNbitmap, circle_on_pixmap, NULL); XtVaSetValues (cd_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (line_src, XtNbitmap, circle_off_pixmap, NULL); break; case SOUND_MIXER_CD: XtVaSetValues (mic_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (cd_src, XtNbitmap, circle_on_pixmap, NULL); XtVaSetValues (line_src, XtNbitmap, circle_off_pixmap, NULL); break; case SOUND_MIXER_LINE: XtVaSetValues (mic_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (cd_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (line_src, XtNbitmap, circle_on_pixmap, NULL); break; default: fprintf (stderr, "Invalid recording source!\n"); } return; } /* * Callback for selecting a new source. * Basically, we set the mixer to the new source, and then * let sync_source_display handle the visual feedback. * (Easier than radioGroups.) */ static void Handle_source(Widget w, XtPointer client_data, XtPointer call_data) { int source = 1 << ((int) client_data); DPRINTF(("Setting recording source to %d (%d)\n",source,(int)client_data)); if (ioctl(mixer_fd,SOUND_MIXER_WRITE_RECSRC,&source) == -1) perror("Error writing mixer recording source"); sync_source_display(); } /* * Quit button callback function */ void Quit(Widget w, XtPointer client_data, XtPointer call_data) { DPRINTF (("Exiting...\n")); exit (0); } static void set_slider(VolumeControl *vcptr, Widget w, int value) { float portion = PORTION(value); int update_needed; DPRINTF (("set_slider: val = %d, portion = %f\n",value,portion)); if (vcptr->locked) { update_needed = (vcptr->volume.left != value); DPRINTF (("set_slider: locked; updating\n")); vcptr->volume.left = vcptr->volume.right = value; XawScrollbarSetThumb(vcptr->leftw, portion, SLIDER_LENGTH); XawScrollbarSetThumb(vcptr->rightw, portion, SLIDER_LENGTH); } else { if (vcptr->leftw == w) { update_needed = (vcptr->volume.left != value); vcptr->volume.left = value; } else { update_needed = (vcptr->volume.right != value); vcptr->volume.right = value; } XawScrollbarSetThumb(w, portion, SLIDER_LENGTH); } /* * If the new value is at a different notch than the current setting, * then inform the mixer, and adopt the setting. * Otherwise, don't waste time setting the mixer. */ if (update_needed) { DPRINTF (("set_slider: updating mixer\n")); if (ioctl(mixer_fd,MIXER_WRITE(vcptr->mixer_id),&vcptr->volume) == -1) perror("Error writing mixer in Handle_slider"); } return; } /* * This is for pushing a slider to MAX or MIN position. * Of questionable utility, yes.. */ static void Handle_slam_slider(Widget w, XtPointer client_data, XtPointer call_data) { int val; VolumeControl *vcptr = client_data; val = (vcptr->leftw == w) ? vcptr->volume.left : vcptr->volume.right; if ((int)call_data < 0) { if (val >= MAX_SOUND_VOL) val = 10*((MAX_SOUND_VOL-1)/10); else val -= 10; if (val < MIN_SOUND_VOL) val = MIN_SOUND_VOL; } else { if (val <= MIN_SOUND_VOL) val = 10*((MIN_SOUND_VOL+9)/10); else val += 10; if (val > MAX_SOUND_VOL) val = MAX_SOUND_VOL; } set_slider(vcptr,w,val); return; } /* * XtNjumpProc callback for volume fader scrollbar widgets. * Great pains are taken to make the slider accurately reflect * the granular mixer setting, without actually querying the mixer * device. (This is faster.) */ static void Handle_slider(Widget w, XtPointer client_data, XtPointer call_data) { int val; VolumeControl *vcptr = client_data; DPRINTF (("Handle_slider got %f\n", *(float*)call_data)); val = (int)(.5 + (SOUND_FULL_SCALE * (1.0 - *(float*)call_data))); if (val > MAX_SOUND_VOL) val = MAX_SOUND_VOL; else if (val < MIN_SOUND_VOL) val = MIN_SOUND_VOL; set_slider(vcptr,w,val); return; } static void sync_sliders(void) { sync_slider(&master); sync_slider(&bass); sync_slider(&treble); sync_slider(&line); sync_slider(&dsp); sync_slider(&fm); sync_slider(&cd); sync_slider(&mic); sync_slider(&reclvl); } /* * Rescan the mixer settings and make all the indicators reflect * the current values. */ static void sync_display(void) { DPRINTF(("Updating..\n")); sync_source_display(); sync_sliders(); } void main (int argc, char **argv) { XtAppContext app_context; int scroll_sep, longway; longway = (argc > 1 && strcmp(argv[1],"-l") == 0); topLevel = XtVaAppInitialize (&app_context, "XMix", /* Application class */ NULL, 0, /* command line option list */ &argc, argv, /* command line args */ NULL, /* for missing app-defaults file */ NULL); /* terminate varargs list */ whole = MW ("whole", formWidgetClass, topLevel, NULL); sliders = MW ("sliders", formWidgetClass, whole, NULL); master.mixer_id = SOUND_MIXER_VOLUME; master.formw = MW ("master_form", formWidgetClass, sliders, NULL); master.labelw = MW ("master_label", labelWidgetClass, master.formw, XtNlabel, "Master", NULL); master.leftw = MW ("master_l", scrollbarWidgetClass, master.formw, SCROLLBAR_RES, XtNfromVert, master.labelw,NULL); master.rightw = MW ("master_r", scrollbarWidgetClass, master.formw, SCROLLBAR_RES, XtNfromHoriz, master.leftw, XtNfromVert, master.labelw, NULL); master.lockw = MW ("master_lock", commandWidgetClass, master.formw, XtNfromVert, master.leftw, NULL); bass.mixer_id = SOUND_MIXER_BASS; bass.formw = MW ("bass_form", formWidgetClass, sliders, XtNfromHoriz, master.formw, NULL); bass.labelw = MW ("bass_label", labelWidgetClass, bass.formw, XtNlabel, "Bass", NULL); bass.leftw = MW ("bass_l", scrollbarWidgetClass, bass.formw, SCROLLBAR_RES, XtNfromVert, bass.labelw, NULL); bass.rightw = MW ("bass_r", scrollbarWidgetClass, bass.formw, SCROLLBAR_RES, XtNfromHoriz, bass.leftw, XtNfromVert, bass.labelw, NULL); bass.lockw = MW ("bass_lock", commandWidgetClass, bass.formw, XtNfromVert, bass.leftw, NULL); treble.mixer_id = SOUND_MIXER_TREBLE; treble.formw = MW ("treble_form", formWidgetClass, sliders, XtNfromHoriz, bass.formw, NULL); treble.labelw = MW ("treble_label", labelWidgetClass, treble.formw, XtNlabel, "Treble", NULL); treble.leftw = MW ("treble_l", scrollbarWidgetClass, treble.formw, SCROLLBAR_RES, XtNfromVert, treble.labelw, NULL); treble.rightw = MW ("treble_r", scrollbarWidgetClass, treble.formw, SCROLLBAR_RES, XtNfromHoriz, treble.leftw, XtNfromVert, treble.labelw, NULL); treble.lockw = MW ("treble_lock", commandWidgetClass, treble.formw, XtNfromVert, treble.leftw, NULL); line.mixer_id = SOUND_MIXER_LINE; line.formw = MW ("line_form", formWidgetClass, sliders, XtNfromHoriz, treble.formw, NULL); line.labelw = MW ("line_label", labelWidgetClass, line.formw, XtNlabel, "Line", NULL); line.leftw = MW ("line_l", scrollbarWidgetClass, line.formw, SCROLLBAR_RES, XtNfromVert, line.labelw, NULL); line.rightw = MW ("line_r", scrollbarWidgetClass, line.formw, SCROLLBAR_RES, XtNfromHoriz, line.leftw, XtNfromVert, line.labelw, NULL); line.lockw = MW ("line_lock", commandWidgetClass, line.formw, XtNfromVert, line.leftw, NULL); dsp.mixer_id = SOUND_MIXER_PCM; dsp.formw = MW ("dsp_form", formWidgetClass, sliders, longway ? XtNfromHoriz : XtNfromVert, longway ? line.formw : master.formw, NULL); dsp.labelw = MW ("dsp_label", labelWidgetClass, dsp.formw, XtNlabel, "DSP", NULL); dsp.leftw = MW ("dsp_l", scrollbarWidgetClass, dsp.formw, SCROLLBAR_RES, XtNfromVert, dsp.labelw, NULL); dsp.rightw = MW ("dsp_r", scrollbarWidgetClass, dsp.formw, SCROLLBAR_RES, XtNfromVert, dsp.labelw, XtNfromHoriz, dsp.leftw, NULL); dsp.lockw = MW ("dsp_lock", commandWidgetClass, dsp.formw, XtNfromVert, dsp.leftw, NULL); fm.mixer_id = SOUND_MIXER_SYNTH; fm.formw = MW ("fm_form", formWidgetClass, sliders, XtNfromHoriz, dsp.formw, longway ? NULL : XtNfromVert, bass.formw, NULL); fm.labelw = MW ("fm_label", labelWidgetClass, fm.formw, XtNlabel, "FM", NULL); fm.leftw = MW ("fm_l", scrollbarWidgetClass, fm.formw, SCROLLBAR_RES, XtNfromVert, fm.labelw, NULL); fm.rightw = MW ("fm_r", scrollbarWidgetClass, fm.formw, SCROLLBAR_RES, XtNfromVert, fm.labelw, XtNfromHoriz, fm.leftw, NULL); fm.lockw = MW ("fm_lock", commandWidgetClass, fm.formw, XtNfromVert, fm.leftw, NULL); cd.mixer_id = SOUND_MIXER_CD; cd.formw = MW ("cd_form", formWidgetClass, sliders, XtNfromHoriz, fm.formw, longway ? NULL : XtNfromVert, treble.formw, NULL); cd.labelw = MW ("cd_label", labelWidgetClass, cd.formw, XtNlabel, "CD", NULL); cd.leftw = MW ("cd_l", scrollbarWidgetClass, cd.formw, SCROLLBAR_RES, XtNfromVert, cd.labelw, NULL); cd.rightw = MW ("cd_r", scrollbarWidgetClass, cd.formw, SCROLLBAR_RES, XtNfromVert, cd.labelw, XtNfromHoriz, cd.leftw, NULL); cd.lockw = MW ("cd_lock", commandWidgetClass, cd.formw, XtNfromVert, cd.leftw, NULL); mic.mixer_id = SOUND_MIXER_MIC; mic.formw = MW ("mic_form", formWidgetClass, sliders, XtNfromHoriz, cd.formw, longway ? NULL : XtNfromVert, line.formw, NULL); mic.labelw = MW ("mic_label", labelWidgetClass, mic.formw, XtNlabel, "Mic", NULL); mic.leftw = MW ("mic_level", scrollbarWidgetClass, mic.formw, SCROLLBAR_RES, XtNfromVert, mic.labelw, NULL); mic.rightw = NULL; mic.lockw = NULL; reclvl.mixer_id = SOUND_MIXER_RECLEV; reclvl.formw = MW ("reclvl_form", formWidgetClass, sliders, XtNfromHoriz, mic.formw, longway ? NULL : XtNfromVert, line.formw, NULL); reclvl.labelw = MW ("reclvl_label", labelWidgetClass, reclvl.formw, XtNlabel, "Reclvl", NULL); reclvl.leftw = MW ("reclvl_level", scrollbarWidgetClass, reclvl.formw, SCROLLBAR_RES, XtNfromVert, reclvl.labelw, NULL); reclvl.rightw = NULL; reclvl.lockw = NULL; buttons = MW ("buttons", formWidgetClass, whole, XtNfromHoriz, sliders, NULL); sources = MW ("sources", formWidgetClass, buttons, XtNfromVert, buttons, NULL); source_label = MW ("source_label", labelWidgetClass, sources, XtNlabel, "Recording Source", NULL); line_src = MW ("line_src", commandWidgetClass, sources, XtNfromVert, source_label, NULL); line_src_label = MW ("line_src_label", labelWidgetClass, sources, XtNlabel, "Line In", XtNfromVert, source_label, XtNfromHoriz, line_src, NULL); mic_src = MW ("mic_src", commandWidgetClass, sources, XtNfromVert, line_src, NULL); mic_src_label = MW ("mic_src_label", labelWidgetClass, sources, XtNlabel, "Microphone", XtNfromVert, line_src, XtNfromHoriz, mic_src, NULL); cd_src = MW ("cd_src", commandWidgetClass, sources, XtNfromVert, mic_src, NULL); cd_src_label = MW ("cd_src_label", labelWidgetClass, sources, XtNlabel, "CD", XtNfromVert, mic_src, XtNfromHoriz, cd_src, NULL); quit = MW ("quit", commandWidgetClass, buttons, XtNfromVert, sources, XtNlabel, "Quit", XtNwidth, 50, XtNheight, 20, NULL); XtVaGetValues (mic.leftw, XtNwidth, ¢ering_width, NULL); CENTER (mic.labelw); XtVaGetValues (reclvl.leftw, XtNwidth, ¢ering_width, NULL); CENTER (reclvl.labelw); XtVaGetValues (master.formw, XtNhorizDistance, &scroll_sep, NULL); XtVaGetValues (master.leftw, XtNwidth, ¢ering_width, NULL); centering_width = centering_width * 2 + scroll_sep; CENTER (master.labelw); CENTER (bass.labelw); CENTER (treble.labelw); CENTER (line.labelw); CENTER (dsp.labelw); CENTER (fm.labelw); CENTER (cd.labelw); XtAddEventHandler (topLevel, EnterWindowMask, FALSE, (XtEventHandler) sync_display, NULL); XtAddCallback (quit, XtNcallback, Quit, 0 /* client_data */ ); XtAddCallback (master.leftw, XtNjumpProc, Handle_slider, &master); XtAddCallback (master.leftw, XtNscrollProc, Handle_slam_slider, &master); XtAddCallback (master.rightw, XtNjumpProc, Handle_slider, &master); XtAddCallback (master.rightw, XtNscrollProc, Handle_slam_slider, &master); XtAddCallback (master.lockw, XtNcallback, Handle_lock, &master); XtAddCallback (bass.leftw, XtNjumpProc, Handle_slider, &bass); XtAddCallback (bass.leftw, XtNscrollProc, Handle_slam_slider, &bass); XtAddCallback (bass.rightw, XtNjumpProc, Handle_slider, &bass); XtAddCallback (bass.rightw, XtNscrollProc, Handle_slam_slider, &bass); XtAddCallback (bass.lockw, XtNcallback, Handle_lock, &bass); XtAddCallback (treble.leftw, XtNjumpProc, Handle_slider, &treble); XtAddCallback (treble.leftw, XtNscrollProc, Handle_slam_slider, &treble); XtAddCallback (treble.rightw, XtNjumpProc, Handle_slider, &treble); XtAddCallback (treble.rightw, XtNscrollProc, Handle_slam_slider, &treble); XtAddCallback (treble.lockw, XtNcallback, Handle_lock, &treble); XtAddCallback (line.leftw, XtNjumpProc, Handle_slider, &line); XtAddCallback (line.leftw, XtNscrollProc, Handle_slam_slider, &line); XtAddCallback (line.rightw, XtNjumpProc, Handle_slider, &line); XtAddCallback (line.rightw, XtNscrollProc, Handle_slam_slider, &line); XtAddCallback (line.lockw, XtNcallback, Handle_lock, &line); XtAddCallback (dsp.leftw, XtNjumpProc, Handle_slider, &dsp); XtAddCallback (dsp.leftw, XtNscrollProc, Handle_slam_slider, &dsp); XtAddCallback (dsp.rightw, XtNjumpProc, Handle_slider, &dsp); XtAddCallback (dsp.rightw, XtNscrollProc, Handle_slam_slider, &dsp); XtAddCallback (dsp.lockw, XtNcallback, Handle_lock, &dsp); XtAddCallback (fm.leftw, XtNjumpProc, Handle_slider, &fm); XtAddCallback (fm.leftw, XtNscrollProc, Handle_slam_slider, &fm); XtAddCallback (fm.rightw, XtNjumpProc, Handle_slider, &fm); XtAddCallback (fm.rightw, XtNscrollProc, Handle_slam_slider, &fm); XtAddCallback (fm.lockw, XtNcallback, Handle_lock, &fm); XtAddCallback (cd.leftw, XtNjumpProc, Handle_slider, &cd); XtAddCallback (cd.leftw, XtNscrollProc, Handle_slam_slider, &cd); XtAddCallback (cd.rightw, XtNjumpProc, Handle_slider, &cd); XtAddCallback (cd.rightw, XtNscrollProc, Handle_slam_slider, &cd); XtAddCallback (cd.lockw, XtNcallback, Handle_lock, &cd); XtAddCallback (mic.leftw, XtNjumpProc, Handle_slider, &mic); XtAddCallback (mic.leftw, XtNscrollProc, Handle_slam_slider, &mic); XtAddCallback (reclvl.leftw, XtNjumpProc, Handle_slider, &reclvl); XtAddCallback (reclvl.leftw, XtNscrollProc, Handle_slam_slider, &reclvl); XtAddCallback (line_src, XtNcallback, Handle_source, (XtPointer)SOUND_MIXER_LINE); XtAddCallback (mic_src, XtNcallback, Handle_source, (XtPointer)SOUND_MIXER_MIC); XtAddCallback (cd_src, XtNcallback, Handle_source, (XtPointer)SOUND_MIXER_CD); install_pixmaps (); /* Open the mixer device */ mixer_fd = open ("/dev/mixer", O_RDWR, 0); if (mixer_fd < 0) perror ("Error opening mixer device"), exit (1); /* * Match the display settings to the current mixer configuration. */ sync_display(); /* * Pick some reasonable lock settings to start with. * Two equal volume levels start off with that pair linked. */ master.locked = (master.volume.left == master.volume.right); bass.locked = (bass.volume.left == bass.volume.right); treble.locked = (treble.volume.left == treble.volume.right); line.locked = (line.volume.left == line.volume.right); dsp.locked = (dsp.volume.left == dsp.volume.right); fm.locked = (fm.volume.left == fm.volume.right); cd.locked = (cd.volume.left == cd.volume.right); mic.locked = 0; reclvl.locked = 0; /* * Update the lock bitmaps to reflect linking */ sync_lock(&master); sync_lock(&bass); sync_lock(&treble); sync_lock(&line); sync_lock(&dsp); sync_lock(&fm); sync_lock(&cd); XtRealizeWidget (topLevel); /* Action! */ XtAppMainLoop (app_context); /* Loop for events */ } xmix-2.1.orig/square_empty.bit100644 1751 1751 437 5477274256 15205 0ustar osd1000osd1000#define square_empty_width 15 #define square_empty_height 15 static char square_empty_bits[] = { 0xff, 0x7f, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0xff, 0x7f}; xmix-2.1.orig/square_with_x.bit100644 1751 1751 442 5477274273 15344 0ustar osd1000osd1000#define square_with_x_width 15 #define square_with_x_height 15 static char square_with_x_bits[] = { 0xff, 0x7f, 0x01, 0x40, 0x0d, 0x58, 0x1d, 0x5c, 0x39, 0x4e, 0x71, 0x47, 0xe1, 0x43, 0xc1, 0x41, 0xe1, 0x43, 0x71, 0x47, 0x39, 0x4e, 0x1d, 0x5c, 0x0d, 0x58, 0x01, 0x40, 0xff, 0x7f}; xmix-2.1.orig/xmix.c-orig100644 1751 1751 55232 5477276202 14112 0ustar osd1000osd1000/*====================================================================== xmix: X interface to the Sound Blaster mixer. [ This file is a part of SBlast-BSD-1.5 ] Steve Haehnichen xmix.c,v 1.5 1992/09/14 03:17:21 steve Exp Copyright (C) 1992 Steve Haehnichen. 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; either version 1, or (at your option) any later version. 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. 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. * xmix.c,v * Revision 1.5 1992/09/14 03:17:21 steve * Released with driver v1.5. * Converted over to stereo CD levels. * * Revision 1.4 1992/06/12 22:33:39 steve * Much better. * Moved many resources into source code. * Ready for release in v1.4 * * Revision 1.3 1992/06/08 04:36:26 steve * Works fine. * ======================================================================*/ #include #include #include /* * Include files required for all Toolkit programs */ #include /* Intrinsics Definitions */ #include /* Standard Name-String definitions */ #include /* Shell Definitions */ /* * Public include file for widgets we actually use in this file. */ #include /* Athena Command Widget */ #include #include #include #include #include #include "xmix.icon.bit" /* The icon, of course */ #include "stereo.bit" /* Stereo sound icon */ #include "mono.bit" /* Mono sound icon */ #include "locked.bit" /* L & R locked together (From dirt) */ #include "unlocked.bit" /* L & R free to be different (From dirt)*/ #include "circle_on.bit" #include "circle_off.bit" #include "square_empty.bit" #include "square_with_x.bit" /* * Sound Blaster include file for ioctls and such */ #include /* * Here's the debugging macro I use here and there, so I can turn * them all on or off in one place. */ /* #define DEBUG */ #ifdef DEBUG #define DPRINTF(x) printf x #else #define DPRINTF(x) #endif /* * Handy macros to update the mixer. */ #define SET_PARAMS \ do { \ if (ioctl (mixer_fd, MIXER_IOCTL_SET_PARAMS, ¶ms) == -1) \ { \ perror ("Error setting Mixer parameters"); \ exit (1); \ } \ } while (0) #define SET_LEVELS \ do { \ if (ioctl (mixer_fd, MIXER_IOCTL_SET_LEVELS, &levels) == -1) \ { \ perror ("Error setting Mixer levels"); \ exit (1); \ } \ } while (0) /* * Some of these Xt names are too long for nice formatting */ #define MW XtVaCreateManagedWidget #define PORTION(val) (1.0 - (float)val / 15.0) #define MK_BITMAP(bits, width, height) \ XCreateBitmapFromData (XtDisplay (topLevel), \ RootWindowOfScreen (XtScreen (topLevel)),\ bits, width, height) #define SCROLLBAR_RES XtNwidth, 23, XtNheight, 100 #define CENTER(widg) XtVaSetValues (widg, XtNwidth,\ centering_width, NULL) struct slider_info /* Client data structure for faders */ { Widget other_side; BYTE *volume; FLAG *linked; }; struct lock_info /* Client data structure for locks */ { struct stereo_vol *pair; FLAG *linked; }; /* * I'm lazy. Everything is global today. */ Pixmap icon_pixmap, stereo_pixmap, mono_pixmap, locked_pixmap, unlocked_pixmap; Pixmap circle_on_pixmap, circle_off_pixmap; Pixmap square_empty_pixmap, square_with_x_pixmap; Widget topLevel, quit, whole, buttons, sliders; Widget master_l, master_r, line_l, line_r, dsp_l, dsp_r; Widget fm_l, fm_r, cd_l, cd_r, mic_level; Widget master_form, line_form, dsp_form, fm_form, cd_form, mic_form; Widget master_label, line_label, dsp_label, fm_label, cd_label, mic_label; Widget master_lock, line_lock, dsp_lock, fm_lock, cd_lock; struct lock_info master_lock_info, line_lock_info; struct lock_info dsp_lock_info, fm_lock_info, cd_lock_info; Widget channels, channels_form; Widget filters, out_filt, in_filt, filt_freq, filters_label; Widget out_filt_label, in_filt_label; Widget sources, line_src, mic_src, cd_src, source_label; Widget line_src_label, mic_src_label, cd_src_label; int centering_width; int mixer_fd; struct sb_mixer_params params; struct sb_mixer_levels levels; struct slider_info master_info_l, line_info_l, dsp_info_l, fm_info_l; struct slider_info master_info_r, line_info_r, dsp_info_r, fm_info_r; struct slider_info cd_info_l, cd_info_r, mic_info; FLAG master_linked, line_linked, dsp_linked, fm_linked, cd_linked; void install_pixmaps (void); void sync_display (void); void sync_channel_display (void); void sync_filter_display (void); void sync_source_display (void); void Quit (Widget w, XtPointer client_data, XtPointer call_data); void Handle_slider (Widget w, XtPointer client_data, XtPointer call_data); void Handle_slam_slider (Widget w, XtPointer client_data, XtPointer call_data); void Handle_toggle (Widget w, XtPointer client_data, XtPointer call_data); void Handle_source (Widget w, XtPointer client_data, XtPointer call_data); void Handle_lock (Widget w, XtPointer client_data, XtPointer call_data); void sync_lock (int flag, Widget w); void equalize (struct stereo_vol *lev); void sync_sliders (void); void sync_params_display (void); void main (int argc, char **argv) { XtAppContext app_context; int scroll_sep; topLevel = XtVaAppInitialize (&app_context, "XMix", /* Application class */ NULL, 0, /* command line option list */ &argc, argv, /* command line args */ NULL, /* for missing app-defaults file */ NULL); /* terminate varargs list */ whole = MW("whole", formWidgetClass, topLevel, NULL); sliders = MW("sliders", formWidgetClass, whole, NULL); master_form = MW ("master_form", formWidgetClass, sliders, NULL); master_label = MW ("master_label", labelWidgetClass, master_form, XtNlabel, "Master", NULL); master_l = MW ("master_l", scrollbarWidgetClass, master_form, SCROLLBAR_RES, XtNfromVert, master_label, NULL); master_r = MW ("master_r", scrollbarWidgetClass, master_form, SCROLLBAR_RES, XtNfromHoriz, master_l, XtNfromVert, master_label, NULL); master_info_l.other_side = master_r; master_info_r.other_side = master_l; master_info_l.volume = &levels.master.l; master_info_r.volume = &levels.master.r; master_info_l.linked = master_info_r.linked = &master_linked; master_lock = MW ("master_lock", commandWidgetClass, master_form, XtNfromVert, master_l, NULL); master_lock_info.linked = &master_linked; master_lock_info.pair = &levels.master; line_form = MW ("line_form", formWidgetClass, sliders, XtNfromHoriz, master_form, NULL); line_label = MW ("line_label", labelWidgetClass, line_form, XtNlabel, "Line", NULL); line_l = MW ("line_l", scrollbarWidgetClass, line_form, SCROLLBAR_RES, XtNfromVert, line_label, NULL); line_r = MW ("line_r", scrollbarWidgetClass, line_form, SCROLLBAR_RES, XtNfromHoriz, line_l, XtNfromVert, line_label, NULL); line_lock = MW ("line_lock", commandWidgetClass, line_form, XtNfromVert, line_l, NULL); line_info_l.other_side = line_r; line_info_r.other_side = line_l; line_info_l.volume = &levels.line.l; line_info_r.volume = &levels.line.r; line_info_l.linked = line_info_r.linked = &line_linked; line_lock_info.linked = &line_linked; line_lock_info.pair = &levels.line; dsp_form = MW ("dsp_form", formWidgetClass, sliders, XtNfromHoriz, line_form, NULL); dsp_label = MW ("dsp_label", labelWidgetClass, dsp_form, XtNlabel, "DSP", NULL); dsp_l = MW ("dsp_l", scrollbarWidgetClass, dsp_form, SCROLLBAR_RES, XtNfromVert, dsp_label, NULL); dsp_r = MW ("dsp_r", scrollbarWidgetClass, dsp_form, SCROLLBAR_RES, XtNfromVert, dsp_label, XtNfromHoriz, dsp_l, NULL); dsp_lock = MW ("dsp_lock", commandWidgetClass, dsp_form, XtNfromVert, dsp_l, NULL); dsp_info_l.other_side = dsp_r; dsp_info_r.other_side = dsp_l; dsp_info_l.volume = &levels.voc.l; dsp_info_r.volume = &levels.voc.r; dsp_info_l.linked = dsp_info_r.linked = &dsp_linked; dsp_lock_info.linked = &dsp_linked; dsp_lock_info.pair = &levels.voc; fm_form = MW ("fm_form", formWidgetClass, sliders, XtNfromHoriz, dsp_form, NULL); fm_label = MW ("fm_label", labelWidgetClass, fm_form, XtNlabel, "FM", NULL); fm_l = MW ("fm_l", scrollbarWidgetClass, fm_form, SCROLLBAR_RES, XtNfromVert, fm_label, NULL); fm_r = MW ("fm_r", scrollbarWidgetClass, fm_form, SCROLLBAR_RES, XtNfromVert, fm_label, XtNfromHoriz, fm_l, NULL); fm_lock = MW ("fm_lock", commandWidgetClass, fm_form, XtNfromVert, fm_l, NULL); fm_info_l.other_side = fm_r; fm_info_r.other_side = fm_l; fm_info_l.volume = &levels.fm.l; fm_info_r.volume = &levels.fm.r; fm_info_l.linked = fm_info_r.linked = &fm_linked; fm_lock_info.linked = &fm_linked; fm_lock_info.pair = &levels.fm; cd_form = MW ("cd_form", formWidgetClass, sliders, XtNfromHoriz, fm_form, NULL); cd_label = MW ("cd_label", labelWidgetClass, cd_form, XtNlabel, "CD", NULL); cd_l = MW ("cd_l", scrollbarWidgetClass, cd_form, SCROLLBAR_RES, XtNfromVert, cd_label, NULL); cd_r = MW ("cd_r", scrollbarWidgetClass, cd_form, SCROLLBAR_RES, XtNfromVert, cd_label, XtNfromHoriz, cd_l, NULL); cd_lock = MW ("cd_lock", commandWidgetClass, cd_form, XtNfromVert, cd_l, NULL); cd_info_l.other_side = cd_r; cd_info_r.other_side = cd_l; cd_info_l.volume = &levels.cd.l; cd_info_r.volume = &levels.cd.r; cd_info_l.linked = cd_info_r.linked = &cd_linked; cd_lock_info.linked = &cd_linked; cd_lock_info.pair = &levels.cd; mic_form = MW ("mic_form", formWidgetClass, sliders, XtNfromHoriz, cd_form, NULL); mic_label = MW ("mic_label", labelWidgetClass, mic_form, XtNlabel, "Mic", NULL); mic_level = MW ("mic_level", scrollbarWidgetClass, mic_form, SCROLLBAR_RES, XtNfromVert, mic_label, NULL); mic_info.linked = FALSE; mic_info.volume = &levels.mic; buttons = MW ("buttons", formWidgetClass, whole, XtNfromVert, sliders, NULL); channels = MW ("channels", commandWidgetClass, buttons, XtNwidth, stereo_width, NULL); quit = MW ("quit", commandWidgetClass, buttons, XtNfromVert, channels, XtNlabel, "Quit", XtNwidth, 50, XtNheight, 20, NULL); filters = MW ("filters", formWidgetClass, buttons, XtNfromHoriz, channels, NULL); filters_label = MW ("filters_label", labelWidgetClass, filters, XtNlabel, "Filters", NULL); in_filt = MW ("in_filt", commandWidgetClass, filters, XtNfromVert, filters_label, NULL); in_filt_label = MW ("in_filt_label", labelWidgetClass, filters, XtNlabel, "Input", XtNfromHoriz, in_filt, XtNfromVert, filters_label, NULL); out_filt = MW ("out_filt", commandWidgetClass, filters, XtNfromVert, in_filt, NULL); out_filt_label = MW ("out_filt_label", labelWidgetClass, filters, XtNfromHoriz, out_filt, XtNfromVert, in_filt, XtNlabel, "Output", NULL); filt_freq = MW ("filt_freq", commandWidgetClass, filters, XtNfromVert, filters_label, XtNfromHoriz, in_filt_label, NULL); sources = MW ("sources", formWidgetClass, buttons, XtNfromHoriz, filters, NULL); source_label = MW ("source_label", labelWidgetClass, sources, XtNlabel, "Recording Source", NULL); line_src = MW ("line_src", commandWidgetClass, sources, XtNfromVert, source_label, NULL); line_src_label = MW ("line_src_label", labelWidgetClass, sources, XtNlabel, "Line In", XtNfromVert, source_label, XtNfromHoriz, line_src, NULL); mic_src = MW ("mic_src", commandWidgetClass, sources, XtNfromVert, line_src, NULL); mic_src_label = MW ("mic_src_label", labelWidgetClass, sources, XtNlabel, "Microphone", XtNfromVert, line_src, XtNfromHoriz, mic_src, NULL); cd_src = MW ("cd_src", commandWidgetClass, sources, XtNfromVert, mic_src, NULL); cd_src_label = MW ("cd_src_label", labelWidgetClass, sources, XtNlabel, "CD", XtNfromVert, mic_src, XtNfromHoriz, cd_src, NULL); XtVaGetValues (mic_level, XtNwidth, ¢ering_width, NULL); CENTER (mic_label); XtVaGetValues (master_form, XtNhorizDistance, &scroll_sep, NULL); XtVaGetValues (master_l, XtNwidth, ¢ering_width, NULL); centering_width = centering_width * 2 + scroll_sep; CENTER (master_label); CENTER (line_label); CENTER (dsp_label); CENTER (fm_label); CENTER (cd_label); XtAddEventHandler (topLevel, EnterWindowMask, FALSE, (XtEventHandler) sync_display, NULL); XtAddCallback (quit, XtNcallback, Quit, 0 /* client_data */ ); XtAddCallback (master_l, XtNjumpProc, Handle_slider, &master_info_l); XtAddCallback (master_l, XtNscrollProc, Handle_slam_slider, 0); XtAddCallback (master_r, XtNjumpProc, Handle_slider, &master_info_r); XtAddCallback (master_r, XtNscrollProc, Handle_slam_slider, 0); XtAddCallback (line_l, XtNjumpProc, Handle_slider, &line_info_l); XtAddCallback (line_l, XtNscrollProc, Handle_slam_slider, 0); XtAddCallback (line_r, XtNjumpProc, Handle_slider, &line_info_r); XtAddCallback (line_r, XtNscrollProc, Handle_slam_slider, 0); XtAddCallback (dsp_l, XtNjumpProc, Handle_slider, &dsp_info_l); XtAddCallback (dsp_l, XtNscrollProc, Handle_slam_slider, 0); XtAddCallback (dsp_r, XtNjumpProc, Handle_slider, &dsp_info_r); XtAddCallback (dsp_r, XtNscrollProc, Handle_slam_slider, 0); XtAddCallback (fm_l, XtNjumpProc, Handle_slider, &fm_info_l); XtAddCallback (fm_l, XtNscrollProc, Handle_slam_slider, 0); XtAddCallback (fm_r, XtNjumpProc, Handle_slider, &fm_info_r); XtAddCallback (fm_r, XtNscrollProc, Handle_slam_slider, 0); XtAddCallback (cd_l, XtNjumpProc, Handle_slider, &cd_info_l); XtAddCallback (cd_l, XtNscrollProc, Handle_slam_slider, 0); XtAddCallback (cd_r, XtNjumpProc, Handle_slider, &cd_info_r); XtAddCallback (cd_r, XtNscrollProc, Handle_slam_slider, 0); XtAddCallback (mic_level, XtNjumpProc, Handle_slider, &mic_info); XtAddCallback (mic_level, XtNscrollProc, Handle_slam_slider, 0); XtAddCallback (channels, XtNcallback, Handle_toggle, ¶ms.dsp_stereo); XtAddCallback (in_filt, XtNcallback, Handle_toggle, ¶ms.filter_input); XtAddCallback (out_filt, XtNcallback, Handle_toggle, ¶ms.filter_output); XtAddCallback (filt_freq, XtNcallback, Handle_toggle, ¶ms.hifreq_filter); XtAddCallback (line_src, XtNcallback, Handle_source, (XtPointer)SRC_LINE); XtAddCallback (mic_src, XtNcallback, Handle_source, (XtPointer)SRC_MIC); XtAddCallback (cd_src, XtNcallback, Handle_source, (XtPointer)SRC_CD); XtAddCallback (master_lock, XtNcallback, Handle_lock, &master_lock_info); XtAddCallback (line_lock, XtNcallback, Handle_lock, &line_lock_info); XtAddCallback (fm_lock, XtNcallback, Handle_lock, &fm_lock_info); XtAddCallback (cd_lock, XtNcallback, Handle_lock, &cd_lock_info); XtAddCallback (dsp_lock, XtNcallback, Handle_lock, &dsp_lock_info); install_pixmaps (); /* Open the mixer device */ mixer_fd = open ("/dev/mixer", O_RDWR, 0); if (mixer_fd < 0) perror ("Error opening mixer device"), exit (1); /* * Match the display settings to the current mixer configuration. */ sync_display(); /* * Pick some reasonable lock settings to start with. * Two equal volume levels start off with that pair linked. */ master_linked = (levels.master.l == levels.master.r); line_linked = (levels.line.l == levels.line.r); dsp_linked = (levels.voc.l == levels.voc.r); fm_linked = (levels.fm.l == levels.fm.r); cd_linked = (levels.cd.l == levels.cd.r); /* * Update the lock bitmaps to reflect linking */ sync_lock (master_linked, master_lock); sync_lock (line_linked, line_lock); sync_lock (dsp_linked, dsp_lock); sync_lock (fm_linked, fm_lock); sync_lock (cd_linked, cd_lock); XtRealizeWidget (topLevel); /* Action! */ XtAppMainLoop (app_context); /* Loop for events */ } /* * Convert all the pixmap data into Pixmap objects. */ void install_pixmaps (void) { /* The icon bitmap */ icon_pixmap = MK_BITMAP (xmix_bits, xmix_width, xmix_height); XtVaSetValues (topLevel, XtNiconPixmap, icon_pixmap, NULL); stereo_pixmap = MK_BITMAP (stereo_bits, stereo_width, stereo_height); mono_pixmap = MK_BITMAP (mono_bits, mono_width, mono_height); locked_pixmap = MK_BITMAP (locked_bits, locked_width, locked_height); unlocked_pixmap = MK_BITMAP (unlocked_bits, unlocked_width, unlocked_height); circle_on_pixmap = MK_BITMAP (circle_on_bits, circle_on_width, circle_on_height); circle_off_pixmap = MK_BITMAP (circle_off_bits, circle_off_width, circle_off_height); square_empty_pixmap = MK_BITMAP (square_empty_bits, square_empty_width, square_empty_height); square_with_x_pixmap = MK_BITMAP (square_with_x_bits, square_with_x_width, square_with_x_height); } /* * Rescan the mixer settings and make all the indicators reflect * the current values. */ void sync_display (void) { DPRINTF(("Updating..\n")); if (ioctl (mixer_fd, MIXER_IOCTL_READ_LEVELS, &levels) < 0 || ioctl (mixer_fd, MIXER_IOCTL_READ_PARAMS, ¶ms) < 0) perror ("Error reading mixer settings"), exit(1); sync_params_display (); sync_source_display (); sync_sliders (); } void sync_sliders (void) { XawScrollbarSetThumb (master_l, PORTION(levels.master.l), -1.0); XawScrollbarSetThumb (master_r, PORTION(levels.master.r), -1.0); XawScrollbarSetThumb (dsp_l, PORTION(levels.voc.l), -1.0); XawScrollbarSetThumb (dsp_r, PORTION(levels.voc.r), -1.0); XawScrollbarSetThumb (fm_l, PORTION(levels.fm.l), -1.0); XawScrollbarSetThumb (fm_r, PORTION(levels.fm.r), -1.0); XawScrollbarSetThumb (line_l, PORTION(levels.line.l), -1.0); XawScrollbarSetThumb (line_r, PORTION(levels.line.r), -1.0); XawScrollbarSetThumb (cd_l, PORTION(levels.cd.l), -1.0); XawScrollbarSetThumb (cd_r, PORTION(levels.cd.r), -1.0); XawScrollbarSetThumb (mic_level, (1.0 - (float)levels.mic / 7.0), -1.0); } void sync_lock (int flag, Widget w) { if (flag) XtVaSetValues (w, XtNbitmap, locked_pixmap, NULL); else XtVaSetValues (w, XtNbitmap, unlocked_pixmap, NULL); CENTER (w); } void Handle_lock (Widget w, XtPointer client_data, XtPointer call_data) { struct lock_info *info = client_data; *info->linked = !(*info->linked); if (info->linked && info->pair->l != info->pair->r) { info->pair->l = info->pair->r = ((info->pair->l + info->pair->r)/2) | 1; SET_LEVELS; sync_sliders(); } sync_lock (*info->linked, w); } /* * Callback function for any Command widget that toggles bitmaps. * (filters and stereo switches for now.) */ void Handle_toggle (Widget w, XtPointer client_data, XtPointer call_data) { FLAG *flip = client_data; *flip = !*flip; SET_PARAMS; sync_params_display(); } /* * Match the filter and stereo indicators to the mixer values. */ void sync_params_display (void) { XtVaSetValues (channels, XtNbitmap, params.dsp_stereo ? stereo_pixmap : mono_pixmap, NULL); XtVaSetValues (filt_freq, XtNlabel, params.hifreq_filter ? "Hi Freq " : "Low Freq", NULL); XtVaSetValues (in_filt, XtNbitmap, params.filter_input ? square_with_x_pixmap : square_empty_pixmap, NULL); XtVaSetValues (out_filt, XtNbitmap, params.filter_output ? square_with_x_pixmap : square_empty_pixmap, NULL); } /* * Callback for selecting a new source. * Basically, we set the mixer to the new source, and then * let sync_source_display handle the visual feedback. * (Easier than radioGroups.) */ void Handle_source (Widget w, XtPointer client_data, XtPointer call_data) { params.record_source = (int) client_data; SET_PARAMS; sync_source_display (); } /* * Match the shown button to the mixer's idea of the recording source. */ void sync_source_display (void) { switch (params.record_source) { case SRC_MIC: XtVaSetValues (mic_src, XtNbitmap, circle_on_pixmap, NULL); XtVaSetValues (cd_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (line_src, XtNbitmap, circle_off_pixmap, NULL); break; case SRC_CD: XtVaSetValues (mic_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (cd_src, XtNbitmap, circle_on_pixmap, NULL); XtVaSetValues (line_src, XtNbitmap, circle_off_pixmap, NULL); break; case SRC_LINE: XtVaSetValues (mic_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (cd_src, XtNbitmap, circle_off_pixmap, NULL); XtVaSetValues (line_src, XtNbitmap, circle_on_pixmap, NULL); break; default: fprintf (stderr, "Invalid recording source!\n"); exit(1); } } /* * Quit button callback function */ void Quit (Widget w, XtPointer client_data, XtPointer call_data) { DPRINTF (("Exiting...\n")); exit (0); } /* * This is for pushing a slider to MAX or MIN position. * Of questionable utility, yes.. */ void Handle_slam_slider (Widget w, XtPointer client_data, XtPointer call_data) { float pos; pos = (float)((int)call_data < 0); XtCallCallbacks (w, XtNjumpProc, &pos); } /* * XtNjumpProc callback for volume fader scrollbar widgets. * Great pains are taken to make the slider accurately reflect * the granular mixer setting, without actually querying the mixer * device. (This is faster.) */ void Handle_slider (Widget w, XtPointer client_data, XtPointer call_data) { int val; struct slider_info *info = client_data; static FLAG child = 0; /* * The mixer value is 0-15, with the low bit always set. (stupid) */ DPRINTF (("Got %f\n", *(float*)call_data)); val = (int)(.5 + (15.0 * (1.0 - *(float*)call_data))) | 1; /* * (Microphone level is even worse: 0-7, with the low bit set.) * Shove the Thumb to the granular value that we will actually get. */ if (w == mic_level) { val = (val / 2) | 1; XawScrollbarSetThumb (w, (1.0 - (float)val / 7.0), -1.0); } else XawScrollbarSetThumb (w, PORTION(val), -1.0); /* * If we are linked to the other channel, and we are the first * to do this, then call the other side's callback giving and * identical thumb position. */ if (info->linked && *info->linked == TRUE) { if (!child) { child = TRUE; XtCallCallbacks (info->other_side, XtNjumpProc, call_data); child = FALSE; } } /* * If the new value is at a different notch than the current setting, * then inform the mixer, and adopt the setting. * Otherwise, don't waste time setting the mixer. */ if (*info->volume != val) { *info->volume = val; SET_LEVELS; } }