| 1025 | } |
| 1026 | |
| 1027 | ssize_t smpl_buf::write(void *buf, size_t len, TIMESTAMP timestamp) |
| 1028 | { |
| 1029 | int type_sz = 2 * sizeof(short); |
| 1030 | |
| 1031 | // Check for valid write |
| 1032 | if ((len == 0) || (len >= buf_len)) |
| 1033 | return ERROR_WRITE; |
| 1034 | if ((timestamp + len) <= time_end) |
| 1035 | return ERROR_TIMESTAMP; |
| 1036 | |
| 1037 | // Starting index |
| 1038 | size_t write_start = (data_start + (timestamp - time_start)) % buf_len; |
| 1039 | |
| 1040 | // Write it |
| 1041 | if ((write_start + len) < buf_len) { |
| 1042 | size_t numBytes = len * type_sz; |
| 1043 | memcpy(data + write_start, buf, numBytes); |
| 1044 | } else { |
| 1045 | size_t first_cp = (buf_len - write_start) * type_sz; |
| 1046 | size_t second_cp = len * type_sz - first_cp; |
| 1047 | |
| 1048 | memcpy(data + write_start, buf, first_cp); |
| 1049 | memcpy(data, (char*) buf + first_cp, second_cp); |
| 1050 | } |
| 1051 | |
| 1052 | data_end = (write_start + len) % buf_len; |
| 1053 | time_end = timestamp + len; |
| 1054 | |
| 1055 | if (((write_start + len) > buf_len) && (data_end > data_start)) |
| 1056 | return ERROR_OVERFLOW; |
| 1057 | else if (time_end <= time_start) |
| 1058 | return ERROR_WRITE; |
| 1059 | else |
| 1060 | return len; |
| 1061 | } |
| 1062 | |
| 1063 | ssize_t smpl_buf::write(void *buf, size_t len, uhd::time_spec_t ts) |
| 1064 | { |
no test coverage detected