static OSStatus OSX_AudioIOProcFloat (AudioDeviceID inDevice, const AudioTimeStamp *inNow, const AudioBufferList *inInputData, const AudioTimeStamp *inInputTime, AudioBufferList *outOutputData, const AudioTimeStamp *inOutputTime, void *inClientData) { register float *myOutBuffer = (float *) outOutputData->mBuffers[0].mData; register float *myInBuffer; register UInt32 i; #if USE_FILL_THREAD pthread_mutex_lock (&gBufferMutex); #if DEBUG_TRACE_THREADS fprintf(stderr,"playing buffer #%d\n", gCurrentPlayBuffer); #endif myInBuffer = (float *) gSoundBackBuffer[gCurrentPlayBuffer]; if (++gCurrentPlayBuffer >= NUMBER_BACK_BUFFERS) gCurrentPlayBuffer = 0; // ... perhaps wash the windshield pthread_cond_signal (&gBufferCondition); pthread_mutex_unlock (&gBufferMutex); #else // avoid copy, if no conversion needed myInBuffer = (gBufferMono2Stereo) ? (float *) gSoundBuffer : myOutBuffer; FILL_BUFFER( myInBuffer, gInBufferSize); #endif /* USE_FILL_THREAD */ if (gBufferMono2Stereo) { for (i = 0; i < SOUND_BUFFER_SIZE >> 1; i++) { myOutBuffer[1] = myOutBuffer[0] = *myInBuffer++; myOutBuffer+=2; } } else if (myInBuffer != myOutBuffer) { for (i = 0; i < SOUND_BUFFER_SIZE; i++) { *myOutBuffer++ = *myInBuffer++; } } return 0; }
static OSStatus OSX_AudioIOProc8Bit (AudioDeviceID inDevice, const AudioTimeStamp *inNow, const AudioBufferList *inInputData, const AudioTimeStamp *inInputTime, AudioBufferList *outOutputData, const AudioTimeStamp *inOutputTime, void *inClientData) { register float *myOutBuffer = (float *) outOutputData->mBuffers[0].mData; register UInt8 *myInBuffer; register UInt32 i; #if USE_FILL_THREAD pthread_mutex_lock (&gBufferMutex); #if DEBUG_TRACE_THREADS fprintf(stderr,"playing buffer #%d\n", gCurrentPlayBuffer); #endif myInBuffer = (UInt8 *) gSoundBackBuffer[gCurrentPlayBuffer]; if (++gCurrentPlayBuffer >= NUMBER_BACK_BUFFERS) gCurrentPlayBuffer = 0; // fill her up, please ... pthread_cond_signal (&gBufferCondition); pthread_mutex_unlock (&gBufferMutex); #else myInBuffer = (UInt8 *) gSoundBuffer; FILL_BUFFER(gSoundBuffer, gInBufferSize); #endif /* USE_FILL_THREAD */ if (gBufferMono2Stereo) { for (i = 0; i < SOUND_BUFFER_SIZE >> 1; i++) { myOutBuffer[1] = myOutBuffer[0] = (*myInBuffer++) * SOUND_BUFFER_SCALE_8BIT; myOutBuffer+=2; } } else { for (i = 0; i < SOUND_BUFFER_SIZE; i++) { *myOutBuffer++ = (*myInBuffer++) * SOUND_BUFFER_SCALE_8BIT; } } return 0; }
/* *----------------------- boolean -------------------------- */ static void boolean_read_data(void *data, int fd) { struct unix_socket_data *mdata = data; bool val; if (FILL_BUFFER(fd, val) < 0) return; sol_flow_send_boolean_packet(mdata->node, SOL_FLOW_NODE_TYPE_UNIX_SOCKET_BOOLEAN_READER__OUT__OUT, val); }
/* *----------------------- float -------------------------- */ static void float_read_data(void *data, int fd) { struct unix_socket_data *mdata = data; double val; if (FILL_BUFFER(fd, val) < 0) return; sol_flow_send_drange_value_packet(mdata->node, SOL_FLOW_NODE_TYPE_UNIX_SOCKET_FLOAT_READER__OUT__OUT, val); }
/* *----------------------- int -------------------------- */ static void int_read_data(void *data, int fd) { struct unix_socket_data *mdata = data; struct sol_irange val; if (FILL_BUFFER(fd, val) < 0) return; sol_flow_send_irange_packet(mdata->node, SOL_FLOW_NODE_TYPE_UNIX_SOCKET_INT_READER__OUT__OUT, &val); }
/* *----------------------- byte -------------------------- */ static void byte_read_data(void *data, int fd) { struct unix_socket_data *mdata = data; uint8_t val; if (FILL_BUFFER(fd, val) < 0) return; sol_flow_send_byte_packet(mdata->node, SOL_FLOW_NODE_TYPE_UNIX_SOCKET_BYTE_READER__OUT__OUT, val); }
/* *----------------------- direction_vector -------------------------- */ static void direction_vector_read_data(void *data, int fd) { struct unix_socket_data *mdata = data; struct sol_direction_vector direction_vector; if (FILL_BUFFER(fd, direction_vector) < 0) return; sol_flow_send_direction_vector_packet(mdata->node, SOL_FLOW_NODE_TYPE_UNIX_SOCKET_DIRECTION_VECTOR_READER__OUT__OUT, &direction_vector); }
/* *----------------------- rgb -------------------------- */ static void rgb_read_data(void *data, int fd) { struct unix_socket_data *mdata = data; struct sol_rgb rgb; if (FILL_BUFFER(fd, rgb) < 0) return; sol_flow_send_rgb_packet(mdata->node, SOL_FLOW_NODE_TYPE_UNIX_SOCKET_RGB_READER__OUT__OUT, &rgb); }
static void * OSX_FillBuffer (void *theID) { unsigned char *buffer; int done; while (1) { done = 0; while (!done) { // shall the thread exit? if (gExitBufferFillThread) pthread_exit (NULL); pthread_mutex_lock (&gBufferMutex); if ((gCurrentFillBuffer+1) % NUMBER_BACK_BUFFERS != gCurrentPlayBuffer) { #if DEBUG_TRACE_THREADS fprintf(stderr,"filling buffer #%d\n", gCurrentFillBuffer); #endif buffer = gSoundBackBuffer[gCurrentFillBuffer]; if (++gCurrentFillBuffer >= NUMBER_BACK_BUFFERS) gCurrentFillBuffer = 0; // fill the buffer... FILL_BUFFER (buffer, gInBufferSize); } else { // we are caught up now, give it a rest done = 1; } pthread_mutex_unlock (&gBufferMutex); } pthread_mutex_lock (&gBufferMutex); // wait for the next buffer-fill request... pthread_cond_wait (&gBufferCondition, &gBufferMutex); pthread_mutex_unlock (&gBufferMutex); } return (theID); }
/* *----------------------- string -------------------------- */ static void string_read_data(void *data, int fd) { struct unix_socket_data *mdata = data; struct sol_buffer buf = SOL_BUFFER_INIT_EMPTY; char *str; size_t len; int r; if (FILL_BUFFER(fd, len) < 0) return; r = sol_util_fill_buffer_exactly(fd, &buf, len); if (r < 0) goto end; str = sol_buffer_steal(&buf, NULL); sol_flow_send_string_take_packet(mdata->node, SOL_FLOW_NODE_TYPE_UNIX_SOCKET_STRING_READER__OUT__OUT, str); end: sol_buffer_fini(&buf); }
int64_t url_fseek(ByteIOContext *s, int64_t offset, int whence) { int64_t offset1; int64_t pos; int force = whence & AVSEEK_FORCE; whence &= ~AVSEEK_FORCE; if(!s) return AVERROR(EINVAL); pos = s->pos - (s->write_flag ? 0 : (s->buf_end - s->buffer)); if (whence != SEEK_CUR && whence != SEEK_SET) return AVERROR(EINVAL); if (whence == SEEK_CUR) { offset1 = pos + (s->buf_ptr - s->buffer); if (offset == 0) return offset1; offset += offset1; } s->nb_seek++; offset1 = offset - pos; buf_log(BUF_DEBUG,"SEEK START. [BUF: %"PRId64",%d,%d] pos %"PRId64" offset %"PRId64"\n", s->pos,s->buf_ptr-s->buffer,s->buf_end-s->buffer,offset,offset1); if (!s->must_flush && offset1 >= 0 && offset1 <= (s->buf_end - s->buffer)) { /* can do the seek inside the buffer */ s->nb_seek_buffer++; s->buf_ptr = s->buffer + offset1; buf_log(BUF_DEBUG,"SEEK INTERNAL END. [BUF: %"PRId64",%d,%d] pos %"PRId64"\n\n", s->pos,s->buf_ptr-s->buffer,s->buf_end-s->buffer,offset); } else if(!s->write_flag && offset1 >= 0 && (whence != SEEK_END || force) && (s->is_streamed || offset1 <= (s->buffer_size + 128*1024))) { int64_t totfill = s->pos; s->nb_seek_avoid++; while(s->pos < offset && !s->eof_reached) FILL_BUFFER(s,offset - s->pos); if (s->eof_reached) return AVERROR_EOF; s->buf_ptr = s->buf_end + offset - s->pos; buf_log(BUF_DEBUG,"SEEK AVOID END. [BUF: %"PRId64",%d,%d] pos %"PRId64" fill %"PRId64"\n\n", s->pos,s->buf_ptr-s->buffer,s->buf_end-s->buffer,offset,s->pos-totfill); } else { int64_t res; #if CONFIG_MUXERS || CONFIG_NETWORK if (s->write_flag) { flush_buffer(s); s->must_flush = 1; } #endif /* CONFIG_MUXERS || CONFIG_NETWORK */ if (!s->seek) return AVERROR(EPIPE); if ((res = s->seek(s->opaque, offset, SEEK_SET)) < 0) return res; if (!s->write_flag) s->buf_end = s->buffer; s->buf_ptr = s->buffer; s->pos = offset; buf_log(BUF_DEBUG,"SEEK EXTERNAL END. [BUF: %"PRId64",%d,%d] pos %"PRId64"\n\n", s->pos,s->buf_ptr-s->buffer,s->buf_end-s->buffer,offset); } s->eof_reached = 0; return offset; }
static OSStatus OSX_AudioIOProc16Bit (AudioDeviceID inDevice, const AudioTimeStamp *inNow, const AudioBufferList *inInputData, const AudioTimeStamp *inInputTime, AudioBufferList *outOutputData, const AudioTimeStamp *inOutputTime, void *inClientData) { register float *myOutBuffer = (float *) outOutputData->mBuffers[0].mData; register SInt16 *myInBuffer; register UInt32 i; #if USE_FILL_THREAD pthread_mutex_lock (&gBufferMutex); #if DEBUG_TRACE_THREADS fprintf(stderr,"playing buffer #%d\n", gCurrentPlayBuffer); #endif myInBuffer = (SInt16 *) gSoundBackBuffer[gCurrentPlayBuffer]; if (++gCurrentPlayBuffer >= NUMBER_BACK_BUFFERS) gCurrentPlayBuffer = 0; // ... and check the oil too pthread_cond_signal (&gBufferCondition); pthread_mutex_unlock (&gBufferMutex); #else myInBuffer = (SInt16 *) gSoundBuffer; FILL_BUFFER(gSoundBuffer, gInBufferSize); #endif /* USE_FILL_THREAD */ #ifdef HAVE_ALTIVEC if (md_mode & DMODE_SIMDMIXER) { #if __MWERKS__ #pragma dont_inline on #endif OSX_AudioIOProc16Bit_Altivec(myInBuffer,myOutBuffer); #if __MWERKS__ #pragma dont_inline reset #endif } else #endif { if (gBufferMono2Stereo) { for (i = 0; i < SOUND_BUFFER_SIZE >> 1; i++) { myOutBuffer[1] = myOutBuffer[0] = (*myInBuffer++) * SOUND_BUFFER_SCALE_16BIT; myOutBuffer+=2; } } else { for (i = 0; i < SOUND_BUFFER_SIZE; i++) { *myOutBuffer++ = (*myInBuffer++) * SOUND_BUFFER_SCALE_16BIT; } } } return 0; }