Annotation of uae/src/od-amiga/sound.h, revision 1.1.1.3

1.1.1.3 ! root        1:  /*
1.1       root        2:   * UAE - The Un*x Amiga Emulator
1.1.1.3 ! root        3:   *
1.1.1.2   root        4:   * Support for Amiga audio.device and AHI.device sound.
1.1.1.3 ! root        5:   *
1.1.1.2   root        6:   * Copyright 1996, 1997, 1998 Samuel Devulder, Holger Jakob (AHI)
1.1       root        7:   */
                      8: 
1.1.1.2   root        9: #ifdef HAVE_DEVICES_AHI_H
1.1.1.3 ! root       10: #define USE_AHIDEVICE
1.1.1.2   root       11: #ifdef FRAME_RATE_HACK
                     12: /* holger:In this mode emulation speed is adjusted with sound dma
1.1.1.3 ! root       13:          and sound output delay does not depend on sndbufsize
1.1.1.2   root       14: #define AHI_DMA_MODE
                     15:  */
1.1       root       16: #endif
1.1.1.3 ! root       17: #endif
1.1       root       18: 
                     19: #include <exec/memory.h>
                     20: #include <exec/devices.h>
                     21: #include <exec/io.h>
                     22: 
                     23: #include <graphics/gfxbase.h>
                     24: #include <devices/timer.h>
                     25: #include <devices/audio.h>
                     26: 
1.1.1.2   root       27: #if defined(POWERUP)
                     28: #ifndef USE_CLIB
                     29: #include <powerup/ppcproto/exec.h>
                     30: #include <powerup/ppcproto/dos.h>
                     31: /* sam: no inline/alib.h on powerup, so use this instead :( */
                     32: static void BeginIO(struct IORequest *iorequest)
                     33: {
                     34:        struct Caos     MyCaos;
                     35:        MyCaos.a1               = (ULONG) iorequest;
                     36:        MyCaos.M68kCacheMode    = IF_CACHEFLUSHALL;
                     37:        MyCaos.PPCCacheMode     = IF_CACHEFLUSHALL;
                     38:        MyCaos.caos_Un.Offset   = (-0x1e);
                     39:        MyCaos.a6               = (ULONG) iorequest->io_Device;
                     40:        PPCCallOS(&MyCaos);
                     41: }
                     42: #else
                     43: #include <clib/exec_protos.h>
                     44: #include <clib/alib_protos.h>
                     45: #endif
                     46: #else
                     47: #include <proto/exec.h>
                     48: #include <proto/dos.h>
                     49: #ifdef __GNUC__
                     50: #include <proto/alib.h>
                     51: #elif defined(__SASC)
                     52: #include <clib/alib_protos.h>
                     53: #endif
                     54: #endif
                     55: 
                     56: #ifdef USE_AHIDEVICE
                     57: #include <devices/ahi.h>
1.1.1.3 ! root       58: extern struct AHIRequest *AHIio[];
1.1.1.2   root       59: extern struct AHIRequest *linkio;
                     60: #ifdef AHI_DMA_MODE
                     61: extern struct Library    *AHIBase;
                     62: extern struct AHIAudioCtrl *actrl;
                     63: extern uae_u16 *sndbufptrmax;
                     64: #endif /* AHI_DMA_MODE */
                     65: #endif /* USE_AHI_DEVICE */
                     66: 
1.1       root       67: extern char whichchannel[];
                     68: extern struct IOAudio *AudioIO;
                     69: extern struct MsgPort *AudioMP;
                     70: extern struct Message *AudioMSG;
                     71: 
                     72: extern unsigned char *buffers[2];
                     73: extern uae_u16 *sndbuffer, *sndbufpt;
