Annotation of uae/src/od-amiga/sound.c, revision 1.1

1.1     ! root        1:  /* 
        !             2:   * UAE - The Un*x Amiga Emulator
        !             3:   * 
        !             4:   * Support for Amiga audio.device sound
        !             5:   * 
        !             6:   * Copyright 1996, 1997 Samuel Devulder
        !             7:   */
        !             8: 
        !             9: #include "sysconfig.h"
        !            10: #include "sysdeps.h"
        !            11: 
        !            12: #include "config.h"
        !            13: #include "options.h"
        !            14: #include "memory.h"
        !            15: #include "custom.h"
        !            16: #include "audio.h"
        !            17: #include "gensound.h"
        !            18: #include "sounddep/sound.h"
        !            19: #include "events.h"
        !            20: 
        !            21: #include <hardware/custom.h>
        !            22: #include <hardware/cia.h>
        !            23: 
        !            24: #define CIAAPRA 0xBFE001 
        !            25: #define CUSTOM  0xDFF000
        !            26: 
        !            27: static struct Custom *custom= (struct Custom*) CUSTOM;
        !            28: static struct CIA *cia = (struct CIA *) CIAAPRA;
        !            29: 
        !            30: /*
        !            31:  * Compared to Linux, AF_SOUND, and mac above, the AMIGA sound processing
        !            32:  * with OS routines is awfull. (sam). But with AHI DOSDriver it is far more
        !            33:  * easier.
        !            34:  */
        !            35: 
        !            36: char whichchannel[]={1,2,4,8};
        !            37: struct IOAudio *AudioIO;
        !            38: struct MsgPort *AudioMP;
        !            39: struct Message *AudioMSG;
        !            40: 
        !            41: unsigned char *buffers[2];
        !            42: uae_u16 *sndbuffer;
        !            43: uae_u16 *sndbufpt;
        !            44: int sndbufsize;
        !            45: int bufidx, devopen;
        !            46: 
        !            47: int have_sound, clockval, oldledstate, period;
        !            48: 
        !            49: ULONG AUDIO_FILE;
        !            50: 
        !            51: static ULONG TST_AUDIO_FILE(char *buff, char *name, int rate, int bsize)
        !            52: {
        !            53:     struct Process *pr = (void*)FindTask(NULL);
        !            54:     ULONG wd, fd;
        !            55: 
        !            56:     if(!name) return 0;
        !            57:     wd = (ULONG)pr->pr_WindowPtr;
        !            58:     pr->pr_WindowPtr = (APTR)-1;
        !            59:     sprintf(buff,name,rate,bsize);
        !            60:     fd = Open(buff, MODE_NEWFILE);
        !            61:     pr->pr_WindowPtr = (APTR)wd;
        !            62:     return fd;
        !            63: }
        !            64: 
        !            65: int setup_sound(void)
        !            66: {
        !            67:     sound_available = 1;
        !            68:     return 1;
        !            69: }
        !            70: 
        !            71: int init_sound (void) 
        !            72: { /* too complex ? No it is only the allocation of a single channel ! */
        !            73:   /* it would have been far less painfull if AmigaOS provided a */
        !            74:   /* SOUND: device handler */
        !            75:     int rate;
        !            76:     char buff[256],*devname = NULL;
        !            77: 
        !            78:     atexit(close_sound); /* if only amiga os had resource tracking */
        !            79:     
        !            80:     /* determine the clock */
        !            81:     { 
        !            82:        struct GfxBase *GB;
        !            83:        GB = (void*)OpenLibrary("graphics.library",0L);
        !            84:        if(!GB) goto fail;
        !            85:        if (GB->DisplayFlags & PAL)
        !            86:            clockval = 3546895;        /* PAL clock */
        !            87:        else
        !            88:            clockval = 3579545;        /* NTSC clock */
        !            89:        CloseLibrary((void*)GB);
        !            90:     }
        !            91: 
        !            92:     /* check buffsize */
        !            93:     if (currprefs.sound_maxbsiz < 2 || currprefs.sound_maxbsiz > (256*1024)) {
        !            94:         fprintf(stderr, "Sound buffer size %d out of range.\n", currprefs.sound_maxbsiz);
        !            95:         currprefs.sound_maxbsiz = 8192;
        !            96:     } 
        !            97:     sndbufsize = (currprefs.sound_maxbsiz + 1)&~1;
        !            98: 
        !            99:     /* check freq */
        !           100:     if (!currprefs.sound_freq) currprefs.sound_freq = 1;
        !           101:     if (clockval/currprefs.sound_freq < 124 || clockval/currprefs.sound_freq > 65535) {
        !           102:        fprintf(stderr, "Can't use sound with desired frequency %d Hz\n", currprefs.sound_freq);
        !           103:         currprefs.sound_freq = 22000;
        !           104:     }
        !           105:     rate   = currprefs.sound_freq;
        !           106:     period = (uae_u16)(clockval/rate);
        !           107: 
        !           108:     /* check for $AUDIONAME or AUD: or AUDIO: device */
        !           109:     devname = buff;
        !           110:     AUDIO_FILE = TST_AUDIO_FILE(buff, getenv("AUDIONAME"),
        !           111:                                 rate, sndbufsize);
        !           112:     if(!AUDIO_FILE) /* AHI */
        !           113:     AUDIO_FILE = TST_AUDIO_FILE(buff, "AUDIO:FREQUENCY=%d/BUFFER=%d",
        !           114:                                 rate, sndbufsize);
        !           115:     if(!AUDIO_FILE) /* AUD: */
        !           116:     AUDIO_FILE = TST_AUDIO_FILE(buff, "AUDIO:FREQUENCY%d/BUFFER%d",
        !           117:                                 rate, sndbufsize);
        !           118:     if(!AUDIO_FILE)
        !           119:     AUDIO_FILE = TST_AUDIO_FILE(buff, "AUD:FREQUENCY%d/BUFFER%d",
        !           120:                                 rate, sndbufsize);
        !           121: 
        !           122:     /* else use audio.device */
        !           123:     if(!AUDIO_FILE) {
        !           124:     /* setup the stuff */
        !           125:     AudioMP = CreatePort(0,0);
        !           126:     if(!AudioMP) goto fail;
        !           127:         AudioIO = (struct IOAudio *)CreateExtIO(AudioMP, 
        !           128:                                                 sizeof(struct IOAudio));
        !           129:     if(!AudioIO) goto fail;
        !           130: 
        !           131:     AudioIO->ioa_Request.io_Message.mn_Node.ln_Pri /*pfew!!*/ = 85;
        !           132:     AudioIO->ioa_Data = whichchannel;
        !           133:     AudioIO->ioa_Length = sizeof(whichchannel);
        !           134:     AudioIO->ioa_AllocKey = 0;
        !           135:         if(OpenDevice(devname = AUDIONAME, 0, (void*)AudioIO, 0)) goto fail;
        !           136:     devopen = 1;
        !           137:         }
        !           138: 
        !           139:     /* get the buffers */
        !           140:     if(AUDIO_FILE) {
        !           141:         buffers[0] = (void*)AllocMem(sndbufsize,MEMF_ANY|MEMF_CLEAR);
        !           142:         buffers[1] = NULL;
        !           143:         if(!buffers[0]) goto fail;
        !           144:     } else {
        !           145:         buffers[0] = (void*)AllocMem(sndbufsize,MEMF_CHIP|MEMF_CLEAR);
        !           146:         buffers[1] = (void*)AllocMem(sndbufsize,MEMF_CHIP|MEMF_CLEAR);
        !           147:         if(!buffers[0] || !buffers[1]) goto fail;
        !           148:     }
        !           149:     bufidx = 0;
        !           150:     sndbuffer = sndbufpt = (uae_u16*)buffers[bufidx];
        !           151: 
        !           152:     oldledstate = cia->ciapra & (1<<CIAB_LED);
        !           153:     cia->ciapra |= (1<<CIAB_LED);
        !           154: 
        !           155:     sample_evtime = (long)maxhpos * maxvpos * 50 / rate;
        !           156:     init_sound_table8 ();
        !           157:     eventtab[ev_sample].handler = sample8_handler;
        !           158: 
        !           159:     fprintf(stderr, "Sound driver found and configured for %d bits "
        !           160:                     "at %d Hz, buffer is %d bytes (%s)\n",
        !           161:                     8, rate, sndbufsize,devname);
        !           162: 
        !           163:     sound_available = 1;
        !           164:     return 1;
        !           165: fail:
        !           166:     sound_available = 0;
        !           167:     return 0;
        !           168: }
        !           169: 
        !           170: void close_sound(void)
        !           171: {
        !           172:     if(AUDIO_FILE) Close(AUDIO_FILE);
        !           173:     if(devopen) {CloseDevice((void*)AudioIO);devopen = 0;}
        !           174:     if(AudioIO) {DeleteExtIO((void*)AudioIO);AudioIO = NULL;}
        !           175:     if(AudioMP) {DeletePort((void*)AudioMP);AudioMP = NULL;}
        !           176:     if(buffers[0]) {FreeMem((APTR)buffers[0],sndbufsize);buffers[0] = 0;}
        !           177:     if(buffers[1]) {FreeMem((APTR)buffers[1],sndbufsize);buffers[1] = 0;}
        !           178:     if(sound_available) {
        !           179:        cia->ciapra = (cia->ciapra & ~(1<<CIAB_LED)) | oldledstate;
        !           180:        sound_available = 0;
        !           181:     }
        !           182: }

unix.superglobalmegacorp.com

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