slightly better error handling/broken connection detection for shout output
git-svn-id: https://svn.musicpd.org/mpd/trunk@2316 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
23c59e8cda
commit
8dbbea8598
|
@ -64,6 +64,8 @@ typedef struct _ShoutData {
|
||||||
long convBufferLen;
|
long convBufferLen;
|
||||||
/* shoud we convert the audio to a different format? */
|
/* shoud we convert the audio to a different format? */
|
||||||
int audioFormatConvert;
|
int audioFormatConvert;
|
||||||
|
|
||||||
|
int opened;
|
||||||
} ShoutData;
|
} ShoutData;
|
||||||
|
|
||||||
static ShoutData * newShoutData() {
|
static ShoutData * newShoutData() {
|
||||||
|
@ -73,6 +75,7 @@ static ShoutData * newShoutData() {
|
||||||
ret->serialno = rand();
|
ret->serialno = rand();
|
||||||
ret->convBuffer = NULL;
|
ret->convBuffer = NULL;
|
||||||
ret->convBufferLen = 0;
|
ret->convBufferLen = 0;
|
||||||
|
ret->opened = 0;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -187,9 +190,28 @@ static int shout_initDriver(AudioOutput * audioOutput) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void shout_closeShoutConn(ShoutData * sd) {
|
||||||
|
if(sd->opened) {
|
||||||
|
if(shout_close(sd->shoutConn) != SHOUTERR_SUCCESS) {
|
||||||
|
ERROR("problem closing connection to shout server: "
|
||||||
|
"%s\n", shout_get_error(sd->shoutConn));
|
||||||
|
}
|
||||||
|
|
||||||
|
ogg_stream_clear(&(sd->os));
|
||||||
|
vorbis_block_clear(&(sd->vb));
|
||||||
|
vorbis_dsp_clear(&(sd->vd));
|
||||||
|
vorbis_comment_clear(&(sd->vc));
|
||||||
|
vorbis_info_clear(&(sd->vi));
|
||||||
|
}
|
||||||
|
|
||||||
|
sd->opened = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void shout_finishDriver(AudioOutput * audioOutput) {
|
static void shout_finishDriver(AudioOutput * audioOutput) {
|
||||||
ShoutData * sd = (ShoutData *)audioOutput->data;
|
ShoutData * sd = (ShoutData *)audioOutput->data;
|
||||||
|
|
||||||
|
shout_closeShoutConn(sd);
|
||||||
|
|
||||||
freeShoutData(sd);
|
freeShoutData(sd);
|
||||||
|
|
||||||
shoutInitCount--;
|
shoutInitCount--;
|
||||||
|
@ -198,29 +220,33 @@ static void shout_finishDriver(AudioOutput * audioOutput) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shout_closeDevice(AudioOutput * audioOutput) {
|
static void shout_closeDevice(AudioOutput * audioOutput) {
|
||||||
ShoutData * sd = (ShoutData *) audioOutput->data;
|
|
||||||
|
|
||||||
if(shout_close(sd->shoutConn) != SHOUTERR_SUCCESS)
|
|
||||||
{
|
|
||||||
ERROR("problem closing connection to shout server: %s\n",
|
|
||||||
shout_get_error(sd->shoutConn));
|
|
||||||
}
|
|
||||||
|
|
||||||
ogg_stream_clear(&(sd->os));
|
|
||||||
vorbis_block_clear(&(sd->vb));
|
|
||||||
vorbis_dsp_clear(&(sd->vd));
|
|
||||||
vorbis_comment_clear(&(sd->vc));
|
|
||||||
vorbis_info_clear(&(sd->vi));
|
|
||||||
|
|
||||||
audioOutput->open = 0;
|
audioOutput->open = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void shout_handleError(ShoutData * sd, int err) {
|
||||||
|
switch(err) {
|
||||||
|
case SHOUTERR_SUCCESS:
|
||||||
|
break;
|
||||||
|
case SHOUTERR_UNCONNECTED:
|
||||||
|
case SHOUTERR_SOCKET:
|
||||||
|
ERROR("Lost shout connection, attempting to reconnect\n");
|
||||||
|
shout_close(sd->shoutConn);
|
||||||
|
shout_open(sd->shoutConn);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERROR("shout: error: %s\n", shout_get_error(sd->shoutConn));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void write_page(ShoutData * sd) {
|
static void write_page(ShoutData * sd) {
|
||||||
if(!sd->og.header_len || !sd->og.body_len) return;
|
if(!sd->og.header_len || !sd->og.body_len) return;
|
||||||
|
|
||||||
shout_sync(sd->shoutConn);
|
/*shout_sync(sd->shoutConn);*/
|
||||||
shout_send(sd->shoutConn, sd->og.header, sd->og.header_len);
|
int err = shout_send(sd->shoutConn, sd->og.header, sd->og.header_len);
|
||||||
shout_send(sd->shoutConn, sd->og.body, sd->og.body_len);
|
shout_handleError(sd, err);
|
||||||
|
err = shout_send(sd->shoutConn, sd->og.body, sd->og.body_len);
|
||||||
|
shout_handleError(sd, err);
|
||||||
shout_sync(sd->shoutConn);
|
shout_sync(sd->shoutConn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,10 +255,25 @@ static int shout_openDevice(AudioOutput * audioOutput,
|
||||||
{
|
{
|
||||||
ShoutData * sd = (ShoutData *)audioOutput->data;
|
ShoutData * sd = (ShoutData *)audioOutput->data;
|
||||||
|
|
||||||
|
memcpy(&(sd->inAudioFormat), audioFormat, sizeof(AudioFormat));
|
||||||
|
|
||||||
|
if(0 == memcmp(&(sd->inAudioFormat), &(sd->outAudioFormat),
|
||||||
|
sizeof(AudioFormat)))
|
||||||
|
{
|
||||||
|
sd->audioFormatConvert = 0;
|
||||||
|
}
|
||||||
|
else sd->audioFormatConvert = 1;
|
||||||
|
|
||||||
|
audioOutput->open = 1;
|
||||||
|
|
||||||
|
if(sd->opened) return 0;
|
||||||
|
|
||||||
if(shout_open(sd->shoutConn) != SHOUTERR_SUCCESS)
|
if(shout_open(sd->shoutConn) != SHOUTERR_SUCCESS)
|
||||||
{
|
{
|
||||||
ERROR("problem opening connection to shout server: %s\n",
|
ERROR("problem opening connection to shout server: %s\n",
|
||||||
shout_get_error(sd->shoutConn));
|
shout_get_error(sd->shoutConn));
|
||||||
|
|
||||||
|
audioOutput->open = 0;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,6 +284,8 @@ static int shout_openDevice(AudioOutput * audioOutput,
|
||||||
{
|
{
|
||||||
ERROR("problem seting up vorbis encoder for shout\n");
|
ERROR("problem seting up vorbis encoder for shout\n");
|
||||||
vorbis_info_clear(&(sd->vi));
|
vorbis_info_clear(&(sd->vi));
|
||||||
|
shout_close(sd->shoutConn);
|
||||||
|
audioOutput->open = 0;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,21 +302,12 @@ static int shout_openDevice(AudioOutput * audioOutput,
|
||||||
ogg_stream_packetin(&(sd->os), &(sd->header_comments));
|
ogg_stream_packetin(&(sd->os), &(sd->header_comments));
|
||||||
ogg_stream_packetin(&(sd->os), &(sd->header_codebooks));
|
ogg_stream_packetin(&(sd->os), &(sd->header_codebooks));
|
||||||
|
|
||||||
audioOutput->open = 1;
|
|
||||||
|
|
||||||
while(ogg_stream_flush(&(sd->os), &(sd->og)))
|
while(ogg_stream_flush(&(sd->os), &(sd->og)))
|
||||||
{
|
{
|
||||||
write_page(sd);
|
write_page(sd);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(&(sd->inAudioFormat), audioFormat, sizeof(AudioFormat));
|
sd->opened = 1;
|
||||||
|
|
||||||
if(0 == memcmp(&(sd->inAudioFormat), &(sd->outAudioFormat),
|
|
||||||
sizeof(AudioFormat)))
|
|
||||||
{
|
|
||||||
sd->audioFormatConvert = 0;
|
|
||||||
}
|
|
||||||
else sd->audioFormatConvert = 1;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue