Annotation of uae/src/sd-mme/sound.c, revision 1.1

1.1     ! root        1:  /* 
        !             2:   * UAE - The Un*x Amiga Emulator
        !             3:   * 
        !             4:   * Support for Digital Unix/MME
        !             5:   * 
        !             6:   * Copyright 1997 Marcus Sundberg
        !             7:   */
        !             8: 
        !             9: #define MME_SOUND_C
        !            10: #include "sysconfig.h"
        !            11: #include "sysdeps.h"
        !            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 <sys/ioctl.h>*/
        !            21: #include <mme/mme_api.h>
        !            22: 
        !            23: HWAVEOUT       mme_handle = 0;
        !            24: LPSTR          mme_audiobuf = NULL;
        !            25: LPWAVEHDR      WaveHeader = NULL;
        !            26: static char   *mme_sndbufpt;
        !            27: 
        !            28: static int have_sound;
        !            29: static int bytes_per_sample;
        !            30: 
        !            31: uae_u16 *sndbuffer;
        !            32: uae_u16 *sndbufpt;
        !            33: int sndbufsize;
        !            34: int mme_free_bufs = 0, mme_nextbuf = 0;
        !            35: 
        !            36: 
        !            37: /* callbackfunction used by mme */
        !            38: static void mme_callback(HANDLE hWaveOut,
        !            39:                        UINT wMsg,
        !            40:                        DWORD dwInstance,
        !            41:                        LPARAM lParam1,
        !            42:                        LPARAM lParam2)
        !            43: {
        !            44:   switch(wMsg) {
        !            45:   case WOM_OPEN:
        !            46:   case WOM_CLOSE:
        !            47:     /* Ignore these */
        !            48:     break;
        !            49:   case WOM_DONE:
        !            50:     mme_free_bufs--;
        !            51:     break;
        !            52:   default:
        !            53:     break;
        !            54:   }
        !            55: }
        !            56: 
        !            57: void close_sound(void)
        !            58: {
        !            59:     if (have_sound) {
        !            60:        mmeFreeMem(WaveHeader);
        !            61:        mmeFreeBuffer(mme_audiobuf);
        !            62:        waveOutClose(mme_handle);
        !            63:     }
        !            64:     mme_handle=0;
        !            65: }
        !            66: 
        !            67: int setup_sound(void)
        !            68: {
        !            69:     if (waveOutGetNumDevs() < 1) {
        !            70:        have_sound = 0;
        !            71:        return 0;
        !            72:     }
        !            73:     have_sound = 1;
        !            74: 
        !            75:     sound_available = 1;
        !            76:     return 1;
        !            77: }
        !            78: 
        !            79: int init_sound (void)
        !            80: {
        !            81:     int rate;
        !            82:     int dspbits;
        !            83:     int channels;
        !            84:     MMRESULT     status;
        !            85:     LPPCMWAVEFORMAT waveformat;
        !            86: 
        !            87:     if (currprefs.sound_maxbsiz < 128 || currprefs.sound_maxbsiz > 16384) {
        !            88:        fprintf(stderr, "Sound buffer size %d out of range.\n", currprefs.sound_maxbsiz);
        !            89:        currprefs.sound_maxbsiz = 8192;
        !            90:     }
        !            91:     
        !            92:     sndbufsize = currprefs.sound_maxbsiz;
        !            93: 
        !            94:     dspbits = currprefs.sound_bits;
        !            95: 
        !            96:     rate = currprefs.sound_freq;
        !            97:     
        !            98:     channels = 1;
        !            99:     
        !           100:     if((waveformat = (LPPCMWAVEFORMAT)
        !           101:        mmeAllocMem(sizeof(PCMWAVEFORMAT))) == NULL ) {
        !           102:        fprintf(stderr, "Failed to allocate PCMWAVEFORMAT struct\n");
        !           103:        return 0;
        !           104:     }
        !           105:     waveformat->wf.nSamplesPerSec = rate;
        !           106:     waveformat->wf.nChannels = channels;
        !           107:     waveformat->wBitsPerSample = dspbits;
        !           108:     waveformat->wf.wFormatTag = WAVE_FORMAT_PCM;
        !           109:    
        !           110:     bytes_per_sample = waveformat->wf.nChannels *
        !           111:        (waveformat->wBitsPerSample/8);
        !           112:     waveformat->wf.nBlockAlign = bytes_per_sample;
        !           113:     waveformat->wf.nAvgBytesPerSec = bytes_per_sample *
        !           114:        waveformat->wf.nSamplesPerSec;
        !           115:    
        !           116:     /* Open the audio device with desired rate/format */
        !           117:     status = waveOutOpen( &mme_handle,
        !           118:                          WAVE_MAPPER,
        !           119:                          (LPWAVEFORMAT)waveformat,
        !           120:                          (void (*)())mme_callback,
        !           121:                          (unsigned int)NULL,
        !           122:                          CALLBACK_FUNCTION | WAVE_OPEN_SHAREABLE );
        !           123:     mmeFreeMem(waveformat);
        !           124:    
        !           125:     if(status != MMSYSERR_NOERROR) {
        !           126:        fprintf(stderr, "waveOutOpen failed - status = %d\n", status);
        !           127:        return 0;
        !           128:     }
        !           129:    
        !           130:     /* Allocate wave header for use in write */
        !           131:     if((WaveHeader = (LPWAVEHDR)
        !           132:        mmeAllocMem(sizeof(WAVEHDR))) == NULL ) {
        !           133:        fprintf(stderr, "Failed to allocate WAVEHDR struct\n");
        !           134:        return 0;
        !           135:     }
        !           136:     /* Allocate shared audio buffer for communicating with audio device */
        !           137:     if ((mme_audiobuf = (LPSTR)
        !           138:         mmeAllocBuffer(sndbufsize*SOUND_NUMBUF*bytes_per_sample*2)) == NULL) {
        !           139:        fprintf(stderr, "Failed to allocate shared audio buffer\n");
        !           140:        mmeFreeMem(WaveHeader);
        !           141:        return 0;
        !           142:     }
        !           143:     sndbuffer = mme_audiobuf;
        !           144:     sample_evtime = (long)maxhpos * maxvpos * 50 / rate;
        !           145: 
        !           146:     if (dspbits == 16) {
        !           147:        init_sound_table16 ();
        !           148:        sample_handler = sample16_handler;
        !           149:     } else {
        !           150:        init_sound_table8 ();
        !           151:        sample_handler = sample8_handler;
        !           152:     }
        !           153:     sound_available = 1;
        !           154:     printf ("Sound driver found and configured for %d bits at %d Hz, buffer is %d bytes\n", dspbits, rate, sndbufsize);
        !           155:     mme_sndbufpt = sndbufpt = sndbuffer;
        !           156:     return 1;
        !           157: }
        !           158: 
        !           159: 
        !           160: __inline__ void check_sound_buffers (void)
        !           161: {
        !           162:     if (((char *)sndbufpt - (char *)mme_sndbufpt) < sndbufsize)
        !           163:        return;
        !           164:     if (mmeCheckForCallbacks())
        !           165:        mmeProcessCallbacks();
        !           166:     if (mme_free_bufs >= SOUND_NUMBUF)
        !           167:        return;
        !           168:     WaveHeader->lpData = (LPSTR)mme_sndbufpt;
        !           169:     WaveHeader->dwBufferLength = ((char *)sndbufpt - (char *)mme_sndbufpt);
        !           170:     mme_nextbuf++;
        !           171:     if (mme_nextbuf == SOUND_NUMBUF) {
        !           172:        mme_sndbufpt = sndbuffer;
        !           173:        mme_nextbuf = 0;
        !           174:     }
        !           175:     else mme_sndbufpt += bytes_per_sample*sndbufsize*2;
        !           176:     sndbufpt = mme_sndbufpt;
        !           177:     if (waveOutWrite(mme_handle, WaveHeader,
        !           178:                     sizeof(WAVEHDR)) == MMSYSERR_NOERROR)
        !           179:        mme_free_bufs++;
        !           180: }

unix.superglobalmegacorp.com

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