1
0
mirror of https://github.com/SuperBFG7/ympd synced 2025-03-04 10:38:18 +00:00

Fixed websocket connection - Send on connect settings and output

This commit is contained in:
jcorporation 2018-06-13 00:29:58 +01:00
parent 401bd5302f
commit 998d675b2c
5 changed files with 48 additions and 33 deletions

View File

@ -283,10 +283,8 @@ function webSocketConnect() {
try { try {
socket.onopen = function() { socket.onopen = function() {
console.log("connected"); console.log("connected");
/* emit request for mympd settings */ //socket.send('MPD_API_GET_OUTPUTS');
socket.send('MPD_API_GET_SETTINGS'); //socket.send('MPD_API_GET_SETTINGS');
/* emit initial request for output names */
socket.send('MPD_API_GET_OUTPUTS');
showNotification('Connected to myMPD','','','success'); showNotification('Connected to myMPD','','','success');
$('#modalConnectionError').modal('hide'); $('#modalConnectionError').modal('hide');
app.route(); app.route();

View File

@ -4682,7 +4682,7 @@ int mg_http_parse_header(struct mg_str *hdr, const char *var_name, char *buf,
#ifdef __GNUC__ #ifdef __GNUC__
__attribute__((deprecated)); __attribute__((deprecated));
#endif #endif
;
/* /*
* Gets and parses the Authorization: Basic header * Gets and parses the Authorization: Basic header

View File

@ -59,7 +59,7 @@ static inline enum mpd_cmd_ids get_cmd_id(const char *cmd)
return -1; return -1;
} }
void callback_mpd(struct mg_connection *c,const struct mg_str msg) void callback_mpd(struct mg_connection *nc, const struct mg_str msg)
{ {
enum mpd_cmd_ids cmd_id = get_cmd_id(msg.p); enum mpd_cmd_ids cmd_id = get_cmd_id(msg.p);
size_t n = 0; size_t n = 0;
@ -69,12 +69,11 @@ void callback_mpd(struct mg_connection *c,const struct mg_str msg)
char *p_charbuf = NULL, *token; char *p_charbuf = NULL, *token;
char *p_charbuf2 = NULL; char *p_charbuf2 = NULL;
char *searchstr = NULL; char *searchstr = NULL;
char request[500];
fprintf(stdout,"Got request: %s\n",msg.p); fprintf(stdout,"Got request: %s\n",msg.p);
if(cmd_id == -1) if(cmd_id == -1)
return 0; return;
switch(cmd_id) switch(cmd_id)
{ {
@ -149,7 +148,7 @@ void callback_mpd(struct mg_connection *c,const struct mg_str msg)
break; break;
case MPD_API_GET_OUTPUTS: case MPD_API_GET_OUTPUTS:
mpd.buf_size = mpd_put_outputs(mpd.buf, 1); mpd.buf_size = mpd_put_outputs(mpd.buf, 1);
mpd_notify_callback(c, NULL); mpd_notify_callback(nc, NULL);
break; break;
case MPD_API_TOGGLE_OUTPUT: case MPD_API_TOGGLE_OUTPUT:
if (sscanf(msg.p, "MPD_API_TOGGLE_OUTPUT,%u,%u", &uint_buf, &uint_buf_2)) { if (sscanf(msg.p, "MPD_API_TOGGLE_OUTPUT,%u,%u", &uint_buf, &uint_buf_2)) {
@ -467,6 +466,7 @@ out_set_replaygain:
if(mpd.conn_state == MPD_CONNECTED && mpd_connection_get_error(mpd.conn) != MPD_ERROR_SUCCESS) if(mpd.conn_state == MPD_CONNECTED && mpd_connection_get_error(mpd.conn) != MPD_ERROR_SUCCESS)
{ {
fprintf(stdout,"Error: %s\n",mpd_connection_get_error_message(mpd.conn));
n = snprintf(mpd.buf, MAX_SIZE, "{\"type\":\"error\", \"data\": \"%s\"}", n = snprintf(mpd.buf, MAX_SIZE, "{\"type\":\"error\", \"data\": \"%s\"}",
mpd_connection_get_error_message(mpd.conn)); mpd_connection_get_error_message(mpd.conn));
@ -476,11 +476,9 @@ out_set_replaygain:
} }
if(n > 0) { if(n > 0) {
//fprintf(stdout,"Send response:\n %s\n",mpd.buf); fprintf(stdout,"Send response:\n %s\n",mpd.buf);
mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, mpd.buf, strlen(mpd.buf)); mg_send_websocket_frame(nc, WEBSOCKET_OP_TEXT, mpd.buf, n);
} }
return 0;
} }
int mpd_close_handler(struct mg_connection *c) int mpd_close_handler(struct mg_connection *c)
@ -493,16 +491,15 @@ int mpd_close_handler(struct mg_connection *c)
static int mpd_notify_callback(struct mg_connection *c, const char *param) { static int mpd_notify_callback(struct mg_connection *c, const char *param) {
size_t n; size_t n;
if(!is_websocket(c))
if(is_websocket(c))
return 0; return 0;
if(param) if(param)
{ {
/* error message? */ /* error message? */
n=snprintf(mpd.buf, MAX_SIZE, "{\"type\":\"error\",\"data\":\"%s\"}",param); n=snprintf(mpd.buf, MAX_SIZE, "{\"type\":\"error\",\"data\":\"%s\"}",param);
fprintf(stdout,"Error in mpd_notify_callback: %s\n",param);
mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, mpd.buf, strlen(mpd.buf)); mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, mpd.buf, n);
return 0; return 0;
} }
@ -513,23 +510,27 @@ static int mpd_notify_callback(struct mg_connection *c, const char *param) {
if(mpd.conn_state != MPD_CONNECTED) { if(mpd.conn_state != MPD_CONNECTED) {
n=snprintf(mpd.buf, MAX_SIZE, "{\"type\":\"disconnected\"}"); n=snprintf(mpd.buf, MAX_SIZE, "{\"type\":\"disconnected\"}");
mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, mpd.buf, strlen(mpd.buf)); fprintf(stdout,"Notify: disconnected\n");
mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, mpd.buf, n);
} }
else else
{ {
mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, mpd.buf, strlen(mpd.buf)); fprintf(stdout,"Notify: %s\n",mpd.buf);
mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, mpd.buf, mpd.buf_size);
if(s->song_id != mpd.song_id) if(s->song_id != mpd.song_id)
{ {
n=mpd_put_current_song(mpd.buf); n=mpd_put_current_song(mpd.buf);
mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, mpd.buf, strlen(mpd.buf)); fprintf(stdout,"Notify: %s\n",mpd.buf);
mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, mpd.buf, n);
s->song_id = mpd.song_id; s->song_id = mpd.song_id;
} }
if(s->queue_version != mpd.queue_version) if(s->queue_version != mpd.queue_version)
{ {
n=snprintf(mpd.buf, MAX_SIZE, "{\"type\":\"update_queue\"}"); n=snprintf(mpd.buf, MAX_SIZE, "{\"type\":\"update_queue\"}");
mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, mpd.buf, strlen(mpd.buf)); fprintf(stdout,"Notify: update_queue\n");
mg_send_websocket_frame(c, WEBSOCKET_OP_TEXT, mpd.buf, n);
s->queue_version = mpd.queue_version; s->queue_version = mpd.queue_version;
} }

