mirror of
https://github.com/owntone/owntone-server.git
synced 2025-04-20 02:37:26 -04:00
[player] Reconnect on http read error
This commit is contained in:
parent
6e58af75cf
commit
c54f0018e3
111
src/player.c
111
src/player.c
@ -949,6 +949,51 @@ stream_play(struct player_source *ps)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Stops playback and cleanup for the given player source
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
stream_stop(struct player_source *ps)
|
||||||
|
{
|
||||||
|
if (!ps)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_PLAYER, "Stream cleanup called with no active streaming player source\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ps->setup_done)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_PLAYER, "Given player source not setup, cleanup not possible\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ps->data_kind)
|
||||||
|
{
|
||||||
|
case DATA_KIND_FILE:
|
||||||
|
case DATA_KIND_HTTP:
|
||||||
|
if (ps->xcode)
|
||||||
|
{
|
||||||
|
transcode_cleanup(ps->xcode);
|
||||||
|
ps->xcode = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DATA_KIND_SPOTIFY:
|
||||||
|
#ifdef HAVE_SPOTIFY_H
|
||||||
|
spotify_playback_stop();
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DATA_KIND_PIPE:
|
||||||
|
pipe_cleanup();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ps->setup_done = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read up to "len" data from the given player source and returns
|
* Read up to "len" data from the given player source and returns
|
||||||
* the actual amount of data read.
|
* the actual amount of data read.
|
||||||
@ -956,6 +1001,7 @@ stream_play(struct player_source *ps)
|
|||||||
static int
|
static int
|
||||||
stream_read(struct player_source *ps, int len)
|
stream_read(struct player_source *ps, int len)
|
||||||
{
|
{
|
||||||
|
struct media_file_info *mfi;
|
||||||
int icy_timer;
|
int icy_timer;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -976,6 +1022,26 @@ stream_read(struct player_source *ps, int len)
|
|||||||
{
|
{
|
||||||
case DATA_KIND_HTTP:
|
case DATA_KIND_HTTP:
|
||||||
ret = transcode(audio_buf, len, ps->xcode, &icy_timer);
|
ret = transcode(audio_buf, len, ps->xcode, &icy_timer);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_PLAYER, "Connection lost, trying to reconnect in 5 sec (source id %d)\n", ps->id);
|
||||||
|
|
||||||
|
stream_stop(ps);
|
||||||
|
|
||||||
|
mfi = db_file_fetch_byid(ps->id);
|
||||||
|
if (!mfi)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
sleep(5);
|
||||||
|
ret = stream_setup(ps, mfi);
|
||||||
|
free_mfi(mfi, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
stream_play(ps); // Just for good measure - doesn't do anything right now
|
||||||
|
|
||||||
|
ret = transcode(audio_buf, len, ps->xcode, &icy_timer);
|
||||||
|
}
|
||||||
|
|
||||||
if (icy_timer)
|
if (icy_timer)
|
||||||
metadata_check_icy();
|
metadata_check_icy();
|
||||||
@ -1098,51 +1164,6 @@ stream_seek(struct player_source *ps, int seek_ms)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Stops playback and cleanup for the given player source
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
stream_stop(struct player_source *ps)
|
|
||||||
{
|
|
||||||
if (!ps)
|
|
||||||
{
|
|
||||||
DPRINTF(E_LOG, L_PLAYER, "Stream cleanup called with no active streaming player source\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ps->setup_done)
|
|
||||||
{
|
|
||||||
DPRINTF(E_LOG, L_PLAYER, "Given player source not setup, cleanup not possible\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (ps->data_kind)
|
|
||||||
{
|
|
||||||
case DATA_KIND_FILE:
|
|
||||||
case DATA_KIND_HTTP:
|
|
||||||
if (ps->xcode)
|
|
||||||
{
|
|
||||||
transcode_cleanup(ps->xcode);
|
|
||||||
ps->xcode = NULL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DATA_KIND_SPOTIFY:
|
|
||||||
#ifdef HAVE_SPOTIFY_H
|
|
||||||
spotify_playback_stop();
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DATA_KIND_PIPE:
|
|
||||||
pipe_cleanup();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ps->setup_done = 0;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static struct player_source *
|
static struct player_source *
|
||||||
source_now_playing()
|
source_now_playing()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user