1.1.1.2   root       74: extern int bufidx, devopen,ahiopen;
1.1       root       75: extern int sndbufsize;
                     76: 
                     77: extern int have_sound, clockval, oldledstate, period;
                     78: 
                     79: extern ULONG AUDIO_FILE;
                     80: 
                     81: static __inline__ void flush_sound_buffer(void)
                     82: {
                     83:     if(AUDIO_FILE) {
1.1.1.3 ! root       84:        Write(AUDIO_FILE,
        !            85:              sndbuffer = sndbufpt = (uae_u16*)buffers[bufidx],
        !            86:              sndbufsize);
1.1.1.2   root       87:     } else if(ahiopen) {
                     88: #ifdef USE_AHIDEVICE
                     89:        void *tmp;
                     90: 
                     91:        AHIio[bufidx]->ahir_Std.io_Message.mn_Node.ln_Pri = 0;
                     92:        AHIio[bufidx]->ahir_Std.io_Command  = CMD_WRITE;
                     93:        AHIio[bufidx]->ahir_Std.io_Data     = buffers[bufidx];
                     94:        AHIio[bufidx]->ahir_Std.io_Length   = sndbufsize;
                     95:        AHIio[bufidx]->ahir_Std.io_Offset   = 0;
                     96:        AHIio[bufidx]->ahir_Frequency       = currprefs.sound_freq;
                     97:        if( currprefs.stereo )
1.1.1.3 ! root       98:                AHIio[bufidx]->ahir_Type    = (currprefs.sound_bits==16) ?
1.1.1.2   root       99:                                                AHIST_S16S : AHIST_S8S;
                    100:        else
1.1.1.3 ! root      101:                AHIio[bufidx]->ahir_Type    = (currprefs.sound_bits==16) ?
1.1.1.2   root      102:                                                AHIST_M16S : AHIST_M8S;
                    103:        AHIio[bufidx]->ahir_Volume          = 0x10000;          /* Full volume */
                    104:        AHIio[bufidx]->ahir_Position        = 0x8000;           /* Centered */
                    105:        AHIio[bufidx]->ahir_Link            = linkio;
                    106:        SendIO((struct IORequest *) AHIio[bufidx]);
                    107: 
                    108:        if( linkio ) WaitIO((struct IORequest *) linkio);
                    109:        linkio = AHIio[bufidx];
                    110:        /* double buffering */
                    111:        bufidx = 1 - bufidx;
                    112:        sndbuffer = sndbufpt = (uae_u16*)buffers[bufidx];
                    113: #endif
                    114:    } else {
1.1       root      115:        static char IOSent = 0;
                    116: 
                    117:        AudioIO->ioa_Request.io_Command = CMD_WRITE;
                    118:        AudioIO->ioa_Request.io_Flags   = ADIOF_PERVOL|IOF_QUICK;
                    119:        AudioIO->ioa_Data               = (uae_s8 *)buffers[bufidx];
                    120:        AudioIO->ioa_Length             = sndbufsize;
                    121:        AudioIO->ioa_Period             = period;
                    122:        AudioIO->ioa_Volume             = 64;
                    123:        AudioIO->ioa_Cycles             = 1;
                    124: 
                    125:        if(IOSent) WaitIO((void*)AudioIO); else IOSent=1;
                    126:        BeginIO((void*)AudioIO);
                    127: 
                    128:        /* double buffering */
                    129:        bufidx = 1 - bufidx;
                    130:        sndbuffer = sndbufpt = (uae_u16*)buffers[bufidx];
                    131:     }
                    132: }
                    133: 
                    134: static __inline__ void check_sound_buffers (void)
                    135: {
1.1.1.2   root      136: #ifndef AHI_DMA_MODE
1.1       root      137:     if ((char *)sndbufpt - (char *)sndbuffer >= sndbufsize) {
                    138:        flush_sound_buffer();
                    139:     }
1.1.1.2   root      140: #endif
1.1       root      141: }
                    142: 
1.1.1.2   root      143: #ifdef AHI_DMA_MODE
                    144: #define PUT_SOUND_BYTE(b) \
                    145:        if (sndbufpt == sndbufptrmax) { \
                    146:                sndbufpt = (uae_u16 *)buffers[0]; \
                    147:        } \
                    148:        *(uae_u8 *)sndbufpt = b; \
                    149:        sndbufpt = (uae_u16 *)(((uae_u8 *)sndbufpt) + 1);
                    150: 
                    151: #define PUT_SOUND_WORD(b) \
                    152:        if (sndbufpt == sndbufptrmax) { \
                    153:                sndbufpt = (uae_u16 *)buffers[0]; \
                    154:        } \
                    155:        *(uae_u16 *)sndbufpt = b; \
                    156:        sndbufpt = (uae_u16 *)(((uae_u8 *)sndbufpt) + 2);
                    157: #else
1.1       root      158: #define PUT_SOUND_BYTE(b) do { *(uae_u8 *)sndbufpt = b; sndbufpt = (uae_u16 *)(((uae_u8 *)sndbufpt) + 1); } while (0)
                    159: #define PUT_SOUND_WORD(b) do { *(uae_u16 *)sndbufpt = b; sndbufpt = (uae_u16 *)(((uae_u8 *)sndbufpt) + 2); } while (0)
1.1.1.2   root      160: #endif
                    161: 
                    162: #ifdef USE_AHIDEVICE
                    163: #define HAVE_STEREO_SUPPORT
                    164: /* left and right channel on wrong side */
                    165: #define PUT_SOUND_BYTE_LEFT(b) PUT_SOUND_BYTE(b)
                    166: #define PUT_SOUND_WORD_LEFT(b) PUT_SOUND_WORD(b)
                    167: #define PUT_SOUND_BYTE_RIGHT(b) PUT_SOUND_BYTE(b)
                    168: #define PUT_SOUND_WORD_RIGHT(b) PUT_SOUND_WORD(b)
                    169: #endif
                    170: 
1.1       root      171: #define SOUND16_BASE_VAL 0
                    172: #define SOUND8_BASE_VAL 0
                    173: 
                    174: #define DEFAULT_SOUND_MAXB 8192
                    175: #define DEFAULT_SOUND_MINB 8192
                    176: #define DEFAULT_SOUND_BITS 16
                    177: #define DEFAULT_SOUND_FREQ 11025
                    178: 
                    179: #undef DONT_WANT_SOUND

unix.superglobalmegacorp.com

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