modify i2s param and comments
This commit is contained in:
parent
ba13d282dd
commit
aeb4d8e3c2
5 changed files with 54 additions and 129 deletions
94
components/driver/i2s.c
Normal file → Executable file
94
components/driver/i2s.c
Normal file → Executable file
|
@ -1119,9 +1119,9 @@ esp_err_t i2s_driver_uninstall(i2s_port_t i2s_num)
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int i2s_write_bytes(i2s_port_t i2s_num, const char *src, size_t size, TickType_t ticks_to_wait)
|
int i2s_write_bytes(i2s_port_t i2s_num, const void *src, size_t size, TickType_t ticks_to_wait)
|
||||||
{
|
{
|
||||||
int bytes_written = 0;
|
size_t bytes_written = 0;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
res = i2s_write(i2s_num, src, size, &bytes_written, ticks_to_wait);
|
res = i2s_write(i2s_num, src, size, &bytes_written, ticks_to_wait);
|
||||||
if (res != ESP_OK) {
|
if (res != ESP_OK) {
|
||||||
|
@ -1131,15 +1131,16 @@ int i2s_write_bytes(i2s_port_t i2s_num, const char *src, size_t size, TickType_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t i2s_write(i2s_port_t i2s_num, const char *src, size_t size, int *bytes_written, TickType_t ticks_to_wait)
|
esp_err_t i2s_write(i2s_port_t i2s_num, const void *src, size_t size, size_t *bytes_written, TickType_t ticks_to_wait)
|
||||||
{
|
{
|
||||||
char *data_ptr;
|
char *data_ptr, *src_byte;
|
||||||
int bytes_can_write;
|
int bytes_can_write;
|
||||||
*bytes_written = 0;
|
*bytes_written = 0;
|
||||||
I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG);
|
I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG);
|
||||||
I2S_CHECK((size < I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG);
|
I2S_CHECK((size < I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG);
|
||||||
I2S_CHECK((p_i2s_obj[i2s_num]->tx), "tx NULL", ESP_ERR_INVALID_ARG);
|
I2S_CHECK((p_i2s_obj[i2s_num]->tx), "tx NULL", ESP_ERR_INVALID_ARG);
|
||||||
xSemaphoreTake(p_i2s_obj[i2s_num]->tx->mux, (portTickType)portMAX_DELAY);
|
xSemaphoreTake(p_i2s_obj[i2s_num]->tx->mux, (portTickType)portMAX_DELAY);
|
||||||
|
src_byte = (char *)src;
|
||||||
while (size > 0) {
|
while (size > 0) {
|
||||||
if (p_i2s_obj[i2s_num]->tx->rw_pos == p_i2s_obj[i2s_num]->tx->buf_size || p_i2s_obj[i2s_num]->tx->curr_ptr == NULL) {
|
if (p_i2s_obj[i2s_num]->tx->rw_pos == p_i2s_obj[i2s_num]->tx->buf_size || p_i2s_obj[i2s_num]->tx->curr_ptr == NULL) {
|
||||||
if (xQueueReceive(p_i2s_obj[i2s_num]->tx->queue, &p_i2s_obj[i2s_num]->tx->curr_ptr, ticks_to_wait) == pdFALSE) {
|
if (xQueueReceive(p_i2s_obj[i2s_num]->tx->queue, &p_i2s_obj[i2s_num]->tx->curr_ptr, ticks_to_wait) == pdFALSE) {
|
||||||
|
@ -1154,9 +1155,9 @@ esp_err_t i2s_write(i2s_port_t i2s_num, const char *src, size_t size, int *bytes
|
||||||
if (bytes_can_write > size) {
|
if (bytes_can_write > size) {
|
||||||
bytes_can_write = size;
|
bytes_can_write = size;
|
||||||
}
|
}
|
||||||
memcpy(data_ptr, src, bytes_can_write);
|
memcpy(data_ptr, src_byte, bytes_can_write);
|
||||||
size -= bytes_can_write;
|
size -= bytes_can_write;
|
||||||
src += bytes_can_write;
|
src_byte += bytes_can_write;
|
||||||
p_i2s_obj[i2s_num]->tx->rw_pos += bytes_can_write;
|
p_i2s_obj[i2s_num]->tx->rw_pos += bytes_can_write;
|
||||||
(*bytes_written) += bytes_can_write;
|
(*bytes_written) += bytes_can_write;
|
||||||
}
|
}
|
||||||
|
@ -1164,7 +1165,7 @@ esp_err_t i2s_write(i2s_port_t i2s_num, const char *src, size_t size, int *bytes
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t i2s_write_expand(i2s_port_t i2s_num, const char *src, int size, int src_bits, int aim_bits, int *bytes_written, TickType_t ticks_to_wait)
|
esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, size_t src_bits, size_t aim_bits, size_t *bytes_written, TickType_t ticks_to_wait)
|
||||||
{
|
{
|
||||||
char *data_ptr;
|
char *data_ptr;
|
||||||
int bytes_can_write, tail;
|
int bytes_can_write, tail;
|
||||||
|
@ -1227,9 +1228,9 @@ esp_err_t i2s_write_expand(i2s_port_t i2s_num, const char *src, int size, int sr
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int i2s_read_bytes(i2s_port_t i2s_num, char* dest, size_t size, TickType_t ticks_to_wait)
|
int i2s_read_bytes(i2s_port_t i2s_num, const void *dest, size_t size, TickType_t ticks_to_wait)
|
||||||
{
|
{
|
||||||
int bytes_read = 0;
|
size_t bytes_read = 0;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
res = i2s_read(i2s_num, dest, size, &bytes_read, ticks_to_wait);
|
res = i2s_read(i2s_num, dest, size, &bytes_read, ticks_to_wait);
|
||||||
if (res != ESP_OK) {
|
if (res != ESP_OK) {
|
||||||
|
@ -1239,11 +1240,12 @@ int i2s_read_bytes(i2s_port_t i2s_num, char* dest, size_t size, TickType_t ticks
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t i2s_read(i2s_port_t i2s_num, char* dest, size_t size, int *bytes_read, TickType_t ticks_to_wait)
|
esp_err_t i2s_read(i2s_port_t i2s_num, const void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait)
|
||||||
{
|
{
|
||||||
char *data_ptr;
|
char *data_ptr, *dest_byte;
|
||||||
int bytes_can_read;
|
int bytes_can_read;
|
||||||
*bytes_read = 0;
|
*bytes_read = 0;
|
||||||
|
dest_byte = (char *)dest;
|
||||||
I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG);
|
I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG);
|
||||||
I2S_CHECK((size < I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG);
|
I2S_CHECK((size < I2S_MAX_BUFFER_SIZE), "size is too large", ESP_ERR_INVALID_ARG);
|
||||||
I2S_CHECK((p_i2s_obj[i2s_num]->rx), "rx NULL", ESP_ERR_INVALID_ARG);
|
I2S_CHECK((p_i2s_obj[i2s_num]->rx), "rx NULL", ESP_ERR_INVALID_ARG);
|
||||||
|
@ -1261,9 +1263,9 @@ esp_err_t i2s_read(i2s_port_t i2s_num, char* dest, size_t size, int *bytes_read,
|
||||||
if (bytes_can_read > size) {
|
if (bytes_can_read > size) {
|
||||||
bytes_can_read = size;
|
bytes_can_read = size;
|
||||||
}
|
}
|
||||||
memcpy(dest, data_ptr, bytes_can_read);
|
memcpy(dest_byte, data_ptr, bytes_can_read);
|
||||||
size -= bytes_can_read;
|
size -= bytes_can_read;
|
||||||
dest += bytes_can_read;
|
dest_byte += bytes_can_read;
|
||||||
p_i2s_obj[i2s_num]->rx->rw_pos += bytes_can_read;
|
p_i2s_obj[i2s_num]->rx->rw_pos += bytes_can_read;
|
||||||
(*bytes_read) += bytes_can_read;
|
(*bytes_read) += bytes_can_read;
|
||||||
}
|
}
|
||||||
|
@ -1271,11 +1273,12 @@ esp_err_t i2s_read(i2s_port_t i2s_num, char* dest, size_t size, int *bytes_read,
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int i2s_push_sample(i2s_port_t i2s_num, const char *sample, TickType_t ticks_to_wait)
|
int i2s_push_sample(i2s_port_t i2s_num, const void *sample, TickType_t ticks_to_wait)
|
||||||
{
|
{
|
||||||
int bytes_push = 0;
|
size_t bytes_push = 0;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
res = i2s_write_sample(i2s_num, sample, &bytes_push, ticks_to_wait);
|
I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_FAIL);
|
||||||
|
res = i2s_write(i2s_num, sample, p_i2s_obj[i2s_num]->bytes_per_sample, &bytes_push, ticks_to_wait);
|
||||||
if (res != ESP_OK) {
|
if (res != ESP_OK) {
|
||||||
return ESP_FAIL;
|
return ESP_FAIL;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1283,35 +1286,12 @@ int i2s_push_sample(i2s_port_t i2s_num, const char *sample, TickType_t ticks_to_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t i2s_write_sample(i2s_port_t i2s_num, const char *sample, int *sample_write, TickType_t ticks_to_wait)
|
int i2s_pop_sample(i2s_port_t i2s_num, const void *sample, TickType_t ticks_to_wait)
|
||||||
{
|
{
|
||||||
int i;
|
size_t bytes_pop = 0;
|
||||||
char *data_ptr;
|
|
||||||
*sample_write = 0;
|
|
||||||
I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG);
|
|
||||||
if (p_i2s_obj[i2s_num]->tx->rw_pos == p_i2s_obj[i2s_num]->tx->buf_size || p_i2s_obj[i2s_num]->tx->curr_ptr == NULL) {
|
|
||||||
if (xQueueReceive(p_i2s_obj[i2s_num]->tx->queue, &p_i2s_obj[i2s_num]->tx->curr_ptr, ticks_to_wait) == pdFALSE) {
|
|
||||||
return *sample_write;
|
|
||||||
}
|
|
||||||
ESP_LOGD(I2S_TAG, "rw_pos: %d, buf_size: %d, curr_ptr: %d", p_i2s_obj[i2s_num]->tx->rw_pos, p_i2s_obj[i2s_num]->tx->buf_size, (int)p_i2s_obj[i2s_num]->tx->curr_ptr);
|
|
||||||
p_i2s_obj[i2s_num]->tx->rw_pos = 0;
|
|
||||||
}
|
|
||||||
data_ptr = (char*)p_i2s_obj[i2s_num]->tx->curr_ptr;
|
|
||||||
data_ptr += p_i2s_obj[i2s_num]->tx->rw_pos;
|
|
||||||
for (i = 0; i < p_i2s_obj[i2s_num]->bytes_per_sample * p_i2s_obj[i2s_num]->channel_num; i++) {
|
|
||||||
*data_ptr++ = *sample++;
|
|
||||||
(*sample_write) += 1;
|
|
||||||
}
|
|
||||||
p_i2s_obj[i2s_num]->tx->rw_pos += (*sample_write);
|
|
||||||
return ESP_OK;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int i2s_pop_sample(i2s_port_t i2s_num, char *sample, TickType_t ticks_to_wait)
|
|
||||||
{
|
|
||||||
int bytes_pop = 0;
|
|
||||||
int res = 0;
|
int res = 0;
|
||||||
res = i2s_read_sample(i2s_num, sample, &bytes_pop, ticks_to_wait);
|
I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_FAIL);
|
||||||
|
res = i2s_read(i2s_num, sample, p_i2s_obj[i2s_num]->bytes_per_sample, &bytes_pop, ticks_to_wait);
|
||||||
if (res != ESP_OK) {
|
if (res != ESP_OK) {
|
||||||
return ESP_FAIL;
|
return ESP_FAIL;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1319,32 +1299,4 @@ int i2s_pop_sample(i2s_port_t i2s_num, char *sample, TickType_t ticks_to_wait)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t i2s_read_sample(i2s_port_t i2s_num, char *sample, int *sample_read, TickType_t ticks_to_wait)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
*sample_read = 0;
|
|
||||||
char *data_ptr;
|
|
||||||
I2S_CHECK((i2s_num < I2S_NUM_MAX), "i2s_num error", ESP_ERR_INVALID_ARG);
|
|
||||||
if (p_i2s_obj[i2s_num]->rx->rw_pos == p_i2s_obj[i2s_num]->rx->buf_size || p_i2s_obj[i2s_num]->rx->curr_ptr == NULL) {
|
|
||||||
if (xQueueReceive(p_i2s_obj[i2s_num]->rx->queue, &p_i2s_obj[i2s_num]->rx->curr_ptr, ticks_to_wait) == pdFALSE) {
|
|
||||||
return *sample_read;
|
|
||||||
}
|
|
||||||
p_i2s_obj[i2s_num]->rx->rw_pos = 0;
|
|
||||||
}
|
|
||||||
data_ptr = (char*)p_i2s_obj[i2s_num]->rx->curr_ptr;
|
|
||||||
data_ptr += p_i2s_obj[i2s_num]->rx->rw_pos;
|
|
||||||
for (i = 0; i < p_i2s_obj[i2s_num]->bytes_per_sample; i++) {
|
|
||||||
*sample++ = *data_ptr++;
|
|
||||||
(*sample_read) += 1;
|
|
||||||
}
|
|
||||||
if (p_i2s_obj[i2s_num]->channel_num == 2) {
|
|
||||||
for (i = 0; i < p_i2s_obj[i2s_num]->bytes_per_sample; i++) {
|
|
||||||
*sample++ = *data_ptr++;
|
|
||||||
(*sample_read) += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
p_i2s_obj[i2s_num]->rx->rw_pos += p_i2s_obj[i2s_num]->bytes_per_sample * p_i2s_obj[i2s_num]->channel_num;
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
82
components/driver/include/driver/i2s.h
Normal file → Executable file
82
components/driver/include/driver/i2s.h
Normal file → Executable file
|
@ -269,7 +269,7 @@ esp_err_t i2s_driver_uninstall(i2s_port_t i2s_num);
|
||||||
* - The amount of bytes written, if timeout, the result will be less than the size passed in.
|
* - The amount of bytes written, if timeout, the result will be less than the size passed in.
|
||||||
* - ESP_FAIL Parameter error
|
* - ESP_FAIL Parameter error
|
||||||
*/
|
*/
|
||||||
int i2s_write_bytes(i2s_port_t i2s_num, const char *src, size_t size, TickType_t ticks_to_wait) __attribute__ ((deprecated));
|
int i2s_write_bytes(i2s_port_t i2s_num, const void *src, size_t size, TickType_t ticks_to_wait) __attribute__ ((deprecated));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Write data to I2S DMA transmit buffer.
|
* @brief Write data to I2S DMA transmit buffer.
|
||||||
|
@ -293,7 +293,7 @@ int i2s_write_bytes(i2s_port_t i2s_num, const char *src, size_t size, TickType_t
|
||||||
* - ESP_OK Success
|
* - ESP_OK Success
|
||||||
* - ESP_ERR_INVALID_ARG Parameter error
|
* - ESP_ERR_INVALID_ARG Parameter error
|
||||||
*/
|
*/
|
||||||
esp_err_t i2s_write(i2s_port_t i2s_num, const char *src, size_t size, int *bytes_written, TickType_t ticks_to_wait);
|
esp_err_t i2s_write(i2s_port_t i2s_num, const void *src, size_t size, size_t *bytes_written, TickType_t ticks_to_wait);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Write data to I2S DMA transmit buffer while expanding the number of bits per sample. For example, expanding 16-bit PCM to 32-bit PCM.
|
* @brief Write data to I2S DMA transmit buffer while expanding the number of bits per sample. For example, expanding 16-bit PCM to 32-bit PCM.
|
||||||
|
@ -324,7 +324,7 @@ esp_err_t i2s_write(i2s_port_t i2s_num, const char *src, size_t size, int *bytes
|
||||||
* - ESP_OK Success
|
* - ESP_OK Success
|
||||||
* - ESP_ERR_INVALID_ARG Parameter error
|
* - ESP_ERR_INVALID_ARG Parameter error
|
||||||
*/
|
*/
|
||||||
esp_err_t i2s_write_expand(i2s_port_t i2s_num, const char *src, int size, int src_bits, int aim_bits, int *bytes_written, TickType_t ticks_to_wait);
|
esp_err_t i2s_write_expand(i2s_port_t i2s_num, const void *src, size_t size, size_t src_bits, size_t aim_bits, size_t *bytes_written, TickType_t ticks_to_wait);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read data from I2S DMA receive buffer
|
* @brief Read data from I2S DMA receive buffer
|
||||||
|
@ -336,7 +336,7 @@ esp_err_t i2s_write_expand(i2s_port_t i2s_num, const char *src, int size, int sr
|
||||||
* - The amount of bytes read, if timeout, bytes read will be less than the size passed in
|
* - The amount of bytes read, if timeout, bytes read will be less than the size passed in
|
||||||
* - ESP_FAIL Parameter error
|
* - ESP_FAIL Parameter error
|
||||||
*/
|
*/
|
||||||
int i2s_read_bytes(i2s_port_t i2s_num, char* dest, size_t size, TickType_t ticks_to_wait) __attribute__ ((deprecated));
|
int i2s_read_bytes(i2s_port_t i2s_num, const void *dest, size_t size, TickType_t ticks_to_wait) __attribute__ ((deprecated));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read data from I2S DMA receive buffer
|
* @brief Read data from I2S DMA receive buffer
|
||||||
|
@ -358,69 +358,43 @@ int i2s_read_bytes(i2s_port_t i2s_num, char* dest, size_t size, TickType_t ticks
|
||||||
* - ESP_OK Success
|
* - ESP_OK Success
|
||||||
* - ESP_ERR_INVALID_ARG Parameter error
|
* - ESP_ERR_INVALID_ARG Parameter error
|
||||||
*/
|
*/
|
||||||
esp_err_t i2s_read(i2s_port_t i2s_num, char* dest, size_t size, int *bytes_read, TickType_t ticks_to_wait);
|
esp_err_t i2s_read(i2s_port_t i2s_num, const void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Write a single sample to the I2S DMA TX buffer.
|
* @brief Write a single sample to the I2S DMA TX buffer.
|
||||||
*
|
*
|
||||||
* This function is deprecated. Use 'i2s_write_sample' instead.
|
* This function is deprecated. Use 'i2s_write' instead.
|
||||||
* This definition will be removed in a future release.
|
* This definition will be removed in a future release.
|
||||||
*
|
*
|
||||||
* @return
|
|
||||||
* - Number of bytes successfully pushed to DMA buffer, will be either zero or the size of configured sample buffer
|
|
||||||
* - ESP_FAIL Parameter error
|
|
||||||
*/
|
|
||||||
int i2s_push_sample(i2s_port_t i2s_num, const char *sample, TickType_t ticks_to_wait) __attribute__ ((deprecated));
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Write a single sample to the I2S DMA TX buffer.
|
|
||||||
*
|
|
||||||
* Size of the sample is determined by the channel_format (mono or stereo)) & bits_per_sample configuration (see i2s_config_t).
|
|
||||||
*
|
|
||||||
* @param i2s_num I2S_NUM_0, I2S_NUM_1
|
* @param i2s_num I2S_NUM_0, I2S_NUM_1
|
||||||
*
|
*
|
||||||
* @param sample Pointer to buffer containing sample to write. Size of buffer (in bytes) = (number of channels) * bits_per_sample / 8.
|
* @param sample Buffer to read data. Size of buffer (in bytes) = bits_per_sample / 8.
|
||||||
*
|
|
||||||
* @param[out] sample_write Number of bytes successfully pushed to DMA buffer, will be either zero or the size of configured sample buffer.
|
|
||||||
*
|
|
||||||
* @param ticks_to_wait Timeout in RTOS ticks. If space is not available in the DMA TX buffer within this period, no data is written and function returns 0.
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - ESP_OK Success
|
|
||||||
* - ESP_ERR_INVALID_ARG Parameter error
|
|
||||||
*/
|
|
||||||
esp_err_t i2s_write_sample(i2s_port_t i2s_num, const char *sample, int *sample_write, TickType_t ticks_to_wait);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Read a single sample from the I2S DMA RX buffer.
|
|
||||||
*
|
|
||||||
* This function is deprecated. Use 'i2s_read_sample' instead.
|
|
||||||
* This definition will be removed in a future release.
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - Number of bytes successfully read from DMA buffer, will be either zero or the size of configured sample buffer
|
|
||||||
* - ESP_FAIL Parameter error
|
|
||||||
*/
|
|
||||||
int i2s_pop_sample(i2s_port_t i2s_num, char *sample, TickType_t ticks_to_wait) __attribute__ ((deprecated));
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Read a single sample from the I2S DMA RX buffer.
|
|
||||||
*
|
|
||||||
* Size of the sample is determined by the channel_format (mono or stereo)) & bits_per_sample configuration (see i2s_config_t).
|
|
||||||
*
|
|
||||||
* @param i2s_num I2S_NUM_0, I2S_NUM_1
|
|
||||||
*
|
|
||||||
* @param sample Buffer sample data will be read into. Size of buffer (in bytes) = (number of channels) * bits_per_sample / 8.
|
|
||||||
*
|
|
||||||
* @param[out] sample_read Number of bytes successfully read from DMA buffer, will be either zero or the size of configured sample buffer.
|
|
||||||
*
|
*
|
||||||
* @param ticks_to_wait Timeout in RTOS ticks. If a sample is not available in the DMA buffer within this period, no data is read and function returns zero.
|
* @param ticks_to_wait Timeout in RTOS ticks. If a sample is not available in the DMA buffer within this period, no data is read and function returns zero.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
* - ESP_OK Success
|
* - Number of bytes successfully pushed to DMA buffer, will be either zero or the size of configured sample buffer (in bytes).
|
||||||
* - ESP_ERR_INVALID_ARG Parameter error
|
* - ESP_FAIL Parameter error
|
||||||
*/
|
*/
|
||||||
esp_err_t i2s_read_sample(i2s_port_t i2s_num, char *sample, int *sample_read, TickType_t ticks_to_wait);
|
int i2s_push_sample(i2s_port_t i2s_num, const void *sample, TickType_t ticks_to_wait) __attribute__ ((deprecated));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read a single sample from the I2S DMA RX buffer.
|
||||||
|
*
|
||||||
|
* This function is deprecated. Use 'i2s_read' instead.
|
||||||
|
* This definition will be removed in a future release.
|
||||||
|
*
|
||||||
|
* @param i2s_num I2S_NUM_0, I2S_NUM_1
|
||||||
|
*
|
||||||
|
* @param sample Buffer to write data. Size of buffer (in bytes) = bits_per_sample / 8.
|
||||||
|
*
|
||||||
|
* @param ticks_to_wait Timeout in RTOS ticks. If a sample is not available in the DMA buffer within this period, no data is read and function returns zero.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - Number of bytes successfully read from DMA buffer, will be either zero or the size of configured sample buffer (in bytes).
|
||||||
|
* - ESP_FAIL Parameter error
|
||||||
|
*/
|
||||||
|
int i2s_pop_sample(i2s_port_t i2s_num, const void *sample, TickType_t ticks_to_wait) __attribute__ ((deprecated));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set sample rate used for I2S RX and TX.
|
* @brief Set sample rate used for I2S RX and TX.
|
||||||
|
|
4
examples/bluetooth/a2dp_sink/main/bt_app_av.c
Normal file → Executable file
4
examples/bluetooth/a2dp_sink/main/bt_app_av.c
Normal file → Executable file
|
@ -56,8 +56,8 @@ void bt_app_a2d_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param)
|
||||||
|
|
||||||
void bt_app_a2d_data_cb(const uint8_t *data, uint32_t len)
|
void bt_app_a2d_data_cb(const uint8_t *data, uint32_t len)
|
||||||
{
|
{
|
||||||
int i2s_write_len;
|
size_t bytes_written;
|
||||||
i2s_write(0, (const char *)data, len, &i2s_write_len, portMAX_DELAY);
|
i2s_write(0, data, len, &bytes_written, portMAX_DELAY);
|
||||||
if (++m_pkt_cnt % 100 == 0) {
|
if (++m_pkt_cnt % 100 == 0) {
|
||||||
ESP_LOGE(BT_AV_TAG, "audio data pkt cnt %u", m_pkt_cnt);
|
ESP_LOGE(BT_AV_TAG, "audio data pkt cnt %u", m_pkt_cnt);
|
||||||
}
|
}
|
||||||
|
|
4
examples/peripherals/i2s/main/i2s_example_main.c
Normal file → Executable file
4
examples/peripherals/i2s/main/i2s_example_main.c
Normal file → Executable file
|
@ -29,7 +29,7 @@ static void setup_triangle_sine_waves(int bits)
|
||||||
int *samples_data = malloc(((bits+8)/16)*SAMPLE_PER_CYCLE*4);
|
int *samples_data = malloc(((bits+8)/16)*SAMPLE_PER_CYCLE*4);
|
||||||
unsigned int i, sample_val;
|
unsigned int i, sample_val;
|
||||||
double sin_float, triangle_float, triangle_step = (double) pow(2, bits) / SAMPLE_PER_CYCLE;
|
double sin_float, triangle_float, triangle_step = (double) pow(2, bits) / SAMPLE_PER_CYCLE;
|
||||||
int i2s_bytes_write = 0;
|
size_t i2s_bytes_write = 0;
|
||||||
|
|
||||||
printf("\r\nTest bits=%d free mem=%d, written data=%d\n", bits, esp_get_free_heap_size(), ((bits+8)/16)*SAMPLE_PER_CYCLE*4);
|
printf("\r\nTest bits=%d free mem=%d, written data=%d\n", bits, esp_get_free_heap_size(), ((bits+8)/16)*SAMPLE_PER_CYCLE*4);
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ static void setup_triangle_sine_waves(int bits)
|
||||||
// i2s_push_sample(0, &samples_data[i*2], 100);
|
// i2s_push_sample(0, &samples_data[i*2], 100);
|
||||||
// }
|
// }
|
||||||
// or write
|
// or write
|
||||||
i2s_write(I2S_NUM, (const char *)samples_data, ((bits+8)/16)*SAMPLE_PER_CYCLE*4, &i2s_bytes_write, 100);
|
i2s_write(I2S_NUM, samples_data, ((bits+8)/16)*SAMPLE_PER_CYCLE*4, &i2s_bytes_write, 100);
|
||||||
|
|
||||||
free(samples_data);
|
free(samples_data);
|
||||||
}
|
}
|
||||||
|
|
9
examples/peripherals/i2s_adc_dac/main/app_main.c
Normal file → Executable file
9
examples/peripherals/i2s_adc_dac/main/app_main.c
Normal file → Executable file
|
@ -199,7 +199,7 @@ void example_i2s_adc_dac(void*arg)
|
||||||
example_i2s_init();
|
example_i2s_init();
|
||||||
int i2s_read_len = EXAMPLE_I2S_READ_LEN;
|
int i2s_read_len = EXAMPLE_I2S_READ_LEN;
|
||||||
int flash_wr_size = 0;
|
int flash_wr_size = 0;
|
||||||
int i2s_bytes_read = 0;
|
size_t bytes_read, bytes_written;
|
||||||
|
|
||||||
//2. Record audio from ADC and save in flash
|
//2. Record audio from ADC and save in flash
|
||||||
#if RECORD_IN_FLASH_EN
|
#if RECORD_IN_FLASH_EN
|
||||||
|
@ -207,7 +207,7 @@ void example_i2s_adc_dac(void*arg)
|
||||||
uint8_t* flash_write_buff = (uint8_t*) calloc(i2s_read_len, sizeof(char));
|
uint8_t* flash_write_buff = (uint8_t*) calloc(i2s_read_len, sizeof(char));
|
||||||
while (flash_wr_size < FLASH_RECORD_SIZE) {
|
while (flash_wr_size < FLASH_RECORD_SIZE) {
|
||||||
//read data from I2S bus, in this case, from ADC.
|
//read data from I2S bus, in this case, from ADC.
|
||||||
i2s_read(EXAMPLE_I2S_NUM, (char*) i2s_read_buff, i2s_read_len, &i2s_bytes_read, portMAX_DELAY);
|
i2s_read(EXAMPLE_I2S_NUM, i2s_read_buff, i2s_read_len, &bytes_read, portMAX_DELAY);
|
||||||
example_disp_buf((uint8_t*) i2s_read_buff, 64);
|
example_disp_buf((uint8_t*) i2s_read_buff, 64);
|
||||||
//save original data from I2S(ADC) into flash.
|
//save original data from I2S(ADC) into flash.
|
||||||
esp_partition_write(data_partition, flash_wr_size, i2s_read_buff, i2s_read_len);
|
esp_partition_write(data_partition, flash_wr_size, i2s_read_buff, i2s_read_len);
|
||||||
|
@ -222,7 +222,6 @@ void example_i2s_adc_dac(void*arg)
|
||||||
|
|
||||||
uint8_t* flash_read_buff = (uint8_t*) calloc(i2s_read_len, sizeof(char));
|
uint8_t* flash_read_buff = (uint8_t*) calloc(i2s_read_len, sizeof(char));
|
||||||
uint8_t* i2s_write_buff = (uint8_t*) calloc(i2s_read_len, sizeof(char));
|
uint8_t* i2s_write_buff = (uint8_t*) calloc(i2s_read_len, sizeof(char));
|
||||||
int i2s_write_len = 0;
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
||||||
//3. Read flash and replay the sound via DAC
|
//3. Read flash and replay the sound via DAC
|
||||||
|
@ -233,7 +232,7 @@ void example_i2s_adc_dac(void*arg)
|
||||||
//process data and scale to 8bit for I2S DAC.
|
//process data and scale to 8bit for I2S DAC.
|
||||||
example_i2s_adc_data_scale(i2s_write_buff, flash_read_buff, FLASH_SECTOR_SIZE);
|
example_i2s_adc_data_scale(i2s_write_buff, flash_read_buff, FLASH_SECTOR_SIZE);
|
||||||
//send data
|
//send data
|
||||||
i2s_write(EXAMPLE_I2S_NUM, (char*) i2s_write_buff, FLASH_SECTOR_SIZE, &i2s_write_len, portMAX_DELAY);
|
i2s_write(EXAMPLE_I2S_NUM, i2s_write_buff, FLASH_SECTOR_SIZE, &bytes_written, portMAX_DELAY);
|
||||||
printf("playing: %d %%\n", rd_offset * 100 / flash_wr_size);
|
printf("playing: %d %%\n", rd_offset * 100 / flash_wr_size);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -246,7 +245,7 @@ void example_i2s_adc_dac(void*arg)
|
||||||
while (offset < tot_size) {
|
while (offset < tot_size) {
|
||||||
int play_len = ((tot_size - offset) > (4 * 1024)) ? (4 * 1024) : (tot_size - offset);
|
int play_len = ((tot_size - offset) > (4 * 1024)) ? (4 * 1024) : (tot_size - offset);
|
||||||
int i2s_wr_len = example_i2s_dac_data_scale(i2s_write_buff, (uint8_t*)(audio_table + offset), play_len);
|
int i2s_wr_len = example_i2s_dac_data_scale(i2s_write_buff, (uint8_t*)(audio_table + offset), play_len);
|
||||||
i2s_write(EXAMPLE_I2S_NUM, (const char*) i2s_write_buff, i2s_wr_len, &i2s_write_len, portMAX_DELAY);
|
i2s_write(EXAMPLE_I2S_NUM, i2s_write_buff, i2s_wr_len, &bytes_written, portMAX_DELAY);
|
||||||
offset += play_len;
|
offset += play_len;
|
||||||
example_disp_buf((uint8_t*) i2s_write_buff, 32);
|
example_disp_buf((uint8_t*) i2s_write_buff, 32);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue