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

1.1       root        1:  /*
                      2:   * UAE - The Un*x Amiga Emulator
                      3:   *
                      4:   * Support for DOS
                      5:   *
1.1.1.2   root        6:   * Copyright 1997, 1998 Gustavo Goedert
1.1       root        7:   */
                      8: 
1.1.1.3   root        9: /****** This file is broken.  The sample handlers have to go.  ******/
                     10: 
1.1       root       11: #include "sysconfig.h"
                     12: #include "sysdeps.h"
                     13: 
                     14: #include "config.h"
                     15: #include "options.h"
                     16: #include "memory.h"
                     17: #include "custom.h"
                     18: #include "audio.h"
                     19: #include "gensound.h"
                     20: #include "sounddep/sound.h"
                     21: #include "events.h"
                     22: 
                     23: #include <go32.h>
                     24: #include <sys/farptr.h>
                     25: #include <time.h>
                     26: 
                     27: #include "sound/sb.h"
1.1.1.2   root       28: 
                     29: typedef uae_s8 sample8_t;
                     30: #define DO_CHANNEL_1(v, c) do { (v) *= audio_channel[c].vol; } while (0)
                     31: #define SBASEVAL8(logn) ((logn) == 1 ? SOUND8_BASE_VAL << 7 : SOUND8_BASE_VAL << 8)
                     32: #define SBASEVAL16(logn) ((logn) == 1 ? SOUND16_BASE_VAL >> 1 : SOUND16_BASE_VAL)
                     33: #define FINISH_DATA(b,logn) do { if (14 - (b) + (logn) > 0) data >>= 14 - (b) + (logn); else data <<= (b) - 14 - (logn); } while (0);
1.1       root       34: 
                     35: uae_u16 sndbuffer[44100];
                     36: uae_u16 *sndbufpt;
                     37: int sndbufsize;
                     38: extern int sound_table[256][64];
                     39: int dspbits;
                     40: 
                     41: int sound_curfreq;
                     42: 
1.1.1.2   root       43: void (*SND_DirectWrite)(unsigned int size, int freq); // Pointer to function that plays data on card
                     44: #define SND_DirectWrite SB_DirectWrite
