Annotation of quake2/irix/snd_irix.c, revision 1.1

1.1     ! root        1: #include <dmedia/dmedia.h>
        !             2: #include <dmedia/audio.h>
        !             3: 
        !             4: #include "../client/client.h"
        !             5: #include "../client/snd_loc.h"
        !             6: 
        !             7: /*
        !             8: ==================
        !             9: SNDDM_Init
        !            10: 
        !            11: Try to find a sound device to mix for.
        !            12: Returns false if nothing is found.
        !            13: Returns true and fills in the "dma" structure with information for the mixer.
        !            14: ==================
        !            15: */
        !            16: 
        !            17: // must be power of two!
        !            18: #define QSND_SKID          2
        !            19: #define QSND_BUFFER_FRAMES  8192
        !            20: #define QSND_BUFFER_SIZE    (QSND_BUFFER_FRAMES*2)
        !            21: 
        !            22: #define UST_TO_BUFFPOS(ust) ((int)((ust) & (QSND_BUFFER_FRAMES - 1)) << 1)
        !            23: 
        !            24: cvar_t *s_loadas8bit;
        !            25: cvar_t *s_khz;
        !            26: cvar_t *sndchannels;
        !            27: 
        !            28: short int dma_buffer[QSND_BUFFER_SIZE];
        !            29: ALport sgisnd_aport = NULL;
        !            30: long long sgisnd_startframe;
        !            31: double sgisnd_frames_per_ns;
        !            32: long long sgisnd_lastframewritten = 0;
        !            33: 
        !            34: qboolean SNDDMA_Init(void)
        !            35: {
        !            36:     ALconfig   ac = NULL;
        !            37:     ALpv       pvbuf[2];
        !            38: 
        !            39:     s_loadas8bit = Cvar_Get("s_loadas8bit", "16", CVAR_ARCHIVE);
        !            40:     if ((int)s_loadas8bit->value)
        !            41:        dma.samplebits = 8;
        !            42:     else
        !            43:        dma.samplebits = 16;
        !            44: 
        !            45:     if (dma.samplebits != 16) {
        !            46:        Com_Printf("Don't currently support %i-bit data.  Forcing 16-bit.\n",
        !            47:                   dma.samplebits);
        !            48:        dma.samplebits = 16;
        !            49:        Cvar_SetValue( "s_loadas8bit", false );
        !            50:     }
        !            51: 
        !            52:     s_khz = Cvar_Get("s_khz", "0", CVAR_ARCHIVE);
        !            53:     switch ((int)s_khz->value) {
        !            54:     case 48:
        !            55:        dma.speed = AL_RATE_48000;
        !            56:        break;
        !            57:     case 44:
        !            58:        dma.speed = AL_RATE_44100;
        !            59:        break;
        !            60:     case 32:
        !            61:        dma.speed = AL_RATE_32000;
        !            62:        break;
        !            63:     case 22:
        !            64:        dma.speed = AL_RATE_22050;
        !            65:        break;
        !            66:     case 16:
        !            67:        dma.speed = AL_RATE_16000;
        !            68:        break;
        !            69:     case 11:
        !            70:        dma.speed = AL_RATE_11025;
        !            71:        break;
        !            72:     case 8:
        !            73:        dma.speed = AL_RATE_8000;
        !            74:        break;
        !            75:     default:
        !            76:        dma.speed = AL_RATE_22050;
        !            77:        Com_Printf("Don't currently support %i kHz sample rate.  Using %i.\n",
        !            78:                   (int)s_khz->value, (int)(dma.speed/1000));
        !            79:     }
        !            80:     
        !            81:     sndchannels = Cvar_Get("sndchannels", "2", CVAR_ARCHIVE);
        !            82:     dma.channels = (int)sndchannels->value;
        !            83:     if (dma.channels != 2)
        !            84:        Com_Printf("Don't currently support %i sound channels.  Try 2.\n",
        !            85:                   sndchannels);
        !            86: 
        !            87:     /***********************/
        !            88: 
        !            89:     ac = alNewConfig();
        !            90:     alSetChannels( ac, AL_STEREO );
        !            91:     alSetSampFmt( ac, AL_SAMPFMT_TWOSCOMP );
        !            92:     alSetQueueSize( ac, QSND_BUFFER_FRAMES );
        !            93:     if (dma.samplebits == 8)
        !            94:        alSetWidth( ac, AL_SAMPLE_8 );
        !            95:     else
        !            96:        alSetWidth( ac, AL_SAMPLE_16 );
        !            97: 
        !            98:     sgisnd_aport = alOpenPort( "Quake", "w", ac );
        !            99:     if (!sgisnd_aport)
        !           100:     {
        !           101:        printf( "failed to open audio port!\n" );
        !           102:     }
        !           103: 
        !           104:     // set desired sample rate
        !           105:     pvbuf[0].param = AL_MASTER_CLOCK;
        !           106:     pvbuf[0].value.i = AL_CRYSTAL_MCLK_TYPE;
        !           107:     pvbuf[1].param = AL_RATE;
        !           108:     pvbuf[1].value.ll = alIntToFixed( dma.speed );
        !           109:     alSetParams( alGetResource( sgisnd_aport ), pvbuf, 2 );
        !           110:     if (pvbuf[1].sizeOut < 0)
        !           111:        printf( "illegal sample rate %d\n", dma.speed );
        !           112: 
        !           113:     sgisnd_frames_per_ns = dma.speed * 1.0e-9;
        !           114: 
        !           115:     dma.samples = sizeof(dma_buffer)/(dma.samplebits/8);
        !           116:     dma.submission_chunk = 1;
        !           117: 
        !           118:     dma.buffer = (unsigned char *)dma_buffer;
        !           119: 
        !           120:     dma.samplepos = 0;
        !           121: 
        !           122:     alFreeConfig( ac );
        !           123:     return true;
        !           124: }
        !           125: 
        !           126: 
        !           127: /*
        !           128: ==============
        !           129: SNDDMA_GetDMAPos
        !           130: 
        !           131: return the current sample position (in mono samples, not stereo)
        !           132: inside the recirculating dma buffer, so the mixing code will know
        !           133: how many sample are required to fill it up.
        !           134: ===============
        !           135: */
        !           136: int SNDDMA_GetDMAPos(void)
        !           137: {
        !           138:     long long ustFuture, ustNow;
        !           139:     if (!sgisnd_aport) return( 0 );
        !           140:     alGetFrameTime( sgisnd_aport, &sgisnd_startframe, &ustFuture );
        !           141:     dmGetUST( (unsigned long long *)&ustNow );
        !           142:     sgisnd_startframe -= (long long)((ustFuture - ustNow) * sgisnd_frames_per_ns);
        !           143:     sgisnd_startframe += 100;
        !           144: //printf( "frame %ld pos %d\n", frame, UST_TO_BUFFPOS( sgisnd_startframe ) );
        !           145:     return( UST_TO_BUFFPOS( sgisnd_startframe ) );
        !           146: }
        !           147: 
        !           148: /*
        !           149: ==============
        !           150: SNDDMA_Shutdown
        !           151: 
        !           152: Reset the sound device for exiting
        !           153: ===============
        !           154: */
        !           155: void SNDDMA_Shutdown(void)
        !           156: {
        !           157:     if (sgisnd_aport) alClosePort( sgisnd_aport ), sgisnd_aport = NULL;
        !           158:     return;
        !           159: }
        !           160: 
        !           161: /*
        !           162: ==============
        !           163: SNDDMA_Submit
        !           164: 
        !           165: Send sound to device if buffer isn't really the dma buffer
        !           166: ===============
        !           167: */
        !           168: 
        !           169: extern int soundtime;
        !           170: 
        !           171: void SNDDMA_Submit(void)
        !           172: {
        !           173:     int nFillable, nFilled, nPos;
        !           174:     int nFrames, nFramesLeft;
        !           175:     unsigned endtime;
        !           176: 
        !           177:     if (!sgisnd_aport) return;
        !           178: 
        !           179:     nFillable = alGetFillable( sgisnd_aport );
        !           180:     nFilled = QSND_BUFFER_FRAMES - nFillable;
        !           181: 
        !           182:     nFrames = dma.samples >> (dma.channels - 1);
        !           183: 
        !           184:     if (paintedtime - soundtime < nFrames)
        !           185:        nFrames = paintedtime - soundtime;
        !           186: 
        !           187:     if (nFrames <= QSND_SKID) return;
        !           188: 
        !           189:     nPos = UST_TO_BUFFPOS( sgisnd_startframe );
        !           190: 
        !           191:     // dump re-written contents of the buffer
        !           192:     if (sgisnd_lastframewritten > sgisnd_startframe)
        !           193:     {
        !           194:        alDiscardFrames( sgisnd_aport, sgisnd_lastframewritten - sgisnd_startframe );
        !           195:     }
        !           196:     else if ((int)(sgisnd_startframe - sgisnd_lastframewritten) >= QSND_BUFFER_FRAMES)
        !           197:     {
        !           198:        // blow away everything if we've underflowed
        !           199:        alDiscardFrames( sgisnd_aport, QSND_BUFFER_FRAMES );
        !           200:     }
        !           201: 
        !           202:     // don't block
        !           203:     if (nFrames > nFillable) nFrames = nFillable;
        !           204: 
        !           205:     // account for stereo
        !           206:     nFramesLeft = nFrames;
        !           207:     if (nPos + nFrames * dma.channels > QSND_BUFFER_SIZE)
        !           208:     {
        !           209:        int nFramesAtEnd = (QSND_BUFFER_SIZE - nPos) >> (dma.channels - 1);
        !           210:        
        !           211:        alWriteFrames( sgisnd_aport, &dma_buffer[nPos], nFramesAtEnd );
        !           212:        nPos = 0;
        !           213:        nFramesLeft -= nFramesAtEnd;
        !           214:     }
        !           215:     alWriteFrames( sgisnd_aport, &dma_buffer[nPos], nFramesLeft );
        !           216: 
        !           217:     sgisnd_lastframewritten = sgisnd_startframe + nFrames;
        !           218: }
        !           219: 
        !           220: void SNDDMA_BeginPainting (void)
        !           221: {
        !           222: }

unix.superglobalmegacorp.com

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