예제 #1
0
////--- Write to buffer
int RingBuffer_write (RingBuffer* buffer, float* data, int length){
    //buffer --> The buffer where to right
    //data   --> A pointer to the memory containing the data to be written
    //length --> This is the total number of BYTES to be copied.(Used in memcpy)
    //           Length is defined by: [the number of elements in data]x[size of each element]
    
    // First check if there is available data , if not, reset the indexes to 0
    if(RingBuffer_available_data(buffer) == 0) {
        buffer->start = buffer->end = 0;
        //printf("start=end=0 from write\n");
    }
    
    //check if the number of input elements is greater thant the space left in buffer
    if(length > RingBuffer_available_space(buffer)){
        printf("Not enough space, ocuppied: %d of:%d, inputOf: %d",
               RingBuffer_available_data(buffer), buffer->length,length);
        return -1;
    }
    
    //if it is save to write you can proceed
    void *result = memcpy(RingBuffer_ends_at(buffer), data, length*sizeof(float));
    if (result==NULL) {
        printf("Failed to write data into buffer.");
    }
    //Commit the write operation
    RingBuffer_commit_write(buffer, length);
    
    //return the number of elements written
    return length;
}
예제 #2
0
int RingBuffer_write(RingBuffer *buffer, uint8_t *data, int length)
{
	void *result;
	int margin = (buffer->length) - (buffer->end);
	if (RingBuffer_available_space(buffer) < length) {
		//printf("\n\rNo sufficient available space\n");
    		return 1;
    	}
	if (length < margin) {
    	result = memcpy(RingBuffer_ends_at(buffer), data, length);
    	if (result == NULL){
    		printf("\n\rFailed to write data into buffer\n");
    		return 3;
    	}
    	buffer->end += length;
	} else {
		result = memcpy(RingBuffer_ends_at(buffer), data, margin);
    	if (result == NULL){
    		printf("\n\rFailed to write data into buffer\n");
    		return 3;
    	}
    	buffer->end = 0;
    	if (length > margin) {
			result = memcpy(RingBuffer_ends_at(buffer), (data+margin), length - margin);
    		if (result == NULL){
    			printf("\n\rFailed to write data into buffer");
    			return 3;
    		}
    		buffer->end += length - margin;
    	}
	}

	buffer->ndata += length;

    return 0;
}
예제 #3
0
int RingBuffer_write(RingBuffer *buffer, char *data, int length) {
    if (RingBuffer_available(buffer) == 0) {
        buffer->start = buffer->end = 0;
    }
    check(length <= RingBuffer_available_space(buffer),
        "not enough space: %d request, %d available",
        RingBuffer_available_data(buffer), length);

    void *result = memcpy(RingBuffer_ends_at(buffer), data, length);
    check(result != NULL, "failed to write into buffer");

    RingBuffer_commit_write(buffer, length);

    return length;
error:
    return -1;
}
예제 #4
0
파일: zeus.c 프로젝트: HardSkript/zeus
void
do_read(evutil_socket_t fd, short events, void *arg)
{
    (void) events;

    struct fd_state *state = arg;
    ssize_t result;

    while (1) {
        assert(state->write_event);
        result = recv(fd, RingBuffer_ends_at(state->buffer), RingBuffer_available_space(state->buffer), 0);
        if (result <= 0)
            break;

        state->rtmp->total_read += result;

        RingBuffer_commit_write(state->buffer, result);
        
        while (RingBuffer_available_data(state->buffer) > 0) {
            RtmpOutputMessage *this_output = rtmp_create_output_message();
            int result_multiplex = rtmp_multiplex(state->rtmp, state->buffer, this_output);
            check(result_multiplex >= 0, "rtmp_multiplex error %d", result_multiplex);

            if (state->rtmp->end == 1) {
                event_del(state->write_event);
                rtmp_destroy_output_message(this_output);
                free_fd_state(state);
                return;
            }

            if (this_output->length > 0) {
                printf("Add block with length=%u\n", this_output->length);
                List_push(state->outputs, this_output);
                assert(state->write_event);
                event_add(state->write_event, NULL);
            } else {
                rtmp_destroy_output_message(this_output);
            }

            if (result_multiplex == 0) break;
        }

        printf("total_read=%u, last_total_read=%u\n", state->rtmp->total_read, state->rtmp->last_total_read);

        if (rtmp_should_acknowledge(state->rtmp) == 1) {
            RtmpOutputMessage *ack = rtmp_create_output_message();
            rtmp_allocate_output_message_content(ack, 16);

            int i = 0;
            unsigned char *msg = ack->message;
            msg[i++] = 0x02;

            msg[i++] = 0x00;msg[i++] = 0x00;msg[i++] = 0x00;
            int_to_byte_array(4, msg, i, 3);i += 3;

            msg[i++] = 0x03;

            msg[i++] = 0x00;
            msg[i++] = 0x00;  
            msg[i++] = 0x00;
            msg[i++] = 0x00;

            // msg[i++] = 0x03;

            // msg[i++] = 0x00;msg[i++] = 0x00;msg[i++] = 0x04;
            // msg[i++] = 0x00;msg[i++] = 0x00;msg[i++] = 0x00;msg[i++] = 0x00;
            // msg[i++] = 0x00;msg[i++] = 0x00;msg[i++] = 0x00;

            int_to_byte_array(state->rtmp->total_read, msg, i, 4);i += 4;

            List_push(state->outputs, ack);
            assert(state->write_event);
            event_add(state->write_event, NULL);

            state->rtmp->last_total_read = state->rtmp->total_read;
        }
    }

    if (result == 0) {
        free_fd_state(state);
    } else if (result < 0) {
        if (errno == EAGAIN) // XXXX use evutil macro
            return;
        perror("recv");
        free_fd_state(state);
    }

error:
    free_fd_state(state);
    return;
}