fix flush mode

This commit is contained in:
philippe44
2023-12-27 19:46:16 -08:00
parent 5c90086bbd
commit 9679c5c104
19 changed files with 33 additions and 9 deletions

View File

@@ -227,7 +227,7 @@ int main(int argc, char *argv[]) {
} else if (!strcasecmp(arg, "-i")) { } else if (!strcasecmp(arg, "-i")) {
identity = *++argv; identity = *++argv;
} else { } else {
// nothing let's try to be smart and handle legacy crappy // nothing let's try to be smart and handle legacy crap
if (!identity) identity = *argv; if (!identity) identity = *argv;
else if (!type) (void) !asprintf(&type, "%s.local", *argv); else if (!type) (void) !asprintf(&type, "%s.local", *argv);
else if (!port) port = atoi(*argv); else if (!port) port = atoi(*argv);
@@ -235,6 +235,7 @@ int main(int argc, char *argv[]) {
txt = (const char**) malloc((argc + 1) * sizeof(char**)); txt = (const char**) malloc((argc + 1) * sizeof(char**));
memcpy(txt, argv, argc * sizeof(char**)); memcpy(txt, argv, argc * sizeof(char**));
txt[argc] = NULL; txt[argc] = NULL;
break;
} }
argc--; argc--;
} }
@@ -250,13 +251,14 @@ int main(int argc, char *argv[]) {
mdnsd_set_hostname(svr, hostname, host); mdnsd_set_hostname(svr, hostname, host);
svc = mdnsd_register_svc(svr, identity, type, port, NULL, txt); svc = mdnsd_register_svc(svr, identity, type, port, NULL, txt);
mdns_service_destroy(svc); // mdns_service_destroy(svc);
#ifdef _WIN32 #ifdef _WIN32
Sleep(INFINITE); Sleep(INFINITE);
#else #else
pause(); pause();
#endif #endif
mdns_service_remove(svr, svc);
mdnsd_stop(svr); mdnsd_stop(svr);
} else { } else {
printf("Can't start server"); printf("Can't start server");
@@ -264,7 +266,7 @@ int main(int argc, char *argv[]) {
} }
free(type); free(type);
free(txt); if (txt) free(txt);
#ifdef _WIN32 #ifdef _WIN32
winsock_close(); winsock_close();

View File

@@ -144,11 +144,10 @@ static int create_recv_sock(uint32_t host) {
} }
#if !defined(_WIN32) #if !defined(_WIN32)
on = sizeof(on); socklen_t len = sizeof(on);
socklen_t len; if (!getsockopt(sd, SOL_SOCKET, SO_REUSEPORT, &on, &len)) {
if (!getsockopt(sd, SOL_SOCKET, SO_REUSEPORT,(char*) &on, &len)) {
on = 1; on = 1;
if ((r = setsockopt(sd, SOL_SOCKET, SO_REUSEPORT,(char*) &on, sizeof(on))) < 0) { if ((r = setsockopt(sd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on))) < 0) {
log_message(LOG_ERR, "recv setsockopt(SO_REUSEPORT): %m\n", r); log_message(LOG_ERR, "recv setsockopt(SO_REUSEPORT): %m\n", r);
} }
} }

View File

@@ -443,7 +443,7 @@ void output_close_common(void) {
} }
void output_flush(void) { void output_flush(void) {
LOG_INFO("flush output buffer"); LOG_INFO("flush output buffer (full)");
buf_flush(outputbuf); buf_flush(outputbuf);
LOCK; LOCK;
output.fade = FADE_INACTIVE; output.fade = FADE_INACTIVE;
@@ -457,3 +457,15 @@ void output_flush(void) {
output.frames_played = 0; output.frames_played = 0;
UNLOCK; UNLOCK;
} }
bool output_flush_streaming(void) {
LOG_INFO("flush output buffer (streaming)");
LOCK;
bool flushed = output.track_start != NULL;
if (output.track_start) {
outputbuf->writep = output.track_start;
output.track_start = NULL;
}
UNLOCK;
return flushed;
}

View File

@@ -305,8 +305,18 @@ static void process_strm(u8_t *pkt, int len) {
sendSTAT("STMt", strm->replay_gain); // STMt replay_gain is no longer used to track latency, but support it sendSTAT("STMt", strm->replay_gain); // STMt replay_gain is no longer used to track latency, but support it
break; break;
case 'f': case 'f':
{
decode_flush(false);
bool flushed = false;
if (!output.external) flushed |= output_flush_streaming();
// we can have fully finished the current streaming, that's still a flush
if (stream_disconnect() || flushed) sendSTAT("STMf", 0);
buf_flush(streambuf);
output.stop_time = gettime_ms();
break;
}
case 'q': case 'q':
decode_flush(strm->command == 'q'); decode_flush(true);
if (!output.external) output_flush(); if (!output.external) output_flush();
status.frames_played = 0; status.frames_played = 0;
if (stream_disconnect() && strm->command == 'f') sendSTAT("STMf", 0); if (stream_disconnect() && strm->command == 'f') sendSTAT("STMf", 0);

View File

@@ -727,6 +727,7 @@ struct outputstate {
void output_init_common(log_level level, const char *device, unsigned output_buf_size, unsigned rates[], unsigned idle); void output_init_common(log_level level, const char *device, unsigned output_buf_size, unsigned rates[], unsigned idle);
void output_close_common(void); void output_close_common(void);
void output_flush(void); void output_flush(void);
bool output_flush_streaming(void);
// _* called with mutex locked // _* called with mutex locked
frames_t _output_frames(frames_t avail); frames_t _output_frames(frames_t avail);
void _checkfade(bool); void _checkfade(bool);