aboutsummaryrefslogtreecommitdiffstats
path: root/src/audioOutput_shout.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/audioOutput_shout.c')
-rw-r--r--src/audioOutput_shout.c44
1 files changed, 39 insertions, 5 deletions
diff --git a/src/audioOutput_shout.c b/src/audioOutput_shout.c
index 4876ae508..c6d769a9b 100644
--- a/src/audioOutput_shout.c
+++ b/src/audioOutput_shout.c
@@ -68,6 +68,7 @@ typedef struct _ShoutData {
int opened;
MpdTag * tag;
+ int tagToSend;
} ShoutData;
static ShoutData * newShoutData() {
@@ -78,6 +79,7 @@ static ShoutData * newShoutData() {
ret->convBufferLen = 0;
ret->opened = 0;
ret->tag = NULL;
+ ret->tagToSend = 0;
ret->bitrate = -1;
ret->quality = -1.0;
@@ -236,7 +238,26 @@ static int shout_initDriver(AudioOutput * audioOutput, ConfigParam * param) {
return 0;
}
+/*static void finishEncoder(ShoutData * sd) {
+ vorbis_analysis_wrote(&sd->vd, 0);
+
+ while(vorbis_analysis_blockout(&sd->vd, &sd->vb) == 1) {
+ vorbis_analysis(&sd->vb, NULL);
+ vorbis_bitrate_addblock(&sd->vb);
+ while(vorbis_bitrate_flushpacket(&sd->vd, &sd->op)) {
+ ogg_stream_packetin(&sd->os, &sd->op);
+ }
+ }
+}
+
+static void flushEncoder(ShoutData * sd) {
+ while(1 == ogg_stream_pageout(&sd->os, &sd->og));
+}*/
+
static void clearEncoder(ShoutData * sd) {
+ /*finishEncoder(sd);*/
+ /*flushEncoder(sd);*/
+
ogg_stream_clear(&(sd->os));
vorbis_block_clear(&(sd->vb));
vorbis_dsp_clear(&(sd->vd));
@@ -245,9 +266,12 @@ static void clearEncoder(ShoutData * sd) {
}
static void shout_closeShoutConn(ShoutData * sd) {
+ DEBUG("closeShoutConn called\n");
+
if(sd->opened) {
clearEncoder(sd);
+ shout_sync(sd->shoutConn);
if(shout_close(sd->shoutConn) != SHOUTERR_SUCCESS) {
ERROR("problem closing connection to shout server: "
"%s\n", shout_get_error(sd->shoutConn));
@@ -270,6 +294,10 @@ static void shout_finishDriver(AudioOutput * audioOutput) {
}
static void shout_closeDevice(AudioOutput * audioOutput) {
+ ShoutData * sd = (ShoutData *)audioOutput->data;
+
+ if(sd->opened) shout_sync(sd->shoutConn);
+
audioOutput->open = 0;
}
@@ -360,6 +388,8 @@ static int initEncoder(ShoutData * sd) {
static int shout_openShoutConn(AudioOutput * audioOutput) {
ShoutData * sd = (ShoutData *)audioOutput->data;
+ DEBUG("openShoutConn called\n");
+
if(shout_open(sd->shoutConn) != SHOUTERR_SUCCESS)
{
ERROR("problem opening connection to shout server: %s\n",
@@ -387,8 +417,9 @@ static int shout_openShoutConn(AudioOutput * audioOutput) {
if(write_page(sd) < 0) return -1;
}
- if(sd->tag) freeMpdTag(sd->tag);
- sd->tag = NULL;
+ /*if(sd->tag) freeMpdTag(sd->tag);
+ sd->tag = NULL;*/
+ sd->tagToSend = 0;
sd->opened = 1;
@@ -464,8 +495,9 @@ static void shout_sendMetadata(ShoutData * sd) {
if(write_page(sd) < 0) return;
}
- if(sd->tag) freeMpdTag(sd->tag);
- sd->tag = NULL;
+ /*if(sd->tag) freeMpdTag(sd->tag);
+ sd->tag = NULL;*/
+ sd->tagToSend = 0;
}
static int shout_play(AudioOutput * audioOutput, char * playChunk, int size) {
@@ -475,7 +507,7 @@ static int shout_play(AudioOutput * audioOutput, char * playChunk, int size) {
int samples;
int bytes = sd->outAudioFormat.bits/8;
- if(sd->opened && sd->tag) shout_sendMetadata(sd);
+ if(sd->opened && sd->tagToSend) shout_sendMetadata(sd);
if(!sd->opened) {
if(shout_openShoutConn(audioOutput) < 0) {
@@ -525,10 +557,12 @@ static void shout_setTag(AudioOutput * audioOutput, MpdTag * tag) {
if(sd->tag) freeMpdTag(sd->tag);
sd->tag = NULL;
+ sd->tagToSend = 0;
if(!tag) return;
sd->tag = mpdTagDup(tag);
+ sd->tagToSend = 1;
}
AudioOutputPlugin shoutPlugin =