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:
Sebastien
2020-03-08 09:54:50 -04:00
48 changed files with 951 additions and 481 deletions

View File

@@ -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 )

View File

@@ -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);

View File

@@ -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];

View File

@@ -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_

View File

@@ -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 {