Annotation of coherent/b/kernel/FWB/noises.c, revision 1.1

1.1     ! root        1: /*-----------------------------------------------------------------------------
        !             2:        Talking BIOS device driver for the AT&T PC6300.
        !             3:        Copyright (C) Karl Dahlke 1987
        !             4:        This software may be freely used and distributed
        !             5:        for any non-profit purpose.
        !             6:  *-----------------------------------------------------------------------------
        !             7:  */
        !             8: 
        !             9: /* noises.c: generate sounds */
        !            10: 
        !            11: #ifndef MSDOS
        !            12: #include <sys/io.h>
        !            13: #endif
        !            14: #include "speech.h"
        !            15: 
        !            16: #define DRAINTICKS 770 /* how long till the squawker's internal buffer is drained */
        !            17: 
        !            18: #define SF_LEN 32 /* length of sound fifo */
        !            19: 
        !            20: long lbolt;
        !            21: extern int mmticks;
        !            22: 
        !            23: /* sound control variables, console only */
        !            24: int sdtm_click = 1000;
        !            25: int sdtm_charwait = 7200;
        !            26: int sdtm_topcr = 370;
        !            27: int sdtm_botcr = 50;
        !            28: int sdtm_inccr = 3;
        !            29: int sdnoises = 1, sdtones = 0;
        !            30: 
        !            31: static short sf_fifo[SF_LEN];
        !            32: static int sf_head, sf_tail;
        !            33: static long wait_lbolt;
        !            34: 
        !            35: static freqset(freq)
        !            36: int freq;
        !            37: {
        !            38: short istate;
        !            39: istate = sphi();
        !            40: if(freq < 0) /* turn off tone */
        !            41: outb(0x61, inb(0x61) & ~1);
        !            42: else {
        !            43: outb(0x43, 0xb6);
        !            44: outb(0x42, freq);
        !            45: outb(0x42, (freq>>8));
        !            46: outb(0x61, inb(0x61) | 3);
        !            47: }
        !            48: spl(istate);
        !            49: } /* freqset */
        !            50: 
        !            51: static putfifo(p)
        !            52: short *p;
        !            53: {
        !            54: short istate;
        !            55: int i;
        !            56: 
        !            57: istate = sphi();
        !            58: i = sf_head;
        !            59: while(*p) {
        !            60: sf_fifo[i++] = *p++;
        !            61: if(i == SF_LEN) i = 0;
        !            62: if(i == sf_tail) goto done;
        !            63: }
        !            64: sf_head = i;
        !            65: 
        !            66: done: spl(istate);
        !            67: } /* putfifo */
        !            68: 
        !            69: chkfifo()
        !            70: {
        !            71: int i;
        !            72: short freq;
        !            73: long l;
        !            74: 
        !            75: if(wait_lbolt) {
        !            76: l = lbolt - wait_lbolt;
        !            77: if(l >= 0 || l <= -1000) {
        !            78: freqset(-1);
        !            79: wait_lbolt = 0;
        !            80: }
        !            81: }
        !            82: 
        !            83: if(!wait_lbolt) {
        !            84: if((i = sf_tail) != sf_head) {
        !            85: freq = sf_fifo[i++];
        !            86: if(i == SF_LEN) i = 0;
        !            87: l = sf_fifo[i++];
        !            88: if(i == SF_LEN) i = 0;
        !            89: sf_tail = i;
        !            90: freqset(freq);
        !            91: wait_lbolt = lbolt + l;
        !            92: }
        !            93: }
        !            94: 
        !            95: #ifndef MSDOS
        !            96: if(wait_lbolt) mmticks = 1; /* higher resolution */
        !            97: #endif
        !            98: } /* chkfifo */
        !            99: 
        !           100: /* generate a sound based on the passed parameter */
        !           101: /* should only be called when the session runs on the console */
        !           102: sdsound(sound)
        !           103: {
        !           104: short *snd_array;
        !           105: static short startsnd[] = {
        !           106: 2000,2,1800,2,1700,2,1500,2,1400,2,1300,2,1200,2,1000,2,900,2,800,2,700,2,500,2,0,0};
        !           107: static short bellsnd[] = {662,5,0,0};
        !           108: static short boundsnd[] = {376,3,316,3,0,0};
        !           109: static short offsnd[] = {4800,3,0,0};
        !           110: static short onsnd[] = {2000,10,0,0};
        !           111: static short buzzsnd[] = {8000,20,0,0};
        !           112: static short *soundlist[] = {
        !           113: 0, 0, 0, bellsnd, boundsnd, offsnd, onsnd, buzzsnd, startsnd};
        !           114: 
        !           115: if(!sdnoises) return;
        !           116: 
        !           117: snd_array = soundlist[sound];
        !           118: if(snd_array)
        !           119: putfifo(snd_array);
        !           120: if(sound == 2) sdcrsnd();
        !           121: if(sound == 1) sdclick();
        !           122: } /* sdsound */
        !           123: 
        !           124: /* under Coherent, we return an integer that indicates whether
        !           125:  * the mmtime() function should take a real time break before processing
        !           126:  * this or subsequent characters.
        !           127:  * Sometimes the time to wait before creating the click of the next
        !           128:  * character extends beyond the next system clock interrupt.
        !           129:  * In this case, there is no point in hogging the CPU.
        !           130:  * Return 1 to indicate that this character should be held,
        !           131:  * and acted upon once the mmtime() function is reinvoked
        !           132:  * at the next system clock interrupt, unless of course there
        !           133:  * is something else ready to run, such as my wife's word processor
        !           134:  * or a cron job.
        !           135:  * A return of 0 means we waited the proper amount of time and made the
        !           136:  * corresponding noise, and we are ready to receive the next character.
        !           137:  * If we are running musical output, the tone must persist for approx
        !           138:  * a tenth of a second. Return 2 to indicate this. */
        !           139: int sdcharsnd(c)
        !           140: char c;
        !           141: {
        !           142: /* lr_notes[i] = 1193181/(1000*1.02^(i+1)) */
        !           143: static short lr_notes[] = {
        !           144: 1168,1146,1124,1102,1080,1060,1038,1018,1000,980,960,942,924,906,888,872,
        !           145: 854,838,822,806,790,774,760,744,730,716,702,688,674,662,648,636,
        !           146: 624,612,600,588,576,566,554,544,532,522,512,502,492,482,474,464,
        !           147: 454,446,438,428,420,412,404,396,388,380,374,366,358,352,344,338};
        !           148: 
        !           149: /* make sound accompanying this character */
        !           150: if(sdtones) {
        !           151: #ifdef MSDOS
        !           152: while(wait_lbolt || sf_head != sf_tail)  ;
        !           153: #endif
        !           154: 
        !           155: if(c == 13) sdsound(2);
        !           156: if(c >= 96) c -= 32;
        !           157: if(c > ' ') freqset(lr_notes[c-' ']);
        !           158: #ifdef MSDOS
        !           159: wait_lbolt = lbolt + 3;
        !           160: #endif
        !           161: return 8;
        !           162: } /* sdtones */
        !           163: 
        !           164: if(sdnoises) {
        !           165: switch(c) {
        !           166: case 7: sdsound(3); break;
        !           167: case 13: sdsound(2); break;
        !           168: default:
        !           169: if(c > ' ')
        !           170: sdsound(1);
        !           171: break;
        !           172: }
        !           173: #ifdef MSDOS
        !           174: sdpause(sdtm_charwait - sdtm_click);
        !           175: #endif
        !           176: return 4;
        !           177: } /* noises on */
        !           178: 
        !           179: return 0;
        !           180: } /* sdcharsnd */
        !           181: 
        !           182: /* sound for turning a mode on or off, from within a deferred function */
        !           183: sdonoff(onoff)
        !           184: {
        !           185: if(!sdsession)
        !           186: sdsound(5+onoff);
        !           187: } /* sdonoff */
        !           188: 
        !           189: draincheck(o)
        !           190: struct SDCONTROL *o;
        !           191: {
        !           192: long l;
        !           193: 
        !           194: if(o->drain_lbolt) {
        !           195: l = lbolt - o->drain_lbolt;
        !           196: if(l < 0 && l > -1000)
        !           197: return 1; /* still waiting */
        !           198: o->drain_lbolt = 0;
        !           199: }
        !           200: 
        !           201: return 0;
        !           202: } /* draincheck */
        !           203: 
        !           204: drainset(o)
        !           205: struct SDCONTROL *o;
        !           206: {
        !           207: o->drain_lbolt = lbolt + DRAINTICKS;
        !           208: } /* drainset */
        !           209: 
        !           210: #ifndef MSDOS
        !           211: /* return nonzero if we need to take a real time break */
        !           212: mmgo1(c)
        !           213: int c;
        !           214: {
        !           215: int rc; /* return value */
        !           216:        IO iob;
        !           217: 
        !           218: /* set up for mmgo() */
        !           219:                iob.io_seg  = IOSYS;
        !           220:                iob.io_ioc  = 1;
        !           221:                iob.io.vbase = &c;
        !           222:                iob.io_flag = 0;
        !           223: 
        !           224: mmticks = 1;
        !           225: 
        !           226: rc = sdoutchar(0, c);
        !           227: 
        !           228: if(rc & 2) {
        !           229: int c1 = c;
        !           230: c = '\33';
        !           231: mmgo(&iob);
        !           232: c = c1;
        !           233: }
        !           234: 
        !           235: if(rc & 1) mmgo(&iob);
        !           236: 
        !           237: if(rc & 8) {
        !           238: mmticks = 8;
        !           239: return 0;
        !           240: }
        !           241: 
        !           242: if(rc & 4) {
        !           243: mmticks = 1;
        !           244: return 0;
        !           245: }
        !           246: 
        !           247: return 1;
        !           248: } /* mmgo1 */
        !           249: 
        !           250: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.