Files
snapclient/components/libbuffer/buffer.c
Carlos 15b4baba28 - merge with original master from jorgen
- minimize RAM usage of all components
- use both IRAM and DRAM in player component so we can buffer up to 1s on modules without SPI RAM
- support fragemented pcm chunks so we can use all available RAM if there isn't a big enough block available but still enough HEAP
- reinclude all components from jorgen's master branch
- add custom i2s driver to get a precise timing of initial sync
- change wrong usage of esp_timer for latency measurement of snapcast protocol
- add player component
2021-08-19 21:57:16 +02:00

166 lines
4.1 KiB
C

#include "buffer.h"
void buffer_read_init(read_buffer_t *buffer, const char *data, size_t size) {
buffer->buffer = data;
buffer->size = size;
buffer->index = 0;
}
void buffer_write_init(write_buffer_t *buffer, char *data, size_t size) {
buffer->buffer = data;
buffer->size = size;
buffer->index = 0;
}
int buffer_read_buffer(read_buffer_t *buffer, char *data, size_t size) {
int i;
if (buffer->size - buffer->index < size) {
return 1;
}
for (i = 0; i < size; i++) {
data[i] = buffer->buffer[buffer->index++];
}
return 0;
}
int buffer_write_buffer(write_buffer_t *buffer, const char *data, size_t size) {
int i;
if (buffer->size - buffer->index < size) {
return 1;
}
for (i = 0; i < size; i++) {
buffer->buffer[buffer->index++] = data[i];
}
return 0;
}
int buffer_read_uint32(read_buffer_t *buffer, uint32_t *data) {
if (buffer->size - buffer->index < sizeof(uint32_t)) {
return 1;
}
*data = buffer->buffer[buffer->index++] & 0xff;
*data |= (buffer->buffer[buffer->index++] & 0xff) << 8;
*data |= (buffer->buffer[buffer->index++] & 0xff) << 16;
*data |= (buffer->buffer[buffer->index++] & 0xff) << 24;
return 0;
}
int buffer_write_uint32(write_buffer_t *buffer, uint32_t data) {
if (buffer->size - buffer->index < sizeof(uint32_t)) {
return 1;
}
buffer->buffer[buffer->index++] = data & 0xff;
buffer->buffer[buffer->index++] = (data >> 8) & 0xff;
buffer->buffer[buffer->index++] = (data >> 16) & 0xff;
buffer->buffer[buffer->index++] = (data >> 24) & 0xff;
return 0;
}
int buffer_read_uint16(read_buffer_t *buffer, uint16_t *data) {
if (buffer->size - buffer->index < sizeof(uint16_t)) {
return 1;
}
*data = buffer->buffer[buffer->index++] & 0xff;
*data |= (buffer->buffer[buffer->index++] & 0xff) << 8;
return 0;
}
int buffer_write_uint16(write_buffer_t *buffer, uint16_t data) {
if (buffer->size - buffer->index < sizeof(uint16_t)) {
return 1;
}
buffer->buffer[buffer->index++] = data & 0xff;
buffer->buffer[buffer->index++] = (data >> 8) & 0xff;
return 0;
}
int buffer_read_uint8(read_buffer_t *buffer, uint8_t *data) {
if (buffer->size - buffer->index < sizeof(uint8_t)) {
return 1;
}
*data = buffer->buffer[buffer->index++] & 0xff;
return 0;
}
int buffer_write_uint8(write_buffer_t *buffer, uint8_t data) {
if (buffer->size - buffer->index < sizeof(uint8_t)) {
return 1;
}
buffer->buffer[buffer->index++] = data & 0xff;
return 0;
}
int buffer_read_int32(read_buffer_t *buffer, int32_t *data) {
if (buffer->size - buffer->index < sizeof(int32_t)) {
return 1;
}
*data = buffer->buffer[buffer->index++] & 0xff;
*data |= (buffer->buffer[buffer->index++] & 0xff) << 8;
*data |= (buffer->buffer[buffer->index++] & 0xff) << 16;
*data |= (buffer->buffer[buffer->index++] & 0xff) << 24;
return 0;
}
int buffer_write_int32(write_buffer_t *buffer, int32_t data) {
if (buffer->size - buffer->index < sizeof(int32_t)) {
return 1;
}
buffer->buffer[buffer->index++] = data & 0xff;
buffer->buffer[buffer->index++] = (data >> 8) & 0xff;
buffer->buffer[buffer->index++] = (data >> 16) & 0xff;
buffer->buffer[buffer->index++] = (data >> 24) & 0xff;
return 0;
}
int buffer_read_int16(read_buffer_t *buffer, int16_t *data) {
if (buffer->size - buffer->index < sizeof(int16_t)) {
return 1;
}
*data = buffer->buffer[buffer->index++] & 0xff;
*data |= (buffer->buffer[buffer->index++] & 0xff) << 8;
return 0;
}
int buffer_write_int16(write_buffer_t *buffer, int16_t data) {
if (buffer->size - buffer->index < sizeof(int16_t)) {
return 1;
}
buffer->buffer[buffer->index++] = data & 0xff;
buffer->buffer[buffer->index++] = (data >> 8) & 0xff;
return 0;
}
int buffer_read_int8(read_buffer_t *buffer, int8_t *data) {
if (buffer->size - buffer->index < sizeof(int8_t)) {
return 1;
}
*data = buffer->buffer[buffer->index++] & 0xff;
return 0;
}
int buffer_write_int8(write_buffer_t *buffer, int8_t data) {
if (buffer->size - buffer->index < sizeof(int8_t)) {
return 1;
}
buffer->buffer[buffer->index++] = data & 0xff;
return 0;
}