Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
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);
}
Ejemplo n.º 4
0
/*
 *----------------------- 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);
}
Ejemplo n.º 5
0
/*
 *----------------------- 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);
}
Ejemplo n.º 6
0
/*
 *----------------------- 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);
}
Ejemplo n.º 7
0
/*
 *----------------------- 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);
}
Ejemplo n.º 8
0
/*
 *----------------------- 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);
}
Ejemplo n.º 9
0
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);
}
Ejemplo n.º 10
0
/*
 *----------------------- 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);
}
Ejemplo n.º 11
0
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;
}
Ejemplo n.º 12
0
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;
}