Annotation of uae/src/sd-alsa/sound.h, revision 1.1

1.1     ! root        1:  /* 
        !             2:   * UAE - The Un*x Amiga Emulator
        !             3:   * 
        !             4:   * Support for Linux/ALSA sound
        !             5:   * 
        !             6:   * Copyright 1997 Bernd Schmidt
        !             7:   * Copyright 2004 Heikki Orsila
        !             8:   */
        !             9: 
        !            10: #include <alsa/asoundlib.h>
        !            11: 
        !            12: extern int sound_fd;
        !            13: extern uae_u16 sndbuffer[];
        !            14: extern uae_u16 *sndbufpt;
        !            15: extern int sndbufsize;
        !            16: extern snd_pcm_t *alsa_playback_handle;
        !            17: extern int alsa_to_frames_divisor;
        !            18: 
        !            19: /* alsa_xrun_recovery() function is copied from ALSA manual. why the hell did
        !            20:    they make ALSA this hard?! i bet 95% of ALSA programmers would like a
        !            21:    simpler way to do error handling.. let the 5% use tricky APIs.
        !            22: */
        !            23: static int alsa_xrun_recovery(snd_pcm_t *handle, int err)
        !            24: {
        !            25:   if (err == -EPIPE) {
        !            26:     /* under-run */
        !            27:     err = snd_pcm_prepare(handle);
        !            28:     if (err < 0)
        !            29:       fprintf(stderr, "uae: no recovery with alsa from underrun, prepare failed: %s\n", snd_strerror(err));
        !            30:     return 0;
        !            31:   } else if (err == -ESTRPIPE) {
        !            32:     while ((err = snd_pcm_resume(handle)) == -EAGAIN) {
        !            33:       /* wait until the suspend flag is released */
        !            34:       fprintf(stderr, "uae: sleeping for alsa.\n");
        !            35:       sleep(1);
        !            36:     }
        !            37:     if (err < 0) {
        !            38:       err = snd_pcm_prepare(handle);
        !            39:       if (err < 0)
        !            40:        fprintf(stderr, "uae: no recovery with alsa from suspend, prepare failed: %s\n", snd_strerror(err));
        !            41:     }
        !            42:     return 0;
        !            43:   }
        !            44:   return err;
        !            45: }
        !            46: 
        !            47: static void check_sound_buffers (void)
        !            48: {
        !            49:   if ((char *)sndbufpt - (char *)sndbuffer >= sndbufsize) {
        !            50:     int frames = sndbufsize / alsa_to_frames_divisor;
        !            51:     char *buf = (char *) sndbuffer;
        !            52:     int ret;
        !            53:     while (frames > 0) {
        !            54:       ret = snd_pcm_writei(alsa_playback_handle, buf, frames);
        !            55:       if (ret < 0) {
        !            56:        if (ret == -EAGAIN || ret == -EINTR)
        !            57:          continue;
        !            58:        if (alsa_xrun_recovery(alsa_playback_handle, ret) < 0) {
        !            59:          fprintf(stderr, "uae: write error with alsa: %s\n", snd_strerror(ret));
        !            60:          exit(-1);
        !            61:        }
        !            62:        continue;
        !            63:       }
        !            64:       frames -= ret;
        !            65:       buf += ret * alsa_to_frames_divisor;
        !            66:     }
        !            67:     sndbufpt = sndbuffer;
        !            68:   }
        !            69: }
        !            70: 
        !            71: #define PUT_SOUND_BYTE(b) do { *(uae_u8 *)sndbufpt = b; sndbufpt = (uae_u16 *)(((uae_u8 *)sndbufpt) + 1); } while (0)
        !            72: #define PUT_SOUND_WORD(b) do { *(uae_u16 *)sndbufpt = b; sndbufpt = (uae_u16 *)(((uae_u8 *)sndbufpt) + 2); } while (0)
        !            73: #define PUT_SOUND_BYTE_LEFT(b) PUT_SOUND_BYTE(b)
        !            74: #define PUT_SOUND_WORD_LEFT(b) PUT_SOUND_WORD(b)
        !            75: #define PUT_SOUND_BYTE_RIGHT(b) PUT_SOUND_BYTE(b)
        !            76: #define PUT_SOUND_WORD_RIGHT(b) PUT_SOUND_WORD(b)
        !            77: #define SOUND16_BASE_VAL 0
        !            78: #define SOUND8_BASE_VAL 128
        !            79: 
        !            80: #define DEFAULT_SOUND_MAXB 8192
        !            81: #define DEFAULT_SOUND_MINB 8192
        !            82: #define DEFAULT_SOUND_BITS 16
        !            83: #define DEFAULT_SOUND_FREQ 44100
        !            84: #define HAVE_STEREO_SUPPORT

unix.superglobalmegacorp.com

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