View File

@ -122,7 +122,7 @@ char coverimage[40];
static int is_websocket(const struct mg_connection *nc) { static int is_websocket(const struct mg_connection *nc) {
return nc->flags & MG_F_IS_WEBSOCKET; return nc->flags & MG_F_IS_WEBSOCKET;
}; }
struct t_mpd_client_session { struct t_mpd_client_session {
int song_id; int song_id;
@ -131,7 +131,7 @@ struct t_mpd_client_session {
}; };
void mpd_poll(struct mg_mgr *s); void mpd_poll(struct mg_mgr *s);
void callback_mpd(struct mg_connection *c, const struct mg_str msg); void callback_mpd(struct mg_connection *nc, const struct mg_str msg);
int mpd_close_handler(struct mg_connection *c); int mpd_close_handler(struct mg_connection *c);
int mpd_put_state(char *buffer, int *current_song_id, int *next_song_id, unsigned *queue_version); int mpd_put_state(char *buffer, int *current_song_id, int *next_song_id, unsigned *queue_version);
int mpd_put_outputs(char *buffer, int putnames); int mpd_put_outputs(char *buffer, int putnames);

View File

@ -45,21 +45,37 @@ static void signal_handler(int sig_num) {
static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) {
switch(ev) { switch(ev) {
case MG_EV_CLOSE: { case MG_EV_WEBSOCKET_HANDSHAKE_DONE: {
if (is_websocket(nc)) { fprintf(stdout,"New Websocket connection\n");
mpd_close_handler(nc); struct mg_str d = {(char *) "MPD_API_GET_SETTINGS", 20 };
} callback_mpd(nc, d);
d.p="MPD_API_GET_OUTPUTS";
d.len=19;
callback_mpd(nc, d);
break; break;
} }
case MG_EV_WEBSOCKET_FRAME: { case MG_EV_WEBSOCKET_FRAME: {
struct websocket_message *wm = (struct websocket_message *) ev_data; struct websocket_message *wm = (struct websocket_message *) ev_data;
wm->data[wm->size]='\0'; wm->data[wm->size]='\0';
struct mg_str d = {(char *) wm->data, wm->size}; struct mg_str d = {(char *) wm->data, wm->size};
fprintf(stdout,"Websocket request: %s\n",wm->data);
callback_mpd(nc, d); callback_mpd(nc, d);
break; break;
} }
case MG_EV_HTTP_REQUEST: { case MG_EV_HTTP_REQUEST: {
mg_serve_http(nc, (struct http_message *) ev_data, s_http_server_opts); struct http_message *hm = (struct http_message *) ev_data;
printf("HTTP request: %.*s\n",hm->uri.len,hm->uri.p);
mg_serve_http(nc, hm, s_http_server_opts);
break;
}
case MG_EV_CLOSE: {
if (is_websocket(nc)) {
fprintf(stdout,"Websocket connection closed\n");
mpd_close_handler(nc);
}
else {
fprintf(stdout,"HTTP Close\n");
}
break; break;
} }
} }