* upgrade to IDF v5.1.1
* add new synchronization implementation, use sample stuffing / removal to keep up sync
* use big DMA buffer for I2S and improve sync
* Add DAC TAS5805M as custom board
* add wifi credential reset
o press reset button (nRESET pin) 3 times
but wait about 1s between button presses
the button press counter is reset 5s after boot
* Add support for PT8211 DAC (#78)
* upgrade ethernet interface to IDF v5 (#84)
* port official example of ethernet for IDF v5.x
* Fix cmake if guard for ethernet
Signed-off-by: Karl Osterseher <karli_o@gmx.at>
Co-authored-by: DerPicknicker <64746593+DerPicknicker@users.noreply.github.com>
Co-authored-by: whc2001 <ianwang0122@outlook.com>
54 lines
1.5 KiB
C
54 lines
1.5 KiB
C
#include <ctype.h>
|
|
#include <string.h>
|
|
|
|
#include "audio_error.h"
|
|
#include "audio_mem.h"
|
|
#include "esp_log.h"
|
|
|
|
static char *TAG = "AUDIO_URL";
|
|
|
|
static unsigned char char_to_hex(unsigned char x) {
|
|
return x > 9 ? x + 0x37 : x + 0x30;
|
|
}
|
|
|
|
char *audio_url_encode(const char *str) {
|
|
int out_len = (strlen(str) + 1) * 3;
|
|
char *final = audio_malloc(out_len);
|
|
AUDIO_MEM_CHECK(TAG, final, return NULL);
|
|
char *tmp = final;
|
|
for (size_t i = 0; i < strlen(str); i++) {
|
|
if (isalnum((unsigned char)str[i]) || (str[i] == '-') || (str[i] == '_') ||
|
|
(str[i] == '.') || (str[i] == '!') || (str[i] == '@') ||
|
|
(str[i] == '#') || (str[i] == '$') || (str[i] == '&') ||
|
|
(str[i] == '*') || (str[i] == '(') || (str[i] == ')') ||
|
|
(str[i] == '=') || (str[i] == ':') || (str[i] == '/') ||
|
|
(str[i] == ',') || (str[i] == ';') || (str[i] == '?') ||
|
|
(str[i] == '+') || (str[i] == '\'') || (str[i] == '~')) {
|
|
*final++ = str[i];
|
|
} else {
|
|
*final++ = '%';
|
|
*final++ = char_to_hex((unsigned char)str[i] >> 4);
|
|
*final++ = char_to_hex((unsigned char)str[i] % 16);
|
|
}
|
|
}
|
|
*final = 0;
|
|
return tmp;
|
|
}
|
|
|
|
char *audio_url_decode(const char *str) {
|
|
char *final = audio_malloc(strlen(str) + 1);
|
|
AUDIO_MEM_CHECK(TAG, final, return NULL);
|
|
char *tmp = final;
|
|
while (*str) {
|
|
if (*str == '%') {
|
|
char buffer[3] = {str[1], str[2], 0};
|
|
*final++ = strtol(buffer, NULL, 16);
|
|
str += 3;
|
|
} else {
|
|
*final++ = *str++;
|
|
}
|
|
}
|
|
*final = 0;
|
|
return tmp;
|
|
}
|