Annotation of sbbs/src/xpdev/xpbeep.c, revision 1.1

1.1     ! root        1: /* $Id: xpbeep.c,v 1.46 2006/05/31 05:09:02 deuce Exp $ */
        !             2: 
        !             3: /* standard headers */
        !             4: #include <math.h>
        !             5: 
        !             6: #if defined(_WIN32)
        !             7:        #include <windows.h>
        !             8:        #include <mmsystem.h>
        !             9: #elif defined(__unix__)
        !            10:        #include <fcntl.h>
        !            11:        #if SOUNDCARD_H_IN==1
        !            12:                #include <sys/soundcard.h>
        !            13:        #elif SOUNDCARD_H_IN==2
        !            14:                #include <soundcard.h>
        !            15:        #elif SOUNDCARD_H_IN==3
        !            16:                #include <linux/soundcard.h>
        !            17:        #else
        !            18:                #ifndef USE_ALSA_SOUND
        !            19:                        #warning Cannot find soundcard.h
        !            20:                #endif
        !            21:        #endif
        !            22:        #ifdef USE_ALSA_SOUND
        !            23:                #include <alsa/asoundlib.h>
        !            24:        #endif
        !            25:        /* KIOCSOUND */
        !            26:        #if defined(__FreeBSD__)
        !            27:                #include <sys/kbio.h>
        !            28:        #elif defined(__linux__)
        !            29:                #include <sys/kd.h>     
        !            30:        #elif defined(__solaris__)
        !            31:                #include <sys/kbio.h>
        !            32:                #include <sys/kbd.h>
        !            33:        #endif
        !            34:        #if (defined(__OpenBSD__) || defined(__NetBSD__)) && defined(HAS_MACHINE_SPKR_H)
        !            35:                #include <machine/spkr.h>
        !            36:        #elif defined(__FreeBSD__)
        !            37:                #if defined(HAS_DEV_SPEAKER_SPEAKER_H)
        !            38:                        #include <dev/speaker/speaker.h>
        !            39:                #elif defined(HAS_MACHINE_SPEAKER_H)
        !            40:                        #include <machine/speaker.h>
        !            41:                #endif
        !            42:        #endif
        !            43: #endif
        !            44: 
        !            45: /* xpdev headers */
        !            46: #ifdef WITH_SDL
        !            47: #include "sdlfuncs.h"
        !            48: #endif
        !            49: #include "genwrap.h"
        !            50: #include "xpbeep.h"
        !            51: 
        !            52: #define S_RATE 22050
        !            53: 
        !            54: static BOOL sound_device_open_failed=FALSE;
        !            55: static BOOL alsa_device_open_failed=FALSE;
        !            56: static BOOL sdl_device_open_failed=FALSE;
        !            57: 
        !            58: enum {
        !            59:         SOUND_DEVICE_CLOSED
        !            60:        ,SOUND_DEVICE_WIN32
        !            61:        ,SOUND_DEVICE_ALSA
        !            62:        ,SOUND_DEVICE_OSS
        !            63:        ,SOUND_DEVICE_SDL
        !            64: };
        !            65: 
        !            66: static int handle_type=SOUND_DEVICE_CLOSED;
        !            67: 
        !            68: #ifdef WITH_SDL
        !            69: static SDL_AudioSpec   spec;
        !            70: static int                             sdl_audio_buf_len=0;
        !            71: static int                             sdl_audio_buf_pos=0;
        !            72: static unsigned char   swave[S_RATE*15/2+1];
        !            73: static SDL_sem                 *sdlToneDone;
        !            74: #endif
        !            75: 
        !            76: #ifdef _WIN32
        !            77: static HWAVEOUT                waveOut;
        !            78: static WAVEHDR                 wh;
        !            79: static unsigned char   wave[S_RATE*15/2+1];
        !            80: #endif
        !            81: 
        !            82: #ifdef USE_ALSA_SOUND
        !            83: static snd_pcm_t *playback_handle;
        !            84: #endif
        !            85: 
        !            86: #ifdef AFMT_U8
        !            87: static int dsp;
        !            88: #endif
        !            89: 
        !            90: #define WAVE_PI        3.14159265358979323846
        !            91: #define WAVE_TPI 6.28318530717958647692
        !            92: 
        !            93: #ifdef USE_ALSA_SOUND
        !            94: struct alsa_api_struct {
        !            95:        int             (*snd_pcm_open)
        !            96:                                (snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode);
        !            97:        int             (*snd_pcm_hw_params_malloc)
        !            98:                                (snd_pcm_hw_params_t **ptr);
        !            99:        int             (*snd_pcm_hw_params_any)
        !           100:                                (snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
        !           101:        int             (*snd_pcm_hw_params_set_access)
        !           102:                                (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t _access);
        !           103:        int             (*snd_pcm_hw_params_set_format)
        !           104:                                (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t val);
        !           105:        int             (*snd_pcm_hw_params_set_rate_near)
        !           106:                                (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
        !           107:        int             (*snd_pcm_hw_params_set_channels)
        !           108:                                (snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);
        !           109:        int             (*snd_pcm_hw_params)
        !           110:                                (snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
        !           111:        int             (*snd_pcm_prepare)
        !           112:                                (snd_pcm_t *pcm);
        !           113:        void    (*snd_pcm_hw_params_free)
        !           114:                                (snd_pcm_hw_params_t *obj);
        !           115:        int     (*snd_pcm_close)
        !           116:                                (snd_pcm_t *pcm);
        !           117:        snd_pcm_sframes_t (*snd_pcm_writei)
        !           118:                                (snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size);
        !           119: };
        !           120: 
        !           121: struct alsa_api_struct *alsa_api=NULL;
        !           122: #endif
        !           123: 
        !           124: /********************************************************************************/
        !           125: /* Calculate and generate a sound wave pattern (thanks to Deuce!)                              */
        !           126: /********************************************************************************/
        !           127: void makewave(double freq, unsigned char *wave, int samples, enum WAVE_SHAPE shape)
        !           128: {
        !           129:        int     i;
        !           130:        int midpoint;
        !           131:        double inc;
        !           132:        double pos;
        !           133:        BOOL endhigh;
        !           134: 
        !           135:        midpoint=samples/2;
        !           136:        inc=8.0*atan(1.0);
        !           137:        inc *= ((double)freq / (double)S_RATE);
        !           138: 
        !           139:        for(i=0;i<samples;i++) {
        !           140:                pos=(inc*(double)i);
        !           141:                pos -= (int)(pos/WAVE_TPI)*WAVE_TPI;
        !           142:                switch(shape) {
        !           143:                        case WAVE_SHAPE_SINE:
        !           144:                                wave[i]=(sin (pos))*127+128;
        !           145:                                break;
        !           146:                        case WAVE_SHAPE_SINE_HARM:
        !           147:                                wave[i]=(sin (pos))*64+128;
        !           148:                                wave[i]=(sin ((inc*2)*(double)i))*24;
        !           149:                                wave[i]=(sin ((inc*3)*(double)i))*16;
        !           150:                                break;
        !           151:                        case WAVE_SHAPE_SAWTOOTH:
        !           152:                                wave[i]=(WAVE_TPI-pos)*40.5;
        !           153:                                break;
        !           154:                        case WAVE_SHAPE_SQUARE:
        !           155:                                wave[i]=(pos<WAVE_PI)?255:0;
        !           156:                                break;
        !           157:                        case WAVE_SHAPE_SINE_SAW:
        !           158:                                wave[i]=(((sin (pos))*127+128)+((WAVE_TPI-pos)*40.5))/2;
        !           159:                                break;
        !           160:                        case WAVE_SHAPE_SINE_SAW_CHORD:
        !           161:                                wave[i]=(((sin (pos))*64+128)+((WAVE_TPI-pos)*6.2))/2;
        !           162:                                wave[i]+=(sin ((inc/2)*(double)i))*24;
        !           163:                                wave[i]+=(sin ((inc/3)*(double)i))*16;
        !           164:                                break;
        !           165:                        case WAVE_SHAPE_SINE_SAW_HARM:
        !           166:                                wave[i]=(((sin (pos))*64+128)+((WAVE_TPI-pos)*6.2))/2;
        !           167:                                wave[i]+=(sin ((inc*2)*(double)i))*24;
        !           168:                                wave[i]+=(sin ((inc*3)*(double)i))*16;
        !           169:                                break;
        !           170:                }
        !           171:        }
        !           172: 
        !           173:        /* Now we have a "perfect" wave... 
        !           174:         * we must clean it up now to avoid click/pop
        !           175:         */
        !           176:        if(wave[samples-1]>128)
        !           177:                endhigh=TRUE;
        !           178:        else
        !           179:                endhigh=FALSE;
        !           180:        /* Completely remove the last wave fragment */
        !           181:        i=samples-1;
        !           182:        if(wave[i]!=128) {
        !           183:                for(;i>midpoint;i--) {
        !           184:                        if(endhigh && wave[i]<128)
        !           185:                                break;
        !           186:                        if(!endhigh && wave[i]>128)
        !           187:                                break;
        !           188:                        wave[i]=128;
        !           189:                }
        !           190:        }
        !           191: }
        !           192: 
        !           193: #ifdef WITH_SDL
        !           194: void sdl_fillbuf(void *userdata, Uint8 *stream, int len)
        !           195: {
        !           196:        int     copylen=len;
        !           197:        int maxlen=sdl_audio_buf_len-sdl_audio_buf_pos;
        !           198: 
        !           199:        /* Copy in the current buffer */
        !           200:        if(copylen>maxlen)
        !           201:                copylen=maxlen;
        !           202:        /* Fill with silence */
        !           203:        if(len>copylen)
        !           204:                memset(stream+copylen, spec.silence, len-copylen);
        !           205:        if(copylen) {
        !           206:                memcpy(stream, swave+sdl_audio_buf_pos, copylen);
        !           207:                sdl_audio_buf_pos+=copylen;
        !           208:                /* If we're done, post the semaphore */
        !           209:                if(sdl_audio_buf_pos>=sdl_audio_buf_len) {
        !           210:                        sdl.SemPost(sdlToneDone);
        !           211:                        sdl_audio_buf_len=0;
        !           212:                        sdl_audio_buf_pos=0;
        !           213:                }
        !           214:        }
        !           215: }
        !           216: #endif
        !           217: 
        !           218: BOOL xptone_open(void)
        !           219: {
        !           220: #ifdef _WIN32
        !           221:        WAVEFORMATEX    w;
        !           222: #endif
        !           223: 
        !           224: #ifdef AFMT_U8
        !           225:        int format=AFMT_U8;
        !           226:        int channels=1;
        !           227:        int     rate=S_RATE;
        !           228:        int     fragsize=0x7fff0004;
        !           229: #endif
        !           230: 
        !           231:        /* Already open */
        !           232:        if(handle_type!=SOUND_DEVICE_CLOSED)
        !           233:                return(TRUE);
        !           234: 
        !           235: #ifdef WITH_SDL
        !           236:        if(!sdl_device_open_failed) {
        !           237:                if(init_sdl_audio()==-1)
        !           238:                        sdl_device_open_failed=TRUE;
        !           239:                else {
        !           240:                        spec.freq=22050;
        !           241:                        spec.format=AUDIO_U8;
        !           242:                        spec.channels=1;
        !           243:                        spec.samples=256;               /* Size of audio buffer */
        !           244:                        spec.size=256;
        !           245:                        spec.callback=sdl_fillbuf;
        !           246:                        spec.userdata=NULL;
        !           247:                        if(sdl.OpenAudio(&spec, NULL)==-1) {
        !           248:                                sdl_device_open_failed=TRUE;
        !           249:                        }
        !           250:                        else {
        !           251:                                sdlToneDone=sdl.SDL_CreateSemaphore(0);
        !           252:                                sdl_audio_buf_len=0;
        !           253:                                sdl_audio_buf_pos=0;
        !           254:                                sdl.PauseAudio(FALSE);
        !           255:                                handle_type=SOUND_DEVICE_SDL;
        !           256:                                return(TRUE);
        !           257:                        }
        !           258:                }
        !           259:        }
        !           260: #endif
        !           261: 
        !           262: #ifdef _WIN32
        !           263:        if(!sound_device_open_failed) {
        !           264:                w.wFormatTag = WAVE_FORMAT_PCM;
        !           265:                w.nChannels = 1;
        !           266:                w.nSamplesPerSec = S_RATE;
        !           267:                w.wBitsPerSample = 8;
        !           268:                w.nBlockAlign = (w.wBitsPerSample * w.nChannels) / 8;
        !           269:                w.nAvgBytesPerSec = w.nSamplesPerSec * w.nBlockAlign;
        !           270: 
        !           271:                if(!sound_device_open_failed && waveOutOpen(&waveOut, WAVE_MAPPER, &w, 0, 0, 0)!=MMSYSERR_NOERROR)
        !           272:                        sound_device_open_failed=TRUE;
        !           273:                if(sound_device_open_failed)
        !           274:                        return(FALSE);
        !           275:                memset(&wh, 0, sizeof(wh));
        !           276:                wh.lpData=wave;
        !           277:                wh.dwBufferLength=S_RATE*15/2+1;
        !           278:                if(waveOutPrepareHeader(waveOut, &wh, sizeof(wh))!=MMSYSERR_NOERROR) {
        !           279:                        sound_device_open_failed=TRUE;
        !           280:                        waveOutClose(waveOut);
        !           281:                        return(FALSE);
        !           282:                }
        !           283:                handle_type=SOUND_DEVICE_WIN32;
        !           284:                if(!sound_device_open_failed)
        !           285:                        return(TRUE);
        !           286:        }
        !           287: #endif
        !           288: 
        !           289: #ifdef USE_ALSA_SOUND
        !           290:        if(!alsa_device_open_failed) {
        !           291:                if(alsa_api==NULL) {
        !           292:                        if(((alsa_api=(struct alsa_api_struct *)malloc(sizeof(struct alsa_api_struct)))==NULL)
        !           293:                                        || ((dl=dlopen("libasound.so",RTLD_LAZY))==NULL)
        !           294:                                        || ((alsa_api->snd_pcm_open=dlsym(dl,"snd_pcm_open"))==NULL)
        !           295:                                        || ((alsa_api->snd_pcm_hw_params_malloc=dlsym(dl,"snd_pcm_hw_params_malloc"))==NULL)
        !           296:                                        || ((alsa_api->snd_pcm_hw_params_any=dlsym(dl,"snd_pcm_hw_params_any"))==NULL)
        !           297:                                        || ((alsa_api->snd_pcm_hw_params_set_access=dlsym(dl,"snd_pcm_hw_params_set_access"))==NULL)
        !           298:                                        || ((alsa_api->snd_pcm_hw_params_set_format=dlsym(dl,"snd_pcm_hw_params_set_format"))==NULL)
        !           299:                                        || ((alsa_api->snd_pcm_hw_params_set_rate_near=dlsym(dl,"snd_pcm_hw_params_set_rate_near"))==NULL)
        !           300:                                        || ((alsa_api->snd_pcm_hw_params_set_channels=dlsym(dl,"snd_pcm_hw_params_set_channels"))==NULL)
        !           301:                                        || ((alsa_api->snd_pcm_hw_params=dlsym(dl,"snd_pcm_hw_params"))==NULL)
        !           302:                                        || ((alsa_api->snd_pcm_prepare=dlsym(dl,"snd_pcm_prepare"))==NULL)
        !           303:                                        || ((alsa_api->snd_pcm_hw_params_free=dlsym(dl,"snd_pcm_hw_params_free"))==NULL)
        !           304:                                        || ((alsa_api->snd_pcm_close=dlsym(dl,"snd_pcm_close"))==NULL)
        !           305:                                        || ((alsa_api->snd_pcm_writei=dlsym(dl,"snd_pcm_writei"))==NULL)
        !           306:                                        || ((alsa_api->=dlsym(dl,""))==NULL)) {
        !           307:                                alsa_device_open_failed=TRUE;
        !           308:                        }
        !           309:                        if(alsa_api==NULL)
        !           310:                                alsa_device_open_failed=TRUE;
        !           311:                }
        !           312:                if(alsa_api!=NULL) {
        !           313:                        if((alsa_api->snd_pcm_open(&playback_handle, argv[1], SND_PCM_STREAM_PLAYBACK, 0)<0)
        !           314:                                        || (alsa_api->snd_pcm_hw_params_malloc(&hw_params)<0)
        !           315:                                        || (alsa_api->snd_pcm_hw_params_any(playback_handle, hw_params)<0)
        !           316:                                        || (alsa_api->snd_pcm_hw_params_set_access(playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED) < 0)
        !           317:                                        || (alsa_api->snd_pcm_hw_params_set_format(playback_handle, hw_params, SND_PCM_FORMAT_U8) < 0)
        !           318:                                        || (alsa_api->snd_pcm_hw_params_set_rate_near(playback_handle, hw_params, S_RATE, 0) < 0) 
        !           319:                                        || (alsa_api->snd_pcm_hw_params_set_channels(playback_handle, hw_params, 1) < 0)
        !           320:                                        || (alsa_api->snd_pcm_hw_params(playback_handle, hw_params) < 0)
        !           321:                                        || (alsa_api->snd_pcm_prepare(playback_handle) < 0)) {
        !           322:                                alsa_device_open_failed=TRUE;
        !           323:                                if(hw_params!=NULL)
        !           324:                                        alsa_api->snd_pcm_hw_params_free(hw_params);
        !           325:                                if(playback_handle!=NULL) {
        !           326:                                        alsa_api->snd_pcm_close(playback_handle);
        !           327:                                        playback_handle=NULL;
        !           328:                                }
        !           329:                        }
        !           330:                        else {
        !           331:                                handle_type=SOUND_DEVICE_ALSA;
        !           332:                                return(TRUE);
        !           333:                        }
        !           334:                }
        !           335:        }
        !           336: #endif
        !           337: 
        !           338: #ifdef AFMT_U8
        !           339:        if(!sound_device_open_failed) {
        !           340:                if((dsp=open("/dev/dsp",O_WRONLY,0))<0) {
        !           341:                        sound_device_open_failed=TRUE;
        !           342:                }
        !           343:                else  {
        !           344:                        ioctl(dsp, SNDCTL_DSP_SETFRAGMENT, &fragsize);
        !           345:                        if((ioctl(dsp, SNDCTL_DSP_SETFMT, &format)==-1) || format!=AFMT_U8) {
        !           346:                                sound_device_open_failed=TRUE;
        !           347:                                close(dsp);
        !           348:                        }
        !           349:                        else if((ioctl(dsp, SNDCTL_DSP_CHANNELS, &channels)==-1) || channels!=1) {
        !           350:                                sound_device_open_failed=TRUE;
        !           351:                                close(dsp);
        !           352:                        }
        !           353:                        else if((ioctl(dsp, SNDCTL_DSP_SPEED, &rate)==-1) || rate!=S_RATE) {
        !           354:                                sound_device_open_failed=TRUE;
        !           355:                                close(dsp);
        !           356:                        }
        !           357:                }
        !           358:        }
        !           359:        if(sound_device_open_failed)
        !           360:                return(FALSE);
        !           361:        handle_type=SOUND_DEVICE_OSS;
        !           362:        if(!sound_device_open_failed)
        !           363:                return(TRUE);
        !           364: #endif
        !           365:        return(FALSE);
        !           366: }
        !           367: 
        !           368: BOOL xptone_close(void)
        !           369: {
        !           370: #ifdef WITH_SDL
        !           371:        if(handle_type==SOUND_DEVICE_SDL) {
        !           372:                sdl.CloseAudio();
        !           373:                sdl.SDL_DestroySemaphore(sdlToneDone);
        !           374:        }
        !           375: #endif
        !           376: 
        !           377: #ifdef _WIN32
        !           378:        if(handle_type==SOUND_DEVICE_WIN32) {
        !           379:                waveOutClose(waveOut);
        !           380:                while(waveOutUnprepareHeader(waveOut, &wh, sizeof(wh))==WAVERR_STILLPLAYING)
        !           381:                        SLEEP(1);
        !           382:        }
        !           383: #endif
        !           384: 
        !           385: #ifdef USE_ALSA_SOUND
        !           386:        if(handle_type==SOUND_DEVICE_ALSA)
        !           387:                alsa_api->snd_pcm_close (playback_handle);
        !           388: #endif
        !           389: 
        !           390: #ifdef AFMT_U8
        !           391:        if(handle_type==SOUND_DEVICE_OSS)
        !           392:                close(dsp);
        !           393: #endif
        !           394:        handle_type=SOUND_DEVICE_CLOSED;
        !           395:        sound_device_open_failed=FALSE;
        !           396:        alsa_device_open_failed=FALSE;
        !           397:        sdl_device_open_failed=FALSE;
        !           398: 
        !           399:        return(TRUE);
        !           400: }
        !           401: 
        !           402: /********************************************************************************/
        !           403: /* Play a tone through the wave/DSP output device (sound card) - Deuce                 */
        !           404: /********************************************************************************/
        !           405: 
        !           406: BOOL DLLCALL xptone(double freq, DWORD duration, enum WAVE_SHAPE shape)
        !           407: {
        !           408:        BOOL                    must_close=FALSE;
        !           409: 
        !           410: #if defined(USE_ALSA_SOUND) || defined(AFMT_U8)
        !           411:        unsigned char   wave[S_RATE*15/2+1];
        !           412:        int samples;
        !           413: #endif
        !           414: 
        !           415: #ifdef USE_ALSA_SOUND
        !           416:        snd_pcm_hw_params_t *hw_params=NULL;
        !           417:        void *dl;
        !           418: #endif
        !           419: 
        !           420: #ifdef AFMT_U8
        !           421:        int wr;
        !           422:        int     i;
        !           423: #endif
        !           424: 
        !           425:        if(handle_type==SOUND_DEVICE_CLOSED) {
        !           426:                must_close=TRUE;
        !           427:                if(!xptone_open())
        !           428:                        return(FALSE);
        !           429:        }
        !           430: 
        !           431: #ifdef WITH_SDL
        !           432:        if(handle_type==SOUND_DEVICE_SDL) {
        !           433:                sdl.LockAudio();
        !           434:                sdl_audio_buf_pos=0;
        !           435:                sdl_audio_buf_len=S_RATE*duration/1000;
        !           436:                if(sdl_audio_buf_len<=S_RATE/freq*2)
        !           437:                        sdl_audio_buf_len=S_RATE/freq*2;
        !           438:                makewave(freq,swave,sdl_audio_buf_len,shape);
        !           439:                sdl.UnlockAudio();
        !           440:                sdl.SemWait(sdlToneDone);
        !           441:        }
        !           442: #endif
        !           443: 
        !           444: #ifdef _WIN32
        !           445:        if(handle_type==SOUND_DEVICE_WIN32) {
        !           446:                wh.dwBufferLength=S_RATE*duration/1000;
        !           447:                if(wh.dwBufferLength<=S_RATE/freq*2)
        !           448:                        wh.dwBufferLength=S_RATE/freq*2;
        !           449: 
        !           450:                makewave(freq,wave,wh.dwBufferLength,shape);
        !           451: 
        !           452:                if(waveOutWrite(waveOut, &wh, sizeof(wh))==MMSYSERR_NOERROR) {
        !           453:                        while(!(wh.dwFlags & WHDR_DONE))
        !           454:                                SLEEP(1);
        !           455:                }
        !           456:        }
        !           457: #endif
        !           458: 
        !           459: #if defined(USE_ALSA_SOUND) || defined(AFMT_U8)
        !           460:        if(freq<17)
        !           461:                freq=17;
        !           462:        samples=S_RATE*duration/1000;
        !           463:        if(samples<=S_RATE/freq*2)
        !           464:                samples=S_RATE/freq*2;
        !           465:        makewave(freq,wave,samples,shape);
        !           466: #endif
        !           467: 
        !           468: #ifdef USE_ALSA_SOUND
        !           469:        if(handle_type==SOUND_DEVICE_ALSA) {
        !           470:                alsa_api->snd_pcm_hw_params_free(hw_params);
        !           471:                if(alsa_api->snd_pcm_writei(handle, wave, samples)!=samples) {
        !           472:                        /* Go back and try OSS */
        !           473:                        alsa_device_open_failed=TRUE;
        !           474:                        alsa_api->snd_pcm_close (handle);
        !           475:                        xptone_open();
        !           476:                }
        !           477:                else {
        !           478:                        if(must_close)
        !           479:                                xptone_close();
        !           480:                        return(TRUE);
        !           481:                }
        !           482:        }
        !           483: #endif
        !           484: 
        !           485: #ifdef AFMT_U8
        !           486:        if(handle_type==SOUND_DEVICE_OSS) {
        !           487:                wr=0;
        !           488:                while(wr<samples) {
        !           489:                        i=write(dsp, wave+wr, samples-wr);
        !           490:                        if(i>=0)
        !           491:                                wr+=i;
        !           492:                }
        !           493:                if(must_close)
        !           494:                        xptone_close();
        !           495:                return(TRUE);
        !           496:        }
        !           497: #endif
        !           498:        if(must_close)
        !           499:                xptone_close();
        !           500:        return(FALSE);
        !           501: }
        !           502: 
        !           503: #ifdef __unix__
        !           504: /****************************************************************************/
        !           505: /* Generate a tone at specified frequency for specified milliseconds           */
        !           506: /* Thanks to Casey Martin (and Deuce) for this code                                                    */
        !           507: /****************************************************************************/
        !           508: void DLLCALL unix_beep(int freq, int dur)
        !           509: {
        !           510:        static int console_fd=-1;
        !           511: 
        !           512: #if (defined(__FreeBSD__) && defined(HAS_MACHINE_SPEAKER_H)) || ((defined(__OpenBSD__) || defined(__NetBSD__)) && defined(HAS_MACHINE_SPKR_H))
        !           513:        int speaker_fd=-1;
        !           514:        tone_t tone;
        !           515: 
        !           516:        speaker_fd = open("/dev/speaker", O_WRONLY|O_APPEND);
        !           517:        if(speaker_fd != -1)  {
        !           518:                tone.frequency=freq;
        !           519:                tone.duration=dur/10;
        !           520:                ioctl(speaker_fd,SPKRTONE,&tone);
        !           521:                close(speaker_fd);
        !           522:                return;
        !           523:        }
        !           524: #endif
        !           525: 
        !           526: #if !defined(__GNU__) && !defined(__QNX__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__APPLE__) && !defined(__CYGWIN__)
        !           527:        if(console_fd == -1) 
        !           528:                console_fd = open("/dev/console", O_NOCTTY);
        !           529:        
        !           530:        if(console_fd != -1) {
        !           531: #if defined(__solaris__)
        !           532:                ioctl(console_fd, KIOCCMD, KBD_CMD_BELL);
        !           533: #else
        !           534:                if(freq != 0)   /* Don't divide by zero */
        !           535:                        ioctl(console_fd, KIOCSOUND, (int) (1193180 / freq));
        !           536: #endif /* solaris */
        !           537:                SLEEP(dur);
        !           538: #if defined(__solaris__)
        !           539:                ioctl(console_fd, KIOCCMD, KBD_CMD_NOBELL);     /* turn off tone */
        !           540: #else
        !           541:                ioctl(console_fd, KIOCSOUND, 0);        /* turn off tone */
        !           542: #endif /* solaris */
        !           543:        }
        !           544: #endif
        !           545: }
        !           546: 
        !           547: #endif
        !           548: 
        !           549: /********************************************************************************/
        !           550: /* Play sound through DSP/wave device, if unsuccessful, play through PC speaker        */
        !           551: /********************************************************************************/
        !           552: void xpbeep(double freq, DWORD duration)
        !           553: {
        !           554:        if(xptone(freq,duration,WAVE_SHAPE_SINE_SAW_HARM))
        !           555:                return;
        !           556: 
        !           557: #if defined(_WIN32)
        !           558:        Beep((DWORD)(freq+.5), duration);
        !           559: #elif defined(__unix__)
        !           560:        unix_beep((int)(freq+.5),duration);
        !           561: #endif
        !           562: }

unix.superglobalmegacorp.com

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