1.1       root       45: volatile int IsPlaying = 0;
                     46: int CurrentBuffer = 0;
                     47: unsigned int direct_buffers[2], direct_sndbufpt;
                     48: 
                     49: void direct_mono_sample16_handler(void);
                     50: void direct_mono_sample8_handler(void);
                     51: void direct_stereo_sample16_handler(void);
                     52: void direct_stereo_sample8_handler(void);
                     53: void interpol_freq(int new_freq);
                     54: void direct_check_sound_buffers(void);
                     55: 
                     56: #define INTERPOL_SIZE 8
                     57: int freq_buf[INTERPOL_SIZE];
                     58: int buf_tot, buf_pos=0;
                     59: 
                     60: inline void interpol_freq(int new_freq) {
                     61:     buf_tot = buf_tot - freq_buf[buf_pos] + new_freq;
                     62:     freq_buf[buf_pos] = new_freq;
                     63:     buf_pos++;
                     64:     if (buf_pos == INTERPOL_SIZE) buf_pos = 0;
                     65:     sound_curfreq = buf_tot/INTERPOL_SIZE;
                     66:     if (sound_curfreq<currprefs.sound_freq) {
                     67:        sound_curfreq |= 0xff;
                     68:        if (sound_curfreq<5512)
                     69:            sound_curfreq = 5512;
                     70:     }
                     71:     if (sound_curfreq>currprefs.sound_freq)
                     72:        sound_curfreq = currprefs.sound_freq;
                     73: }
                     74: 
                     75: unsigned int sound_bytes = 0, last_clock = 0;
                     76: 
                     77: inline void direct_check_sound_buffers(void) {
                     78:     int played_size = direct_sndbufpt - direct_buffers[CurrentBuffer];
                     79: 
                     80:     sound_bytes++;
                     81:     if ((!IsPlaying) && played_size >= currprefs.sound_minbsiz) {
                     82:        SND_DirectWrite(played_size, sound_curfreq);
                     83:        if (currprefs.sound_adjust) {
                     84:            unsigned int cur_clock, new_freq;
                     85: 
                     86:            if (last_clock == 0)
                     87:                last_clock = uclock();
                     88:            else {
                     89:                cur_clock = uclock();
                     90:                new_freq = (unsigned long long) sound_bytes * UCLOCKS_PER_SEC / (cur_clock-last_clock);
                     91:                interpol_freq(new_freq);
                     92:                last_clock = cur_clock;
                     93:            }
                     94:            sound_bytes = 0;
                     95:        }
                     96:        CurrentBuffer = !CurrentBuffer;
                     97:        direct_sndbufpt = direct_buffers[CurrentBuffer];
                     98:     } else if (played_size >= currprefs.sound_maxbsiz) {
                     99:        if (currprefs.sound_adjust)
                    100:            interpol_freq(currprefs.sound_freq);
                    101:        while(IsPlaying);
                    102:        SND_DirectWrite(currprefs.sound_maxbsiz, sound_curfreq);
                    103:        CurrentBuffer = !CurrentBuffer;
                    104:        direct_sndbufpt = direct_buffers[CurrentBuffer];
                    105:        last_clock=0;
                    106:     }
                    107: }
                    108: 
                    109: void direct_mono_sample16_handler(void)
                    110: {
1.1.1.2   root      111:     uae_u32 data0 = audio_channel[0].current_sample;
                    112:     uae_u32 data1 = audio_channel[1].current_sample;
                    113:     uae_u32 data2 = audio_channel[2].current_sample;
                    114:     uae_u32 data3 = audio_channel[3].current_sample;
                    115:     DO_CHANNEL_1 (data0, 0);
                    116:     DO_CHANNEL_1 (data1, 1);
                    117:     DO_CHANNEL_1 (data2, 2);
                    118:     DO_CHANNEL_1 (data3, 3);
                    119:     data0 &= audio_channel[0].adk_mask;
                    120:     data1 &= audio_channel[1].adk_mask;
                    121:     data2 &= audio_channel[2].adk_mask;
                    122:     data3 &= audio_channel[3].adk_mask;
                    123:     data0 += data1;
                    124:     data0 += data2;
                    125:     data0 += data3;
                    126:     {
                    127:        uae_u32 data = SBASEVAL16(2) + data0;
                    128:        FINISH_DATA(16, 2);
                    129:        _farnspokew(direct_sndbufpt, data);
                    130:        direct_sndbufpt += 2;
                    131:     }
                    132: 
                    133:     direct_check_sound_buffers();
1.1       root      134: 
                    135:     eventtab[ev_sample].evtime = cycles + sample_evtime;
                    136:     eventtab[ev_sample].oldcycles = cycles;
                    137: }
                    138: 
                    139: void direct_mono_sample8_handler(void)
                    140: {
1.1.1.2   root      141:     uae_u32 data0 = audio_channel[0].current_sample;
                    142:     uae_u32 data1 = audio_channel[1].current_sample;
                    143:     uae_u32 data2 = audio_channel[2].current_sample;
                    144:     uae_u32 data3 = audio_channel[3].current_sample;
                    145:     DO_CHANNEL_1 (data0, 0);
                    146:     DO_CHANNEL_1 (data1, 1);
                    147:     DO_CHANNEL_1 (data2, 2);
                    148:     DO_CHANNEL_1 (data3, 3);
                    149:     data0 &= audio_channel[0].adk_mask;
                    150:     data1 &= audio_channel[1].adk_mask;
                    151:     data2 &= audio_channel[2].adk_mask;
                    152:     data3 &= audio_channel[3].adk_mask;
                    153:     data0 += data1;
                    154:     data0 += data2;
                    155:     data0 += data3;
                    156:     {
                    157:        uae_u32 data = SBASEVAL8(2) + data0;
                    158:        FINISH_DATA(8, 2);
                    159:        _farnspokeb(direct_sndbufpt++, data);
                    160:     }
1.1       root      161: 
                    162:     direct_check_sound_buffers();
                    163: 
                    164:     eventtab[ev_sample].evtime = cycles + sample_evtime;
                    165:     eventtab[ev_sample].oldcycles = cycles;
                    166: }
                    167: 
1.1.1.2   root      168: void direct_stereo_sample16_handler(void)
1.1       root      169: {
1.1.1.2   root      170:     uae_u32 data0 = audio_channel[0].current_sample;
                    171:     uae_u32 data1 = audio_channel[1].current_sample;
                    172:     uae_u32 data2 = audio_channel[2].current_sample;
                    173:     uae_u32 data3 = audio_channel[3].current_sample;
                    174:     DO_CHANNEL_1 (data0, 0);
                    175:     DO_CHANNEL_1 (data1, 1);
                    176:     DO_CHANNEL_1 (data2, 2);
                    177:     DO_CHANNEL_1 (data3, 3);
                    178: 
                    179:     data0 &= audio_channel[0].adk_mask;
                    180:     data1 &= audio_channel[1].adk_mask;
                    181:     data2 &= audio_channel[2].adk_mask;
                    182:     data3 &= audio_channel[3].adk_mask;
                    183: 
                    184:     data0 += data3;
                    185:     {
                    186:        uae_u32 data = SBASEVAL16(1) + data0;
                    187:        FINISH_DATA (16, 1);
                    188:        _farnspokew(direct_sndbufpt, data);
                    189:        direct_sndbufpt += 2;
                    190:     }
1.1       root      191: 
1.1.1.2   root      192:     data1 += data2;
                    193:     {
                    194:        uae_u32 data = SBASEVAL16(1) + data1;
                    195:        FINISH_DATA (16, 1);
                    196:        _farnspokew(direct_sndbufpt, data);
                    197:        direct_sndbufpt += 2;
                    198:     }
1.1       root      199: 
                    200:     direct_check_sound_buffers();
                    201: 
                    202:     eventtab[ev_sample].evtime = cycles + sample_evtime;
                    203:     eventtab[ev_sample].oldcycles = cycles;
                    204: }
                    205: 
