Annotation of quake1/snd_linux.c, revision 1.1

1.1     ! root        1: #include <unistd.h>
        !             2: #include <fcntl.h>
        !             3: #include <stdlib.h>
        !             4: #include <sys/types.h>
        !             5: #include <sys/ioctl.h>
        !             6: #include <sys/mman.h>
        !             7: #include <sys/shm.h>
        !             8: #include <sys/wait.h>
        !             9: #include <linux/soundcard.h>
        !            10: #include <stdio.h>
        !            11: #include "quakedef.h"
        !            12: 
        !            13: int audio_fd;
        !            14: dma_t the_shm;
        !            15: int snd_inited;
        !            16: 
        !            17: static int tryrates[] = { 44100, 22050, 11025, 8000 };
        !            18: 
        !            19: extern int desired_speed;
        !            20: extern int desired_bits;
        !            21: extern int desired_num_channels;
        !            22: 
        !            23: qboolean SNDDMA_Init(void)
        !            24: {
        !            25: 
        !            26:        int rc;
        !            27:     int fmt;
        !            28:        int tmp;
        !            29:     int i;
        !            30:     char *s;
        !            31:        struct audio_buf_info info;
        !            32:        int caps;
        !            33: 
        !            34:        snd_inited = 0;
        !            35: 
        !            36: // open /dev/dsp, confirm capability to mmap, and get size of dma buffer
        !            37: 
        !            38:     audio_fd = open("/dev/dsp", O_RDWR);
        !            39:     if (audio_fd < 0)
        !            40:        {
        !            41:                perror("/dev/dsp");
        !            42:         Con_Printf("Could not open /dev/dsp\n");
        !            43:                return 0;
        !            44:        }
        !            45: 
        !            46:     rc = ioctl(audio_fd, SNDCTL_DSP_RESET, 0);
        !            47:     if (rc < 0)
        !            48:        {
        !            49:                perror("/dev/dsp");
        !            50:                Con_Printf("Could not reset /dev/dsp\n");
        !            51:                close(audio_fd);
        !            52:                return 0;
        !            53:        }
        !            54: 
        !            55:        if (ioctl(audio_fd, SNDCTL_DSP_GETCAPS, &caps)==-1)
        !            56:        {
        !            57:                perror("/dev/dsp");
        !            58:         Con_Printf("Sound driver too old\n");
        !            59:                close(audio_fd);
        !            60:                return 0;
        !            61:        }
        !            62: 
        !            63:        if (!(caps & DSP_CAP_TRIGGER)
        !            64:                || !(caps & DSP_CAP_MMAP))
        !            65:        {
        !            66:                Con_Printf("Sorry but your soundcard can't do this\n");
        !            67:                close(audio_fd);
        !            68: //             return dmasim_Init();
        !            69:                return 0;
        !            70:        }
        !            71: 
        !            72:     if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info)==-1)
        !            73:     {   
        !            74:         perror("GETOSPACE");
        !            75:                Con_Printf("Um, can't do GETOSPACE?\n");
        !            76:                close(audio_fd);
        !            77:                return 0;
        !            78:     }
        !            79:     
        !            80:        shm = &the_shm;
        !            81:     shm->splitbuffer = 0;
        !            82: 
        !            83: // set sample bits & speed
        !            84: 
        !            85:     s = getenv("QUAKE_SOUND_SAMPLEBITS");
        !            86:     if (s) shm->samplebits = atoi(s);
        !            87:     else
        !            88:     {
        !            89:         ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &fmt);
        !            90:         if (fmt & AFMT_S16_LE) shm->samplebits = 16;
        !            91:         else if (fmt & AFMT_U8) shm->samplebits = 8;
        !            92:     }
        !            93: 
        !            94:                s = getenv("QUAKE_SOUND_SPEED");
        !            95:                if (s) shm->speed = atoi(s);
        !            96:                else
        !            97:                {
        !            98:                        shm->speed = desired_speed;
        !            99:                        if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &shm->speed))
        !           100:                        {
        !           101:                                        for (i=0 ; i<sizeof(tryrates)/4 ; i++)
        !           102:                                                        if (!ioctl(audio_fd, SNDCTL_DSP_SPEED, &tryrates[i])) break;
        !           103:                                        shm->speed = tryrates[i];
        !           104:                        }
        !           105:                }
        !           106: 
        !           107:     s = getenv("QUAKE_SOUND_CHANNELS");
        !           108:     if (s) shm->channels = atoi(s);
        !           109:     else shm->channels = 2;
        !           110:     
        !           111:        shm->samples = info.fragstotal * info.fragsize / (shm->samplebits/8);
        !           112:        shm->submission_chunk = 1;
        !           113: 
        !           114: // memory map the dma buffer
        !           115: 
        !           116:        shm->buffer = (unsigned char *) mmap(NULL, info.fragstotal
        !           117:                * info.fragsize, PROT_WRITE, MAP_FILE|MAP_SHARED, audio_fd, 0);
        !           118:        if (!shm->buffer)
        !           119:        {
        !           120:                perror("/dev/dsp");
        !           121:                Con_Printf("Could not mmap /dev/dsp\n");
        !           122:                close(audio_fd);
        !           123:                return 0;
        !           124:        }
        !           125: 
        !           126:     rc = ioctl(audio_fd, SOUND_PCM_WRITE_CHANNELS, &shm->channels);
        !           127:     if (rc < 0)
        !           128:     {
        !           129:                perror("/dev/dsp");
        !           130:         Con_Printf("Could not set /dev/dsp to stereo=%d", shm->channels);
        !           131:                close(audio_fd);
        !           132:         return 0;
        !           133:     }
        !           134: 
        !           135:     rc = ioctl(audio_fd, SNDCTL_DSP_SPEED, &shm->speed);
        !           136:     if (rc < 0)
        !           137:     {
        !           138:                perror("/dev/dsp");
        !           139:         Con_Printf("Could not set /dev/dsp speed to %d", shm->speed);
        !           140:                close(audio_fd);
        !           141:         return 0;
        !           142:     }
        !           143: 
        !           144:     if (shm->samplebits == 16)
        !           145:     {
        !           146:         rc = AFMT_S16_LE;
        !           147:         rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc);
        !           148:         if (rc < 0)
        !           149:                {
        !           150:                        perror("/dev/dsp");
        !           151:                        Con_Printf("Could not support 16-bit data.  Try 8-bit.\n");
        !           152:                        close(audio_fd);
        !           153:                        return 0;
        !           154:                }
        !           155:     }
        !           156:     else if (shm->samplebits == 8)
        !           157:     {
        !           158:         rc = AFMT_U8;
        !           159:         rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc);
        !           160:         if (rc < 0)
        !           161:                {
        !           162:                        perror("/dev/dsp");
        !           163:                        Con_Printf("Could not support 8-bit data.\n");
        !           164:                        close(audio_fd);
        !           165:                        return 0;
        !           166:                }
        !           167:     }
        !           168:        else
        !           169:        {
        !           170:                perror("/dev/dsp");
        !           171:                Con_Printf("%d-bit sound not supported.", shm->samplebits);
        !           172:                close(audio_fd);
        !           173:                return 0;
        !           174:        }
        !           175: 
        !           176: // toggle the trigger & start her up
        !           177: 
        !           178:     tmp = 0;
        !           179:     ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
        !           180:     tmp = PCM_ENABLE_OUTPUT;
        !           181:     ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
        !           182: 
        !           183:        shm->samplepos = 0;
        !           184: 
        !           185:        snd_inited = 1;
        !           186:        return 1;
        !           187: 
        !           188: }
        !           189: 
        !           190: int SNDDMA_GetDMAPos(void)
        !           191: {
        !           192: 
        !           193:        struct count_info count;
        !           194: 
        !           195:        if (!snd_inited) return 0;
        !           196: 
        !           197:        if (ioctl(audio_fd, SNDCTL_DSP_GETOPTR, &count)==-1)
        !           198:        {
        !           199:                perror("/dev/dsp");
        !           200:                Con_Printf("Uh, sound dead.\n");
        !           201:                close(audio_fd);
        !           202:                snd_inited = 0;
        !           203:                return 0;
        !           204:        }
        !           205: //     shm->samplepos = (count.bytes / (shm->samplebits / 8)) & (shm->samples-1);
        !           206: //     fprintf(stderr, "%d    \r", count.ptr);
        !           207:        shm->samplepos = count.ptr / (shm->samplebits / 8);
        !           208: 
        !           209:        return shm->samplepos;
        !           210: 
        !           211: }
        !           212: 
        !           213: void SNDDMA_Shutdown(void)
        !           214: {
        !           215:        if (snd_inited)
        !           216:        {
        !           217:                close(audio_fd);
        !           218:                snd_inited = 0;
        !           219:        }
        !           220: }
        !           221: 

unix.superglobalmegacorp.com

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