mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-13 15:07:01 +03:00
Merge remote-tracking branch 'origin/master' into master-cmake
Conflicts: components/raop/raop.c components/raop/rtp.c main/cmd_squeezelite.c
This commit is contained in:
@@ -1,36 +1,8 @@
|
||||
|
||||
idf_component_register(SRCS "alac.c"
|
||||
"buffer.c"
|
||||
"controls.c"
|
||||
"decode_external.c"
|
||||
"decode.c"
|
||||
"display.c"
|
||||
"embedded.c"
|
||||
"flac.c"
|
||||
"helix-aac.c"
|
||||
"mad.c"
|
||||
"main.c"
|
||||
"mpg.c"
|
||||
"opus.c"
|
||||
"output_bt.c"
|
||||
"output_embedded.c"
|
||||
"output_i2s.c"
|
||||
"output_pack.c"
|
||||
"output_visu.c"
|
||||
"output.c"
|
||||
"pcm.c"
|
||||
"process.c"
|
||||
"resample.c"
|
||||
"resample16.c"
|
||||
"slimproto.c"
|
||||
"stream.c"
|
||||
"utils.c"
|
||||
"vorbis.c"
|
||||
"a1s/ac101.c"
|
||||
"tas57xx/dac_57xx.c"
|
||||
"external/dac_external.c"
|
||||
|
||||
idf_component_register( SRC_DIRS . external a1s tas57xx
|
||||
INCLUDE_DIRS . a1s
|
||||
REQUIRES newlib
|
||||
PRIV_REQUIRES newlib
|
||||
esp_common
|
||||
esp-dsp
|
||||
display
|
||||
@@ -58,4 +30,8 @@ set_source_files_properties(flac.c
|
||||
)
|
||||
|
||||
add_definitions(-DLINKALL -DLOOPBACK -DNO_FAAD -DRESAMPLE16 -DEMBEDDED -DTREMOR_ONLY -DBYTES_PER_FRAME=4)
|
||||
add_compile_options (-O3)
|
||||
add_compile_options (-O3 )
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -206,6 +206,10 @@ static bool raop_sink_cmd_handler(raop_event_t event, va_list args)
|
||||
// in how many ms will the most recent block play
|
||||
ms = ((u64_t) ((_buf_used(outputbuf) - raop_sync.len) / BYTES_PER_FRAME + output.device_frames + output.frames_in_process) * 1000) / RAOP_SAMPLE_RATE - (now - output.updated);
|
||||
raop_sync.error[raop_sync.idx] = (raop_sync.playtime - now) - ms;
|
||||
if (abs(raop_sync.error[raop_sync.idx]) > 1000) {
|
||||
LOG_INFO("erroneous sync point %d", raop_sync.error[raop_sync.idx]);
|
||||
raop_sync.error[raop_sync.idx] = raop_sync.error[raop_sync.idx] > 0 ? 1000 : -1000;
|
||||
}
|
||||
sync_nb = SYNC_NB;
|
||||
LOG_DEBUG("head local:%u, remote:%u (delta:%d)", ms, raop_sync.playtime - now, raop_sync.error[raop_sync.idx]);
|
||||
LOG_DEBUG("obuf:%u, sync_len:%u, devframes:%u, inproc:%u", _buf_used(outputbuf), raop_sync.len, output.device_frames, output.frames_in_process);
|
||||
|
||||
@@ -100,7 +100,7 @@ static struct {
|
||||
#define SB_HEIGHT 32
|
||||
|
||||
// lenght are number of frames, i.e. 2 channels of 16 bits
|
||||
#define FFT_LEN_BIT 6
|
||||
#define FFT_LEN_BIT 7
|
||||
#define FFT_LEN (1 << FFT_LEN_BIT)
|
||||
#define RMS_LEN_BIT 6
|
||||
#define RMS_LEN (1 << RMS_LEN_BIT)
|
||||
@@ -115,7 +115,7 @@ static struct scroller_s {
|
||||
u16_t mode;
|
||||
s16_t by;
|
||||
// scroller management & sharing between grfg and scrolling task
|
||||
bool active, first;
|
||||
bool active, first, overflow;
|
||||
int scrolled;
|
||||
struct {
|
||||
u8_t *frame;
|
||||
@@ -151,7 +151,7 @@ static EXT_RAM_ATTR struct {
|
||||
#define ANIM_SCREEN_2 0x08
|
||||
|
||||
static u8_t ANIC_resp = ANIM_NONE;
|
||||
static u8_t SETD_width;
|
||||
static uint16_t SETD_width;
|
||||
|
||||
#define SCROLL_STACK_SIZE (3*1024)
|
||||
#define LINELEN 40
|
||||
@@ -234,7 +234,7 @@ bool sb_display_init(void) {
|
||||
displayer.task = xTaskCreateStatic( (TaskFunction_t) displayer_task, "displayer_thread", SCROLL_STACK_SIZE, NULL, ESP_TASK_PRIO_MIN + 1, xStack, &xTaskBuffer);
|
||||
|
||||
// size scroller (width + current screen)
|
||||
scroller.scroll.max = (displayer.width * displayer.height / 8) * (10 + 1);
|
||||
scroller.scroll.max = (displayer.width * displayer.height / 8) * (15 + 1);
|
||||
scroller.scroll.frame = malloc(scroller.scroll.max);
|
||||
scroller.back.frame = malloc(displayer.width * displayer.height / 8);
|
||||
scroller.frame = malloc(displayer.width * displayer.height / 8);
|
||||
@@ -316,8 +316,9 @@ static void send_server(void) {
|
||||
pkt_header.id = 0xfe; // id 0xfe is width S:P:Squeezebox2
|
||||
pkt_header.length = htonl(sizeof(pkt_header) + 2 - 8);
|
||||
|
||||
SETD_width = htons(SETD_width);
|
||||
send_packet((u8_t *)&pkt_header, sizeof(pkt_header));
|
||||
send_packet(&SETD_width, 2);
|
||||
send_packet((uint8_t*) &SETD_width, 2);
|
||||
|
||||
SETD_width = 0;
|
||||
}
|
||||
@@ -559,6 +560,7 @@ static void grfs_handler(u8_t *data, int len) {
|
||||
scroller.mode = htons(pkt->mode);
|
||||
scroller.scroll.width = htons(pkt->width);
|
||||
scroller.first = true;
|
||||
scroller.overflow = false;
|
||||
|
||||
// background excludes space taken by visu (if any)
|
||||
scroller.back.width = displayer.width - ((visu.mode && visu.row < SB_HEIGHT) ? visu.width : 0);
|
||||
@@ -576,13 +578,14 @@ static void grfs_handler(u8_t *data, int len) {
|
||||
}
|
||||
|
||||
// copy scroll frame data (no semaphore needed)
|
||||
if (scroller.scroll.size + size < scroller.scroll.max) {
|
||||
if (scroller.scroll.size + size < scroller.scroll.max && !scroller.overflow) {
|
||||
memcpy(scroller.scroll.frame + offset, data + sizeof(struct grfs_packet), size);
|
||||
scroller.scroll.size = offset + size;
|
||||
LOG_INFO("scroller current size %u", scroller.scroll.size);
|
||||
LOG_INFO("scroller current size %u (w:%u)", scroller.scroll.size, scroller.scroll.width);
|
||||
} else {
|
||||
LOG_INFO("scroller too larger %u/%u/%u", scroller.scroll.size + size, scroller.scroll.max, scroller.scroll.width);
|
||||
scroller.scroll.width = scroller.scroll.size / (displayer.height / 8);
|
||||
LOG_INFO("scroller too large %u/%u (w:%u)", scroller.scroll.size + size, scroller.scroll.max, scroller.scroll.width);
|
||||
scroller.scroll.width = scroller.scroll.size / (displayer.height / 8) - scroller.back.width;
|
||||
scroller.overflow = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -736,10 +739,10 @@ static void visu_update(void) {
|
||||
*/
|
||||
void spectrum_limits(int min, int n, int pos) {
|
||||
if (n / 2) {
|
||||
int step = ((DISPLAY_BW - min) * visu.spectrum_scale * 2) / n;
|
||||
int step = ((DISPLAY_BW - min) * visu.spectrum_scale) / (n/2);
|
||||
visu.bars[pos].limit = min + step;
|
||||
for (int i = 1; i < n/2; i++) visu.bars[pos+i].limit = visu.bars[pos+i-1].limit + step;
|
||||
spectrum_limits(visu.bars[pos + n/2 - 1].limit, n/2, pos + n/2);
|
||||
spectrum_limits(visu.bars[pos + n/2 - 1].limit, n - n/2, pos + n/2);
|
||||
} else {
|
||||
visu.bars[pos].limit = DISPLAY_BW;
|
||||
}
|
||||
@@ -860,7 +863,7 @@ static void displayer_task(void *args) {
|
||||
// by default go for the long sleep, will change below if required
|
||||
scroller.wake = LONG_WAKE;
|
||||
|
||||
// do we have more to scroll (scroll.width is the last column from which we havea full zone)
|
||||
// do we have more to scroll (scroll.width is the last column from which we have a full zone)
|
||||
if (scroller.by > 0 ? (scroller.scrolled <= scroller.scroll.width) : (scroller.scrolled >= 0)) {
|
||||
memcpy(scroller.frame, scroller.back.frame, scroller.back.width * displayer.height / 8);
|
||||
for (int i = 0; i < scroller.width * displayer.height / 8; i++) scroller.frame[i] |= scroller.scroll.frame[scroller.scrolled * displayer.height / 8 + i];
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
/* must provide
|
||||
- mutex_create_p
|
||||
- pthread_create_name
|
||||
- register_xxx (see below)
|
||||
- stack size
|
||||
- s16_t, s32_t, s64_t and u64_t
|
||||
- PLAYER_ID / custom_player_id
|
||||
@@ -16,6 +17,11 @@
|
||||
- EXT_BSS
|
||||
recommended to add platform specific include(s) here
|
||||
*/
|
||||
|
||||
typedef int16_t s16_t;
|
||||
typedef int32_t s32_t;
|
||||
typedef int64_t s64_t;
|
||||
typedef unsigned long long u64_t;
|
||||
|
||||
#ifndef PTHREAD_STACK_MIN
|
||||
#define PTHREAD_STACK_MIN 256
|
||||
@@ -29,18 +35,17 @@
|
||||
#define OUTPUT_THREAD_STACK_SIZE 6 * 1024
|
||||
#define IR_THREAD_STACK_SIZE 6 * 1024
|
||||
|
||||
// number of 5s times search for a server will happen beforee slimproto exits (0 = no limit)
|
||||
#define MAX_SERVER_RETRIES 5
|
||||
|
||||
// or can be as simple as #define PLAYER_ID 100
|
||||
#define PLAYER_ID custom_player_id;
|
||||
#define PLAYER_ID custom_player_id
|
||||
extern u8_t custom_player_id;
|
||||
|
||||
#define BASE_CAP "Model=squeezeesp32,AccuratePlayPoints=1,HasDigitalOut=1,HasPolarityInversion=1,Firmware=" VERSION
|
||||
// to force some special buffer attribute
|
||||
#define EXT_BSS __attribute__((section(".ext_ram.bss")))
|
||||
|
||||
typedef int16_t s16_t;
|
||||
typedef int32_t s32_t;
|
||||
typedef int64_t s64_t;
|
||||
typedef unsigned long long u64_t;
|
||||
|
||||
// all exit() calls are made from main thread (or a function called in main thread)
|
||||
#define exit(code) { int ret = code; pthread_exit(&ret); }
|
||||
#define gettime_ms _gettime_ms_
|
||||
|
||||
@@ -773,7 +773,7 @@ void wake_controller(void) {
|
||||
wake_signal(wake_e);
|
||||
}
|
||||
|
||||
in_addr_t discover_server(char *default_server) {
|
||||
in_addr_t discover_server(char *default_server, int max) {
|
||||
struct sockaddr_in d;
|
||||
struct sockaddr_in s;
|
||||
char buf[32], port_d[] = "JSON", clip_d[] = "CLIP";
|
||||
@@ -827,7 +827,7 @@ in_addr_t discover_server(char *default_server) {
|
||||
server_addr(default_server, &s.sin_addr.s_addr, &port);
|
||||
}
|
||||
|
||||
} while (s.sin_addr.s_addr == 0 && running);
|
||||
} while (s.sin_addr.s_addr == 0 && running && (!max || --max));
|
||||
|
||||
closesocket(disc_sock);
|
||||
|
||||
@@ -858,7 +858,7 @@ void slimproto(log_level level, char *server, u8_t mac[6], const char *name, con
|
||||
}
|
||||
|
||||
if (!slimproto_ip) {
|
||||
slimproto_ip = discover_server(server);
|
||||
slimproto_ip = discover_server(server, 0);
|
||||
}
|
||||
|
||||
if (!slimproto_port) {
|
||||
@@ -937,10 +937,18 @@ void slimproto(log_level level, char *server, u8_t mac[6], const char *name, con
|
||||
sleep(5);
|
||||
}
|
||||
|
||||
// rediscover server if it was not set at startup
|
||||
#if EMBEDDED
|
||||
// in embedded we give up after a while no matter what
|
||||
if (++failed_connect > 5 && !server) {
|
||||
slimproto_ip = serv_addr.sin_addr.s_addr = discover_server(NULL, MAX_SERVER_RETRIES);
|
||||
if (!slimproto_ip) return;
|
||||
} else if (MAX_SERVER_RETRIES && failed_connect > 5 * MAX_SERVER_RETRIES) return;
|
||||
#else
|
||||
// rediscover server if it was not set at startup or exit
|
||||
if (!server && ++failed_connect > 5) {
|
||||
slimproto_ip = serv_addr.sin_addr.s_addr = discover_server(NULL);
|
||||
}
|
||||
slimproto_ip = serv_addr.sin_addr.s_addr = discover_server(NULL, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user