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

1.1     ! root        1:  /*
        !             2:   * UAE - The Un*x Amiga Emulator
        !             3:   *
        !             4:   * Support for DOS
        !             5:   *
        !             6:   * Copyright 1997 Gustavo Goedert
        !             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 <go32.h>
        !            22: #include <sys/farptr.h>
        !            23: #include <time.h>
        !            24: 
        !            25: #include "sound/sb.h"
        !            26: #include "sound/gus.h"
        !            27: 
        !            28: uae_u16 sndbuffer[44100];
        !            29: uae_u16 *sndbufpt;
        !            30: int sndbufsize;
        !            31: extern int sound_table[256][64];
        !            32: int dspbits;
        !            33: 
        !            34: int sound_curfreq;
        !            35: 
        !            36: void (*SND_Write)(void *buf, unsigned long size); // Pointer to function that plays data on card
        !            37: void (*SND_DirectWrite)(unsigned int size, int freq); // New function that plays data directly
        !            38: volatile int IsPlaying = 0;
        !            39: int CurrentBuffer = 0;
        !            40: unsigned int direct_buffers[2], direct_sndbufpt;
        !            41: 
        !            42: void direct_mono_sample16_handler(void);
        !            43: void direct_mono_sample8_handler(void);
        !            44: void direct_stereo_sample16_handler(void);
        !            45: void direct_stereo_sample8_handler(void);
        !            46: void normal_sample16_handler(void);
        !            47: void normal_sample8_handler(void);
        !            48: void interpol_freq(int new_freq);
        !            49: void direct_check_sound_buffers(void);
        !            50: void normal_check_sound_buffers(void);
        !            51: 
        !            52: #define INTERPOL_SIZE 8
        !            53: int freq_buf[INTERPOL_SIZE];
        !            54: int buf_tot, buf_pos=0;
        !            55: 
        !            56: inline void interpol_freq(int new_freq) {
        !            57:     buf_tot = buf_tot - freq_buf[buf_pos] + new_freq;
        !            58:     freq_buf[buf_pos] = new_freq;
        !            59:     buf_pos++;
        !            60:     if (buf_pos == INTERPOL_SIZE) buf_pos = 0;
        !            61:     sound_curfreq = buf_tot/INTERPOL_SIZE;
        !            62:     if (sound_curfreq<currprefs.sound_freq) {
        !            63:        sound_curfreq |= 0xff;
        !            64:        if (sound_curfreq<5512)
        !            65:            sound_curfreq = 5512;
        !            66:     }
        !            67:     if (sound_curfreq>currprefs.sound_freq)
        !            68:        sound_curfreq = currprefs.sound_freq;
        !            69: }
        !            70: 
        !            71: unsigned int sound_bytes = 0, last_clock = 0;
        !            72: 
        !            73: inline void direct_check_sound_buffers(void) {
        !            74:     int played_size = direct_sndbufpt - direct_buffers[CurrentBuffer];
        !            75: 
        !            76:     sound_bytes++;
        !            77:     if ((!IsPlaying) && played_size >= currprefs.sound_minbsiz) {
        !            78:        SND_DirectWrite(played_size, sound_curfreq);
        !            79:        if (currprefs.sound_adjust) {
        !            80:            unsigned int cur_clock, new_freq;
        !            81: 
        !            82:            if (last_clock == 0)
        !            83:                last_clock = uclock();
        !            84:            else {
        !            85:                cur_clock = uclock();
        !            86:                new_freq = (unsigned long long) sound_bytes * UCLOCKS_PER_SEC / (cur_clock-last_clock);
        !            87:                interpol_freq(new_freq);
        !            88:                last_clock = cur_clock;
        !            89:            }
        !            90:            sound_bytes = 0;
        !            91:        }
        !            92:        CurrentBuffer = !CurrentBuffer;
        !            93:        direct_sndbufpt = direct_buffers[CurrentBuffer];
        !            94:     } else if (played_size >= currprefs.sound_maxbsiz) {
        !            95:        if (currprefs.sound_adjust)
        !            96:            interpol_freq(currprefs.sound_freq);
        !            97:        while(IsPlaying);
        !            98:        SND_DirectWrite(currprefs.sound_maxbsiz, sound_curfreq);
        !            99:        CurrentBuffer = !CurrentBuffer;
        !           100:        direct_sndbufpt = direct_buffers[CurrentBuffer];
        !           101:        last_clock=0;
        !           102:     }
        !           103: }
        !           104: 
        !           105: inline void normal_check_sound_buffers(void) {
        !           106:     if ((char *)sndbufpt - (char *)sndbuffer >= sndbufsize) {
        !           107:        SND_Write(sndbuffer, sndbufsize);
        !           108:        sndbufpt = sndbuffer;
        !           109:     }
        !           110: }
        !           111: 
        !           112: /* Gustavo et al.: *please* don't duplicate code like this, but use the functions
        !           113:  * in audio.c */
        !           114: void direct_mono_sample16_handler(void)
        !           115: {
        !           116:     int nr, adk;
        !           117:     uae_u32 data = SOUND16_BASE_VAL;
        !           118: 
        !           119:     eventtab[ev_sample].evtime = cycles + sample_evtime;
        !           120:     eventtab[ev_sample].oldcycles = cycles;
        !           121: 
        !           122:     adk = adkcon;
        !           123: 
        !           124:     if (!(adk & 0x11))
        !           125:        data += sound_table[audio_channel[0].current_sample][audio_channel[0].vol];
        !           126:     if (!(adk & 0x22))
        !           127:        data += sound_table[audio_channel[1].current_sample][audio_channel[1].vol];
        !           128:     if (!(adk & 0x44))
        !           129:        data += sound_table[audio_channel[2].current_sample][audio_channel[2].vol];
        !           130:     if (!(adk & 0x88))
        !           131:        data += sound_table[audio_channel[3].current_sample][audio_channel[3].vol];
        !           132: 
        !           133:     _farnspokew(direct_sndbufpt, data);
        !           134:     direct_sndbufpt += 2;
        !           135:     direct_check_sound_buffers();
        !           136: }
        !           137: 
        !           138: void direct_mono_sample8_handler(void)
        !           139: {
        !           140:     int nr, adk, played_size;
        !           141:     uae_u32 data = SOUND8_BASE_VAL;
        !           142: 
        !           143:     eventtab[ev_sample].evtime = cycles + sample_evtime;
        !           144:     eventtab[ev_sample].oldcycles = cycles;
        !           145: 
        !           146:     adk = adkcon;
        !           147: 
        !           148:     if (!(adk & 0x11))
        !           149:        data += sound_table[audio_channel[0].current_sample][audio_channel[0].vol];
        !           150:     if (!(adk & 0x22))
        !           151:        data += sound_table[audio_channel[1].current_sample][audio_channel[1].vol];
        !           152:     if (!(adk & 0x44))
        !           153:        data += sound_table[audio_channel[2].current_sample][audio_channel[2].vol];
        !           154:     if (!(adk & 0x88))
        !           155:        data += sound_table[audio_channel[3].current_sample][audio_channel[3].vol];
        !           156: 
        !           157:     _farnspokeb(direct_sndbufpt++, data);
        !           158:     direct_check_sound_buffers();
        !           159: }
        !           160: 
        !           161: void direct_stereo_sample16_handler(void)
        !           162: {
        !           163:     int nr, adk;
        !           164:     uae_u32 ldata = SOUND16_BASE_VAL, rdata = SOUND16_BASE_VAL;
        !           165: 
        !           166:     eventtab[ev_sample].evtime = cycles + sample_evtime;
        !           167:     eventtab[ev_sample].oldcycles = cycles;
        !           168: 
        !           169:     adk = adkcon;
        !           170: 
        !           171:     if (!(adk & 0x11))
        !           172:        ldata += sound_table[audio_channel[0].current_sample][audio_channel[0].vol];
        !           173:     if (!(adk & 0x22))
        !           174:        rdata += sound_table[audio_channel[1].current_sample][audio_channel[1].vol];
        !           175:     if (!(adk & 0x44))
        !           176:        rdata += sound_table[audio_channel[2].current_sample][audio_channel[2].vol];
        !           177:     if (!(adk & 0x88))
        !           178:        ldata += sound_table[audio_channel[3].current_sample][audio_channel[3].vol];
        !           179: 
        !           180:     _farnspokew(direct_sndbufpt, ldata);
        !           181:     direct_sndbufpt += 2;
        !           182:     _farnspokew(direct_sndbufpt, rdata);
        !           183:     direct_sndbufpt += 2;
        !           184:     direct_check_sound_buffers();
        !           185: }
        !           186: 
        !           187: void direct_stereo_sample8_handler(void)
        !           188: {
        !           189:     int nr, adk, played_size;
        !           190:     uae_u32 ldata = SOUND8_BASE_VAL, rdata = SOUND8_BASE_VAL;
        !           191: 
        !           192:     eventtab[ev_sample].evtime = cycles + sample_evtime;
        !           193:     eventtab[ev_sample].oldcycles = cycles;
        !           194: 
        !           195:     adk = adkcon;
        !           196: 
        !           197:     if (!(adk & 0x11))
        !           198:        ldata += sound_table[audio_channel[0].current_sample][audio_channel[0].vol];
        !           199:     if (!(adk & 0x22))
        !           200:        rdata += sound_table[audio_channel[1].current_sample][audio_channel[1].vol];
        !           201:     if (!(adk & 0x44))
        !           202:        rdata += sound_table[audio_channel[2].current_sample][audio_channel[2].vol];
        !           203:     if (!(adk & 0x88))
        !           204:        ldata += sound_table[audio_channel[3].current_sample][audio_channel[3].vol];
        !           205: 
        !           206:     _farnspokeb(direct_sndbufpt++, ldata);
        !           207:     _farnspokeb(direct_sndbufpt++, rdata);
        !           208:     direct_check_sound_buffers();
        !           209: }
        !           210: 
        !           211: 
        !           212: void normal_sample16_handler(void)
        !           213: {
        !           214:     int nr, adk;
        !           215:     uae_u32 data = SOUND16_BASE_VAL;
        !           216: 
        !           217:     eventtab[ev_sample].evtime = cycles + sample_evtime;
        !           218:     eventtab[ev_sample].oldcycles = cycles;
        !           219: 
        !           220:     adk = adkcon;
        !           221: 
        !           222:     if (!(adk & 0x11))
        !           223:        data += sound_table[audio_channel[0].current_sample][audio_channel[0].vol];
        !           224:     if (!(adk & 0x22))
        !           225:        data += sound_table[audio_channel[1].current_sample][audio_channel[1].vol];
        !           226:     if (!(adk & 0x44))
        !           227:        data += sound_table[audio_channel[2].current_sample][audio_channel[2].vol];
        !           228:     if (!(adk & 0x88))
        !           229:        data += sound_table[audio_channel[3].current_sample][audio_channel[3].vol];
        !           230: 
        !           231:     *(uae_u16 *)sndbufpt = data;
        !           232:     sndbufpt = (uae_u16 *)(((uae_u8 *)sndbufpt) + 2);
        !           233:     normal_check_sound_buffers();
        !           234: }
        !           235: 
        !           236: void normal_sample8_handler(void)
        !           237: {
        !           238:     int nr, adk;
        !           239:     uae_u32 data = SOUND8_BASE_VAL;
        !           240: 
        !           241:     eventtab[ev_sample].evtime = cycles + sample_evtime;
        !           242:     eventtab[ev_sample].oldcycles = cycles;
        !           243: 
        !           244:     adk = adkcon;
        !           245: 
        !           246:     if (!(adk & 0x11))
        !           247:        data += sound_table[audio_channel[0].current_sample][audio_channel[0].vol];
        !           248:     if (!(adk & 0x22))
        !           249:        data += sound_table[audio_channel[1].current_sample][audio_channel[1].vol];
        !           250:     if (!(adk & 0x44))
        !           251:        data += sound_table[audio_channel[2].current_sample][audio_channel[2].vol];
        !           252:     if (!(adk & 0x88))
        !           253:        data += sound_table[audio_channel[3].current_sample][audio_channel[3].vol];
        !           254: 
        !           255:     *(uae_u8 *)sndbufpt = data;
        !           256:     sndbufpt = (uae_u16 *)(((uae_u8 *)sndbufpt) + 1);
        !           257:     normal_check_sound_buffers();
        !           258: }
        !           259: 
        !           260: void close_sound(void) {
        !           261: }
        !           262: 
        !           263: int setup_sound(void) {
        !           264:     sound_available = 1;
        !           265:     return 1;
        !           266: }
        !           267: 
        !           268: int init_sound (void)
        !           269: {
        !           270:     int tmp;
        !           271:     int rate;
        !           272:     int i;
        !           273: 
        !           274:     if (currprefs.sound_minbsiz > currprefs.sound_maxbsiz) {
        !           275:        fprintf(stderr, "Minimum sound buffer size bigger then maximum, exchanging.\n");
        !           276:        tmp = currprefs.sound_minbsiz;
        !           277:        currprefs.sound_minbsiz = currprefs.sound_maxbsiz;
        !           278:        currprefs.sound_maxbsiz = tmp;
        !           279:     }
        !           280: 
        !           281:     dspbits = currprefs.sound_bits;
        !           282:     rate = currprefs.sound_freq;
        !           283:     sndbufsize = currprefs.sound_maxbsiz;
        !           284: 
        !           285:     if (GUS_Init(&dspbits, &rate, &sndbufsize, direct_buffers, &currprefs.stereo));
        !           286:     else if (SB_DetectInitSound(&dspbits, &rate, &sndbufsize, direct_buffers, &currprefs.stereo));
        !           287:     else if (0/*OTHER_CARD_DETECT_ROUTINE*/);
        !           288:     else
        !           289:        return 0;
        !           290: 
        !           291:     currprefs.sound_freq = rate;
        !           292:     currprefs.sound_minbsiz = (currprefs.sound_minbsiz>>2)<<2;
        !           293:     currprefs.sound_maxbsiz = sndbufsize;
        !           294: 
        !           295:     if (direct_buffers[0] == 0)
        !           296:        currprefs.sound_minbsiz = currprefs.sound_maxbsiz;
        !           297: 
        !           298:     sample_evtime = (long)maxhpos * maxvpos * 50 / rate;
        !           299: 
        !           300:     if (dspbits == 16) {
        !           301:        init_sound_table16 ();
        !           302:        if (direct_buffers[0] != 0) {
        !           303:            if (currprefs.stereo)
        !           304:                eventtab[ev_sample].handler = direct_stereo_sample16_handler;
        !           305:            else
        !           306:                eventtab[ev_sample].handler = direct_mono_sample16_handler;
        !           307:        } else
        !           308:            eventtab[ev_sample].handler = normal_sample16_handler;
        !           309:     } else {
        !           310:        init_sound_table8 ();
        !           311:        if (direct_buffers[0] != 0) {
        !           312:            if (currprefs.stereo)
        !           313:                eventtab[ev_sample].handler = direct_stereo_sample8_handler;
        !           314:            else
        !           315:                eventtab[ev_sample].handler = direct_mono_sample8_handler;
        !           316:        } else
        !           317:            eventtab[ev_sample].handler = normal_sample8_handler;
        !           318:     }
        !           319:     sound_available = 1;
        !           320:     printf ("Sound driver found and configured for %d bits at %d Hz, buffer is %d:%d bytes\n",
        !           321:            dspbits, rate, currprefs.sound_minbsiz, currprefs.sound_maxbsiz);
        !           322:     sndbufpt = sndbuffer;
        !           323:     direct_sndbufpt = direct_buffers[0];
        !           324: 
        !           325:     sound_curfreq = currprefs.sound_freq;
        !           326:     for (i=0; i<INTERPOL_SIZE; i++)
        !           327:        freq_buf[i] = sound_curfreq;
        !           328:     buf_tot = sound_curfreq * INTERPOL_SIZE;
        !           329: 
        !           330:     return 1;
        !           331: }

unix.superglobalmegacorp.com

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