Annotation of uae/os.c, revision 1.1.1.1

1.1       root        1:  /* 
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   * 
                      4:   * OS specific functions
                      5:   * 
                      6:   * (c) 1995 Bernd Schmidt
                      7:   */
                      8: 
                      9: #include <stdio.h>
                     10: 
                     11: #ifdef __unix
                     12: #include <values.h>
                     13: #include <fcntl.h>
                     14: #include <unistd.h>
                     15: #endif
                     16: 
                     17: #include "config.h"
                     18: #include "amiga.h"
                     19: #include "options.h"
                     20: #include "memory.h"
                     21: #include "custom.h"
                     22: #include "os.h"
                     23: 
                     24: #ifdef LINUX_JOYSTICK
                     25: 
                     26: #include <linux/joystick.h>
                     27: 
                     28: static int js0;
                     29: static bool joystickpresent = false;
                     30: 
                     31: struct JS_DATA_TYPE jscal;
                     32: 
                     33: void read_joystick(UWORD *dir, bool *button)
                     34: {
                     35:     static int minx = MAXINT, maxx = MININT,
                     36:                miny = MAXINT, maxy = MININT;
                     37:     bool left = false, right = false, top = false, bot = false;
                     38:     struct JS_DATA_TYPE buffer;
                     39:     int len;
                     40:     
                     41:     *dir = 0;
                     42:     *button = false;
                     43:     if (!joystickpresent)
                     44:        return;
                     45:     
                     46:     len = read(js0, &buffer, sizeof(buffer));
                     47:     if (len != sizeof(buffer)) 
                     48:        return;
                     49:     
                     50:     if (buffer.x < minx) minx = buffer.x;
                     51:     if (buffer.y < miny) miny = buffer.y;
                     52:     if (buffer.x > maxx) maxx = buffer.x;
                     53:     if (buffer.y > maxy) maxy = buffer.y;
                     54:     
                     55:     if (buffer.x < (minx + (maxx-minx)/3))
                     56:        left = true;
                     57:     else if (buffer.x > (minx + 2*(maxx-minx)/3))
                     58:        right = true;
                     59: 
                     60:     if (buffer.y < (miny + (maxy-miny)/3))
                     61:        top = true;
                     62:     else if (buffer.y > (miny + 2*(maxy-miny)/3))
                     63:        bot = true;
                     64:        
                     65:     if (left) top = !top;
                     66:     if (right) bot = !bot;
                     67:     *dir = bot | (right << 1) | (top << 8) | (left << 9);
                     68:     *button = (buffer.buttons & 3) != 0;
                     69: }
                     70: 
                     71: void init_joystick(void)
                     72: {
                     73:     js0 = open("/dev/js0", O_RDONLY);
                     74:     if (js0 < 0)
                     75:        return;
                     76:     joystickpresent = true;
                     77: }
                     78: 
                     79: void close_joystick(void)
                     80: {
                     81:     if (joystickpresent)
                     82:        close(js0);
                     83: }
                     84: #else
                     85: 
                     86: void read_joystick(UWORD *dir, bool *button)
                     87: {
                     88:     *dir = 0;
                     89:     *button = false;
                     90: }
                     91: 
                     92: void init_joystick(void)
                     93: {
                     94: }
                     95: 
                     96: void close_joystick(void)
                     97: {
                     98: }
                     99: #endif
                    100: 
                    101: CPTR audlc[4], audpt[4];
                    102: UWORD audvol[4], audper[4], audlen[4], audwlen[4];
                    103: int audwper[4];
                    104: UWORD auddat[4];
                    105: int audsnum[4];
                    106: 
                    107: /* Audio states. This is not an exact representation of the Audio State Machine
                    108:  * (HRM p. 166), but a simplification. To be honest, I don't completely
                    109:  * understand that picture yet.
                    110:  */
                    111: int audst[4];
                    112: 
                    113: #ifdef LINUX_SOUND
                    114: 
                    115: #include <sys/soundcard.h>
                    116: 
                    117: static const int n_frames = 10;
                    118: 
                    119: /* The buffer is too large... */
                    120: static UWORD buffer[44100], *bufpt;
                    121: static BYTE snddata[4];
                    122: 
                    123: static int frames = 0;
                    124: static int smplcnt = 0;
                    125: 
                    126: static int sfd;
                    127: static bool have_sound;
                    128: 
                    129: bool init_sound (void)
                    130: {
                    131:     int tmp;
                    132:     sfd = open ("/dev/dsp", O_WRONLY);
                    133:     have_sound = !(sfd < 0);
                    134:     if (!have_sound) {
                    135:        return false;
                    136:     }
                    137:     
                    138:     tmp = 16;
                    139:     ioctl(sfd, SNDCTL_DSP_SAMPLESIZE, &tmp);
                    140:     
                    141:     tmp = 0;
                    142:     ioctl(sfd, SNDCTL_DSP_STEREO, &tmp);
                    143:     
                    144:     tmp = 44100;
                    145:     ioctl(sfd, SNDCTL_DSP_SPEED, &tmp);
                    146:     
                    147:     audst[0] = audst[1] = audst[2] = audst[3] = 0;
                    148:     bufpt = buffer;
                    149:     frames = n_frames;
                    150:     smplcnt = 0;
                    151:     return true;
                    152: }
                    153: 
                    154: static void channel_reload (int c)
                    155: {
                    156:     audst[c] = 1;
                    157:     audpt[c] = audlc[c];
                    158:     audwper[c] = 0;
                    159:     audwlen[c] = audlen[c];
                    160:     audsnum[c] = 1;    
                    161: }
                    162: 
                    163: void do_sound (void)
                    164: {
                    165:     smplcnt -= 227;
                    166:     while (smplcnt < 0) {
                    167:        int i;
                    168:        smplcnt += 80;
                    169:        for(i = 0; i < 4; i++) {
                    170:            if (dmaen (1<<i)) {
                    171:                if (audst[i] == 0) {            
                    172:                    /* DMA was turned on for this channel */
                    173:                    channel_reload (i);
                    174:                    continue;
                    175:                }
                    176:                
                    177:                if (audwper[i] <= 0) {
                    178:                    audwper[i] += audper[i];
                    179:                    if (audst[i] == 1) {
                    180:                        /*  Starting a sample, cause interrupt */
                    181:                        put_word (0xDFF09C, 0x8000 | (0x80 << i));
                    182:                        audst[i] = 2;
                    183:                    }
                    184:                    audsnum[i] ^= 1;
                    185:                    if (audsnum[i] == 0) {
                    186:                        auddat[i] = get_word (audpt[i]);
                    187:                        audpt[i] += 2;
                    188:                        audwlen[i]--;
                    189:                        if (audwlen[i] == 0) {
                    190:                            channel_reload (i);
                    191:                        }
                    192:                    }           
                    193:                }
                    194:                snddata[i] = audsnum[i] ? auddat[i] : auddat[i] >> 8;
                    195:                audwper[i] -= 80;               
                    196:            } else 
                    197:                audst[i] = snddata[i] = 0;
                    198:        }
                    199:        *bufpt++ = (snddata[0] * audvol[0] / 2 + snddata[1] * audvol[1] / 2
                    200:                    + snddata[2] * audvol[2] / 2 + snddata[3] * audvol[3] / 2);
                    201:     }
                    202: }
                    203: 
                    204: void flush_sound (void)
                    205: {
                    206:     if (--frames == 0) {       
                    207:        write (sfd, buffer, 2*(bufpt - buffer));
                    208:        bufpt = buffer;
                    209:        frames = n_frames;
                    210:     }
                    211: }
                    212: 
                    213: #else
                    214: bool init_sound (void)
                    215: {
                    216:     return true;
                    217: }
                    218: 
                    219: void do_sound (void)
                    220: {
                    221: }
                    222: 
                    223: void flush_sound (void)
                    224: {
                    225: }
                    226: #endif
                    227: 

unix.superglobalmegacorp.com

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