int read_some(RingBuffer *buffer, int fd, int is_socket)
{
  int rc = 0;

  if (RingBuffer_available_data(buffer) == 0) {
    buffer->start = buffer->end = 0;
  }

  if (is_socket) {
    rc = recv(fd, RingBuffer_starts_at(buffer),
              RingBuffer_available_space(buffer), 0);
  } else {
    rc = read(fd, RingBuffer_starts_at(buffer),
              RingBuffer_available_space(buffer));
  }

  check(rc >= 0, "Failed to read from fd: %d", fd);

  RingBuffer_commit_write(buffer, rc);

  return rc;

error:
  return -1;
}
Beispiel #2
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;
}
bool RingBuffer_writebyte(RingBuffer *buffer, char byte){
  if(RingBuffer_available_data(buffer) == 0) {
    buffer->start = buffer->end = 0;
  }
		    
  if(1 > RingBuffer_available_space(buffer))
    return false;
			    
  buffer->buffer[buffer->end] = byte;
  RingBuffer_commit_write(buffer, 1);
  return true;
}
Beispiel #4
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;
}
int RingBuffer_write(RingBuffer *buffer, char *data, int amount)
{
	if(RingBuffer_available_data(buffer) == 0) {
		buffer->start = buffer->end = 0;
	}
		    
	if(amount > RingBuffer_available_space(buffer))
		return -1;
			    
	unsigned int i;
	int temp = buffer->end;
	for(i = 0; i < amount; i++){
		buffer->buffer[temp] = data[i];
		temp++;
		temp %= buffer->length;
	}
	RingBuffer_commit_write(buffer, amount);
	return amount;
}
Beispiel #6
0
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;
}