void SNDDMA_Submit(void) { int nFillable, nFilled, nPos; int nFrames, nFramesLeft; unsigned endtime; if (!sgisnd_aport) return; nFillable = alGetFillable( sgisnd_aport ); nFilled = QSND_BUFFER_FRAMES - nFillable; nFrames = dma.samples >> (dma.channels - 1); if (paintedtime - soundtime < nFrames) nFrames = paintedtime - soundtime; if (nFrames <= QSND_SKID) return; nPos = UST_TO_BUFFPOS( sgisnd_startframe ); // dump re-written contents of the buffer if (sgisnd_lastframewritten > sgisnd_startframe) { alDiscardFrames( sgisnd_aport, sgisnd_lastframewritten - sgisnd_startframe ); } else if ((int)(sgisnd_startframe - sgisnd_lastframewritten) >= QSND_BUFFER_FRAMES) { // blow away everything if we've underflowed alDiscardFrames( sgisnd_aport, QSND_BUFFER_FRAMES ); } // don't block if (nFrames > nFillable) nFrames = nFillable; // account for stereo nFramesLeft = nFrames; if (nPos + nFrames * dma.channels > QSND_BUFFER_SIZE) { int nFramesAtEnd = (QSND_BUFFER_SIZE - nPos) >> (dma.channels - 1); alWriteFrames( sgisnd_aport, &dma_buffer[nPos], nFramesAtEnd ); nPos = 0; nFramesLeft -= nFramesAtEnd; }
void sgi_close(void) { /* Ack all remaining packets */ #if (defined(IRIX_DEBUG)) fprintf(stderr, "sgi_close: begin\n"); #endif while (!rdpsnd_queue_empty()) rdpsnd_queue_next(0); alDiscardFrames(output_port, 0); alClosePort(output_port); output_port = (ALport) 0; alFreeConfig(audioconfig); #if (defined(IRIX_DEBUG)) fprintf(stderr, "sgi_close: returning\n"); #endif }
void wave_out_close(void) { /* Ack all remaining packets */ #if (defined(IRIX_DEBUG)) fprintf(stderr, "wave_out_close: begin\n"); #endif while (queue_lo != queue_hi) { rdpsnd_send_completion(packet_queue[queue_lo].tick, packet_queue[queue_lo].index); free(packet_queue[queue_lo].s.data); queue_lo = (queue_lo + 1) % MAX_QUEUE; } alDiscardFrames(output_port, 0); alClosePort(output_port); alFreeConfig(audioconfig); #if (defined(IRIX_DEBUG)) fprintf(stderr, "wave_out_close: returning\n"); #endif }
// stop playing and empty buffers (for seeking/pause) static void reset(void) { mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_SGI_Reset); alDiscardFrames(ao_port, queue_size); }
// stop playing and empty buffers (for seeking/pause) static void reset(void) { mp_tmsg(MSGT_AO, MSGL_INFO, "[AO SGI] reset: ...\n"); alDiscardFrames(ao_port, queue_size); }