From 544c13cc897b5cbfbae571fba25d023fd9037634 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 11 Sep 2008 07:49:51 +0200 Subject: shout: copy the audio_format, instead of taking a pointer Storing pointers to immutable audio_format structs isn't worth it, because the struct itself isn't much larger than the pointer. Since the shout plugin requires the user to configure a fixed audio format, we can simply copy it in myShout_initDriver(). --- src/audioOutputs/audioOutput_shout.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) (limited to 'src/audioOutputs') diff --git a/src/audioOutputs/audioOutput_shout.c b/src/audioOutputs/audioOutput_shout.c index dbc5e8b89..12a85293f 100644 --- a/src/audioOutputs/audioOutput_shout.c +++ b/src/audioOutputs/audioOutput_shout.c @@ -64,8 +64,8 @@ typedef struct _ShoutData { Timer *timer; - /* just a pointer to audioOutput->outAudioFormat */ - const struct audio_format *audioFormat; + /* the configured audio format */ + struct audio_format audio_format; } ShoutData; static ShoutData *newShoutData(void) @@ -81,7 +81,6 @@ static ShoutData *newShoutData(void) ret->timeout = DEFAULT_CONN_TIMEOUT; ret->connAttempts = 0; ret->lastAttempt = 0; - ret->audioFormat = NULL; ret->timer = NULL; return ret; @@ -196,7 +195,7 @@ static int myShout_initDriver(struct audio_output *audioOutput, } checkBlockParam("format"); - sd->audioFormat = &audioOutput->outAudioFormat; + sd->audio_format = audioOutput->outAudioFormat; if (shout_set_host(sd->shoutConn, host) != SHOUTERR_SUCCESS || shout_set_port(sd->shoutConn, port) != SHOUTERR_SUCCESS || @@ -242,10 +241,10 @@ static int myShout_initDriver(struct audio_output *audioOutput, char temp[11]; memset(temp, 0, sizeof(temp)); - snprintf(temp, sizeof(temp), "%d", sd->audioFormat->channels); + snprintf(temp, sizeof(temp), "%d", sd->audio_format.channels); shout_set_audio_info(sd->shoutConn, SHOUT_AI_CHANNELS, temp); - snprintf(temp, sizeof(temp), "%d", sd->audioFormat->sampleRate); + snprintf(temp, sizeof(temp), "%d", sd->audio_format.sampleRate); shout_set_audio_info(sd->shoutConn, SHOUT_AI_SAMPLERATE, temp); @@ -426,8 +425,8 @@ static int initEncoder(ShoutData * sd) if (sd->quality >= -1.0) { if (0 != vorbis_encode_init_vbr(&(sd->vi), - sd->audioFormat->channels, - sd->audioFormat->sampleRate, + sd->audio_format.channels, + sd->audio_format.sampleRate, sd->quality * 0.1)) { ERROR("problem setting up vorbis encoder for shout\n"); vorbis_info_clear(&(sd->vi)); @@ -435,8 +434,8 @@ static int initEncoder(ShoutData * sd) } } else { if (0 != vorbis_encode_init(&(sd->vi), - sd->audioFormat->channels, - sd->audioFormat->sampleRate, -1.0, + sd->audio_format.channels, + sd->audio_format.sampleRate, -1.0, sd->bitrate * 1000, -1.0)) { ERROR("problem setting up vorbis encoder for shout\n"); vorbis_info_clear(&(sd->vi)); @@ -607,7 +606,7 @@ static int myShout_play(struct audio_output *audioOutput, ShoutData *sd = (ShoutData *) audioOutput->data; float **vorbbuf; unsigned int samples; - int bytes = sd->audioFormat->bits / 8; + int bytes = sd->audio_format.bits / 8; int status; if (!sd->timer->started) @@ -629,14 +628,14 @@ static int myShout_play(struct audio_output *audioOutput, } } - samples = size / (bytes * sd->audioFormat->channels); + samples = size / (bytes * sd->audio_format.channels); /* this is for only 16-bit audio */ vorbbuf = vorbis_analysis_buffer(&(sd->vd), samples); for (i = 0; i < samples; i++) { - for (j = 0; j < sd->audioFormat->channels; j++) { + for (j = 0; j < sd->audio_format.channels; j++) { vorbbuf[j][i] = (*((const mpd_sint16 *) playChunk)) / 32768.0; playChunk += bytes; } -- cgit v1.2.3