1.1.1.2   root      206: void direct_stereo_sample8_handler(void)
1.1       root      207: {
1.1.1.2   root      208:     uae_u32 data0 = audio_channel[0].current_sample;
                    209:     uae_u32 data1 = audio_channel[1].current_sample;
                    210:     uae_u32 data2 = audio_channel[2].current_sample;
                    211:     uae_u32 data3 = audio_channel[3].current_sample;
                    212:     DO_CHANNEL_1 (data0, 0);
                    213:     DO_CHANNEL_1 (data1, 1);
                    214:     DO_CHANNEL_1 (data2, 2);
                    215:     DO_CHANNEL_1 (data3, 3);
                    216: 
                    217:     data0 &= audio_channel[0].adk_mask;
                    218:     data1 &= audio_channel[1].adk_mask;
                    219:     data2 &= audio_channel[2].adk_mask;
                    220:     data3 &= audio_channel[3].adk_mask;
                    221: 
                    222:     data0 += data3;
                    223:     {
                    224:        uae_u32 data = SBASEVAL8(1) + data0;
                    225:        FINISH_DATA (8, 1);
                    226:        _farnspokeb(direct_sndbufpt++, data);
                    227:     }
                    228:     data1 += data2;
                    229:     {
                    230:        uae_u32 data = SBASEVAL8(1) + data1;
                    231:        FINISH_DATA (8, 1);
                    232:        _farnspokeb(direct_sndbufpt++, data);
                    233:     }
                    234: 
                    235:     direct_check_sound_buffers();
1.1       root      236: 
                    237:     eventtab[ev_sample].evtime = cycles + sample_evtime;
                    238:     eventtab[ev_sample].oldcycles = cycles;
                    239: }
                    240: 
                    241: int init_sound (void)
                    242: {
                    243:     int tmp;
                    244:     int rate;
                    245:     int i;
                    246: 
                    247:     if (currprefs.sound_minbsiz > currprefs.sound_maxbsiz) {
                    248:        fprintf(stderr, "Minimum sound buffer size bigger then maximum, exchanging.\n");
                    249:        tmp = currprefs.sound_minbsiz;
                    250:        currprefs.sound_minbsiz = currprefs.sound_maxbsiz;
                    251:        currprefs.sound_maxbsiz = tmp;
                    252:     }
                    253: 
                    254:     dspbits = currprefs.sound_bits;
                    255:     rate = currprefs.sound_freq;
                    256:     sndbufsize = currprefs.sound_maxbsiz;
                    257: 
1.1.1.2   root      258:     if (SB_DetectInitSound(&dspbits, &rate, &sndbufsize, direct_buffers, &currprefs.stereo));
1.1       root      259:     else if (0/*OTHER_CARD_DETECT_ROUTINE*/);
                    260:     else
                    261:        return 0;
                    262: 
                    263:     currprefs.sound_freq = rate;
                    264:     currprefs.sound_minbsiz = (currprefs.sound_minbsiz>>2)<<2;
                    265:     currprefs.sound_maxbsiz = sndbufsize;
                    266: 
1.1.1.4 ! root      267:     sample_evtime = (long)MAXHPOS_PAL * MAXVPOS_PAL * VBLANK_HZ_PAL / rate;
1.1       root      268: 
                    269:     if (dspbits == 16) {
                    270:        init_sound_table16 ();
1.1.1.2   root      271:        if (currprefs.stereo)
                    272:            eventtab[ev_sample].handler = direct_stereo_sample16_handler;
                    273:        else
                    274:            eventtab[ev_sample].handler = direct_mono_sample16_handler;
1.1       root      275:     } else {
                    276:        init_sound_table8 ();
1.1.1.2   root      277:        if (currprefs.stereo)
                    278:            eventtab[ev_sample].handler = direct_stereo_sample8_handler;
                    279:        else
                    280:            eventtab[ev_sample].handler = direct_mono_sample8_handler;
1.1       root      281:     }
                    282:     printf ("Sound driver found and configured for %d bits at %d Hz, buffer is %d:%d bytes\n",
                    283:            dspbits, rate, currprefs.sound_minbsiz, currprefs.sound_maxbsiz);
                    284:     sndbufpt = sndbuffer;
                    285:     direct_sndbufpt = direct_buffers[0];
                    286: 
                    287:     sound_curfreq = currprefs.sound_freq;
                    288:     for (i=0; i<INTERPOL_SIZE; i++)
                    289:        freq_buf[i] = sound_curfreq;
                    290:     buf_tot = sound_curfreq * INTERPOL_SIZE;
                    291: 
1.1.1.2   root      292: #ifdef FRAME_RATE_HACK
                    293:     vsynctime = vsynctime * 9 / 10;
                    294: #endif
                    295: 
1.1       root      296:     return 1;
                    297: }
1.1.1.2   root      298: 
                    299: int setup_sound (void)
                    300: {
                    301:     sound_available = 1;
                    302:     return 1;
                    303: }
                    304: 
                    305: void close_sound(void)
                    306: {
                    307: }

unix.superglobalmegacorp.com

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