Annotation of uae/src/od-pOS/sound.c, revision 1.1.1.2

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: 
                     20: #include <pDOS/Lock.h>
                     21: #include <pDOS/Files.h>
                     22: #include <pDOS/DosSig.h>
                     23: #include <pDOS/DosErrors.h>
                     24: #include <pInline/pDos2.h>
                     25: 
                     26: extern struct pOS_DosBase         *gb_DosBase;
                     27: 
                     28: static struct pOS_MsgPort      AudioMP;
                     29: struct pOS_AudioIO     *AudioIO;
                     30: struct pOS_Std8AudioMap AudioMap;
                     31: 
                     32: unsigned char *buffers[2];
                     33: uae_u16 *sndbuffer;
                     34: uae_u16 *sndbufpt;
                     35: int sndbufsize;
                     36: int bufidx;
                     37: static int port_created, devopen, channel_allocated;
                     38: 
                     39: int have_sound;
                     40: 
                     41: FILE *AUDIO_FILE;
                     42: 
                     43: static FILE *TST_AUDIO_FILE(char *buff, char *name, int rate, int bsize)
                     44: {
                     45:     struct pOS_FileLock *lock;
                     46: 
                     47:     if(!name) return 0;
                     48:     sprintf(buff,name,rate,bsize);
                     49:     lock = pOS_LockObject(NULL, buff, FILELKACC_Exclusive|FILELKACC_NoReq);
                     50:     if(lock) {
                     51:         pOS_UnlockObject(lock);
                     52:         return fopen(buff,"wb");
                     53:     }
                     54:     return NULL;
                     55: }
                     56: 
                     57: int setup_sound(void)
                     58: {
                     59:     sound_available = 1;
                     60:     return 1;
                     61: }
                     62: 
                     63: int init_sound (void) 
                     64: {
                     65:     int rate;
                     66:     char buff[256],*devname = NULL;
                     67: 
                     68:     atexit(close_sound); /* if only amiga os had resource tracking */
                     69: 
                     70:     sndbufsize = (currprefs.sound_maxbsiz + 1)&~1;
                     71: 
                     72:     /* check freq */
                     73:     if (!currprefs.sound_freq) currprefs.sound_freq = 11025;
                     74:     rate = currprefs.sound_freq;
                     75: 
                     76:     /* check for $AUDIONAME or AUD: or AUDIO: device */
                     77:     devname = buff;
                     78:     AUDIO_FILE = TST_AUDIO_FILE(buff, getenv("AUDIONAME"),
                     79:                                 rate, sndbufsize);
                     80:     if(!AUDIO_FILE) /* AHI */
                     81:     AUDIO_FILE = TST_AUDIO_FILE(buff, "AUDIO:FREQUENCY=%d/BUFFER=%d",
                     82:                                 rate, sndbufsize);
                     83:     if(!AUDIO_FILE) /* AUD: */
                     84:     AUDIO_FILE = TST_AUDIO_FILE(buff, "AUDIO:FREQUENCY%d/BUFFER%d",
                     85:                                 rate, sndbufsize);
                     86:     if(!AUDIO_FILE)
                     87:     AUDIO_FILE = TST_AUDIO_FILE(buff, "AUD:FREQUENCY%d/BUFFER%d",
                     88:                                 rate, sndbufsize);
                     89: 
                     90:     /* else use audio.device */
                     91:     if(!AUDIO_FILE) {
                     92:         if(!pOS_ConstructMsgPort(&AudioMP)) goto fail;
                     93:         port_created = 1;
                     94:         AudioIO      = (void*)pOS_CreateIORequest(&AudioMP,
                     95:                                                   sizeof(struct pOS_AudioIO));
                     96:         if(!AudioIO) goto fail;
                     97: 
                     98:         if(pOS_OpenDevice(devname = "pAudio.device", 0, (void*)AudioIO, 0,0)) 
                     99:             goto fail;
                    100:         devopen = 1;
                    101: 
                    102:         AudioIO->aio_Command                 = AUDIOCMD_AllocChannel;
                    103:         AudioIO->aio_U.aio_AllocCh.alio_Tags = NULL;
                    104:         if(pOS_DoIO((struct pOS_IORequest*)AudioIO)) goto fail;
                    105:         channel_allocated = 1;
                    106:     }
                    107: 
                    108:     /* get the buffers */
                    109:     if(AUDIO_FILE) {
                    110:         buffers[0] = malloc(sndbufsize);
                    111:         buffers[1] = NULL;
                    112:         if(!buffers[0]) goto fail;
                    113:     } else {
                    114:         buffers[0] = malloc(sndbufsize);
                    115:         buffers[1] = malloc(sndbufsize);
                    116:         if(!buffers[0] || !buffers[1]) goto fail;
                    117:     }
                    118:     bufidx = 0;
                    119:     sndbuffer = sndbufpt = (uae_u16*)buffers[bufidx];
                    120: 
                    121:     AudioIO->aio_U.aio_Map.amio_AudioMap = (struct pOS_AudioMap*)&AudioMap;
                    122:     AudioMap.bam_Audio.am_Type           = AUDIOMAPTYP_Std8Bit;
                    123:     AudioMap.bam_Audio.am_Frequency      = rate;
                    124:     AudioMap.bam_Length                  = sndbufsize;
                    125:     AudioMap.bam_Sample                  = (void*)sndbuffer;
                    126: 
                    127:     sample_evtime = (long)maxhpos * maxvpos * 50 / rate;
                    128:     init_sound_table8 ();
1.1.1.2 ! root      129:     sample_handler = sample8_handler;
1.1       root      130: 
                    131:     fprintf(stderr, "Sound driver found and configured for %d bits "
                    132:                     "at %d Hz, buffer is %d bytes (%s)\n",
                    133:                     8, rate, sndbufsize,devname);
                    134: 
                    135:     sound_available = 1;
                    136:     return 1;
                    137: fail:
                    138:     sound_available = 0;
                    139:     return 0;
                    140: }
                    141: 
                    142: void close_sound(void)
                    143: {
                    144:     if(AUDIO_FILE) {
                    145:         fclose(AUDIO_FILE);
                    146:         AUDIO_FILE = NULL;
                    147:     }
                    148:     if(channel_allocated) {
                    149:         AudioIO->aio_Command = AUDIOCMD_FreeChannel;
                    150:         pOS_DoIO((struct pOS_IORequest*)AudioIO);
                    151:         channel_allocated = 0;
                    152:     }
                    153:     if(devopen) {
                    154:         pOS_CloseDevice((void*)AudioIO);
                    155:         devopen = 0;
                    156:     }
                    157:     if(AudioIO) {
                    158:         pOS_DeleteIORequest((void*)AudioIO);
                    159:         AudioIO = NULL;
                    160:     }
                    161:     if(port_created) {
                    162:         pOS_DestructMsgPort(&AudioMP);
                    163:         port_created = 0;
                    164:     }
                    165:     if(buffers[0]) {free(buffers[0]);buffers[0] = 0;}
                    166:     if(buffers[1]) {free(buffers[1]);buffers[1] = 0;}
                    167: }

unix.superglobalmegacorp.com

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