📄 interactive.c
字号:
/* $Aumix: aumix/src/interactive.c,v 1.7 2002/10/29 21:27:52 trevor Exp $ * interactive.c: functions used in all interactive modes * copyright (c) 1993, 1996-2002 the authors--see AUTHORS file * * This file is part of aumix. * * Aumix 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 2 of the License, or (at your option) any later * version. * * Aumix 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 * aumix; if not, write to the Free Software Foundation, Inc., 59 Temple Place, * Suite 330, Boston, MA 02111-1307, USA. */#include "common.h"#if defined (HAVE_CURSES) || defined (HAVE_GTK) || defined (HAVE_GTK1)#include "interactive.h"#ifdef HAVE_CURSES#include "curses.h"#endif /* HAVE_CURSES */#if defined (HAVE_GTK) || defined (HAVE_GTK1)#include "gtk.h"#endif /* HAVE_GTK || HAVE_GTK1 */void AumixSignalHandler(int signal_number){/* Handle SIGALRM. */ signal(SIGALRM, AumixSignalHandler); /* Reset the signal handler. */#ifdef HAVE_CURSES if (interactive == IN_CURSES) WakeUpCurses();#endif#if defined (HAVE_GTK) || defined (HAVE_GTK1) if (interactive == IN_GTK) WakeUpGTK();#endif alarm(REFRESH_PERIOD);}void InitScreen(void){#ifdef HAVE_CURSES if (interactive == IN_CURSES) InitScreenCurses();#endif /* HAVE_CURSES */#if defined (HAVE_GTK) || defined (HAVE_GTK1) if (interactive == IN_GTK) InitScreenGTK();#endif /* HAVE_GTK */}void KeysBox(void){#ifdef HAVE_CURSES if (interactive == IN_CURSES) KeysBoxCurses();#endif /* HAVE_CURSES */#if defined (HAVE_GTK) || defined (HAVE_GTK1)/* if (interactive == IN_GTK) KeysBoxGTK(); */#endif /* HAVE_GTK || HAVE_GTK1 */}void RefreshAllSettings(void){ int dev; for (dev = 0; dev < SOUND_MIXER_NRDEVICES; dev++) { if ((1 << dev) & devmask) { EraseLevel(dev); RedrawBalance(dev); DrawLevel(dev); } /* print record/play indicators */ if ((1 << dev) & recmask) DrawRecordPlay(dev); }}void RefreshNewSettings(void)/* Periodically redraws the screen, in case another process has changed the mixer settings. */{ int dev, ii = 0; for (dev = 0; dev < SOUND_MIXER_NRDEVICES; dev++) { /* record/play indicators */ if ((1 << dev) & recmask) { ErrorExitWarn(ReadRecSrc(), 'e'); /* Redraw if the setting changed. */ if (our_recplay[dev] - recsrc) DrawRecordPlay(dev); our_recplay[dev] = recsrc; } if ((1 << dev) & devmask) { ErrorExitWarn(ReadLevel(dev, &ii), 'e'); if (ii - ourlevel[dev]) { /* Has the setting changed? */ EraseLevel(dev); RedrawBalance(dev); DrawLevel(dev); } } if ((1 << dev) & recmask) DrawRecordPlay(dev); ourlevel[dev] = ii; }}void Muting(int device, int newstate)/* Change muted, normal, and solo states. */{/* device: current device * mutestate: 0 for no mute, -1 for global mute, or set to soloing device * newstate: new value for mutestate */ switch (newstate) { case MUTE_OFF: switch (mutestate) { case MUTE_OFF: return; break; case MUTE_GLOBAL: UnmuteAll(); break; case MUTE_ONLY: UnmuteAll(); break; } break; case MUTE_GLOBAL: switch (mutestate) { case MUTE_OFF: StoreAll(); MuteAll(); break; case MUTE_GLOBAL: return; break; case MUTE_ONLY: MuteAll(); break; } break; case MUTE_ONLY: switch (mutestate) { case MUTE_OFF: StoreAll(); MuteAllButOne(device); break; case MUTE_GLOBAL: UnmuteOne(device); break; case MUTE_ONLY: MuteAllButOne(device); UnmuteOne(device); } } RefreshAllSettings(); mutestate = newstate;#ifdef HAVE_CURSES if (interactive == IN_CURSES) ShowMutingCurses();#endif /* HAVE_CURSES */ mutestate = newstate;}void ToggleMuting(void)/* Switch between no muting and global muting; do nothing if soloing (MUTE_ONLY). */{ switch (mutestate) { case MUTE_OFF: Muting(MUTE_NO_DEVICE, MUTE_GLOBAL); break; case MUTE_GLOBAL: Muting(MUTE_NO_DEVICE, MUTE_OFF); break; }}void MuteAll(void)/* Set all channels to zero. */{ int dev; for (dev = 0; dev < SOUND_MIXER_NRDEVICES; dev++) MuteOne(dev);}void UnmuteAll(void){/* Restore all from mutelevel array. */ int dev; for (dev = 0; dev < SOUND_MIXER_NRDEVICES; dev++) UnmuteOne(dev);}void StoreAll(void)/* Read all channels into mutelevel array. */{ int dev; for (dev = 0; dev < SOUND_MIXER_NRDEVICES; dev++) StoreOne(dev);}void StoreOne(int device)/* Read one channel into mutelevel array. */{ if ((1 << device) & devmask) ErrorExitWarn(ReadLevel(device, &mutelevel[device]), 'e');}void MuteAllButOne(int device)/* Set all channels except one to zero. */{ int ii; for (ii = 0; ii < SOUND_MIXER_NRDEVICES; ii++) if (device != ii) MuteOne(ii);}void MuteOne(int device)/* Set one channel to zero. */{ const int null = 0; if ((1 << device) & devmask) ErrorExitWarn(WriteLevel(device, null), 'e');}void UnmuteAllButOne(int device){/* Restore all but current from mutelevel array. */ int ii; for (ii = 0; ii < SOUND_MIXER_NRDEVICES; ii++) if (device != ii) UnmuteOne(ii);}void UnmuteOne(int dev){/* Restore one channel from mutelevel array. */ if ((1 << dev) & devmask) ErrorExitWarn(WriteLevel(dev, mutelevel[dev]), 'e');}void DrawLevelBalMode(int dev, int mode)/* arrow to show whether keyboard commands will adjust level or balance */{#ifdef HAVE_CURSES if (interactive == IN_CURSES) DrawLevelBalModeCurses(dev, mode);#endif /* HAVE_CURSES */}void AdjustLevel(int dev, int incr, int setlevel)/* * dev: device to adjust * incr: signed percentage to increase (decrease) level, ignored unless * setlevel = -1 * setlevel: level to set directly, or -1 to increment */{ int balset, max, left, right, temp; if (!((1 << dev) & devmask) || (dev > SOUND_MIXER_NRDEVICES - 1) || (dev < 0)) return; ErrorExitWarn(ReadLevel(dev, &temp), 'e'); left = temp & 0x7F; right = (temp >> 8) & 0x7F; max = (left > right) ? left : right; if (max) { balset = (left > right) ? (MAXLEVEL / 2) * right / max : MAXLEVEL - ((MAXLEVEL / 2) * left / max); } else { balset = (MAXLEVEL / 2); } max += incr; if (balset > (MAXLEVEL / 2 - 1)) { left = max * (MAXLEVEL - balset) / (MAXLEVEL / 2); right = max; } else { right = max * balset / (MAXLEVEL / 2); left = max; } left = (setlevel > -1) ? setlevel : left; right = (setlevel > -1) ? setlevel : right; left = (left > MAXLEVEL) ? MAXLEVEL : left; right = (right > MAXLEVEL) ? MAXLEVEL : right; left = (left < 0) ? 0 : left; right = (right < 0) ? 0 : right; temp = (right << 8) | left; ErrorExitWarn(WriteLevel(dev, temp), 'e'); EraseLevel(dev); /* Draw handle at new position. */ RedrawBalance(dev); DrawLevel(dev);}void DrawLevel(int dev){#ifdef HAVE_CURSES if (interactive == IN_CURSES) DrawLevelCurses(dev);#endif /* HAVE_CURSES */}void EraseLevel(int dev)/* Redraw level track. */{#ifdef HAVE_CURSES if (interactive == IN_CURSES) EraseLevelCurses(dev);#endif /* HAVE_CURSES */}void AdjustBalance(int dev, int incr, int setabs)/* * dev: device to adjust * incr: signed percentage to change balance * setabs: absolute balance setting, or -1 to increment only * Balance settings go from 0 to MAXLEVEL; at setting of 0, right amplitude is 0. */{ int balset, max, left, right, temp, left_orig, right_orig; if (!((1 << dev) & devmask) || (dev > SOUND_MIXER_NRDEVICES - 1)) return; ErrorExitWarn(ReadLevel(dev, &temp), 'e'); left = temp & 0x7F; right = (temp >> 8) & 0x7F; left_orig = left; right_orig = right; max = (left > right) ? left : right; if (max) { balset = (left > right) ? (MAXLEVEL / 2) * right / max : MAXLEVEL - ((MAXLEVEL / 2) * left / max); } else { balset = (MAXLEVEL / 2); } balset = (setabs == -1) ? balset + incr : setabs; balset = (balset > MAXLEVEL) ? MAXLEVEL : balset; balset = (balset < 0) ? 0 : balset; if (balset > (MAXLEVEL / 2 - 1)) { left = max * (MAXLEVEL - balset) / (MAXLEVEL / 2); right = max; } else { right = max * balset / (MAXLEVEL / 2); left = max; } temp = (right << 8) | left; ErrorExitWarn(WriteLevel(dev, temp), 'e'); /* Draw handle at new position. */ RedrawBalance(dev);}void RedrawBalance(int dev)/* Redraw balance track. */{#ifdef HAVE_CURSES if (interactive == IN_CURSES) RedrawBalanceCurses(dev);#endif /* HAVE_CURSES */}void SwitchRecordPlay(int dev){ /* Toggle record/play. */ if ((1 << dev) & recmask) { ErrorExitWarn(ReadRecSrc(), 'e'); if (recsrc & (1 << dev)) recsrc &= ~(1 << dev); /* Turn off recording. */ else recsrc |= (1 << dev); /* Turn on recording. */ ErrorExitWarn(WriteRecSrc(), 'e'); ErrorExitWarn(ReadRecSrc(), 'e'); our_recplay[dev] = recsrc; /* Store setting for updates. */ DrawRecordPlay(dev); /* Print indicators. */ }}void DrawRecordPlay(int dev){#ifdef HAVE_CURSES if (interactive == IN_CURSES) DrawRecordPlayCurses(dev);#endif /* HAVE_CURSES */}void CloseScreen(void){#ifdef HAVE_CURSES if (interactive == IN_CURSES) CloseScreenCurses();#endif /* HAVE_CURSES */#if defined (HAVE_GTK) || defined (HAVE_GTK1) if (interactive == IN_GTK) CloseScreenGTK();#endif /* HAVE_GTK || HAVE_GTK1 */}void ReadInteractiveKeys(void){ chark = strdup(LOCAL_TEXT("k")); charl = strdup(LOCAL_TEXT("l")); charm = strdup(LOCAL_TEXT("m")); charo = strdup(LOCAL_TEXT("o")); charq = strdup(LOCAL_TEXT("q")); chars = strdup(LOCAL_TEXT("s")); charu = strdup(LOCAL_TEXT("u"));}#endif /* HAVE_CURSES || HAVE_GTK || HAVE_GTK1 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -