Index: audio/gstsbcenc.c =================================================================== RCS file: /cvsroot/bluez/utils/audio/gstsbcenc.c,v retrieving revision 1.11 diff -u -r1.11 gstsbcenc.c --- audio/gstsbcenc.c 12 Nov 2007 22:21:45 -0000 1.11 +++ audio/gstsbcenc.c 13 Nov 2007 17:52:56 -0000 @@ -215,8 +215,7 @@ if (!(allocation = gst_structure_get_string(structure, "allocation"))) return FALSE; - sbc_finish(&enc->sbc); - sbc_init(&enc->sbc, 0); + sbc_reinit(&enc->sbc, 0); enc->sbc.rate = rate; enc->sbc.channels = channels; enc->blocks = blocks; Index: sbc/sbc.c =================================================================== RCS file: /cvsroot/bluez/utils/sbc/sbc.c,v retrieving revision 1.22 diff -u -r1.22 sbc.c --- sbc/sbc.c 12 Nov 2007 18:16:00 -0000 1.22 +++ sbc/sbc.c 13 Nov 2007 17:52:57 -0000 @@ -1208,6 +1208,17 @@ struct sbc_encoder_state enc_state; }; +static void sbc_fill_defaults(sbc_t *sbc, unsigned long flags) +{ + sbc->rate = 44100; + sbc->channels = 2; + sbc->joint = 0; + sbc->subbands = 8; + sbc->blocks = 16; + sbc->bitpool = 32; + sbc->swap = 0; +} + int sbc_init(sbc_t *sbc, unsigned long flags) { if (!sbc) @@ -1221,13 +1232,7 @@ memset(sbc->priv, 0, sizeof(struct sbc_priv)); - sbc->rate = 44100; - sbc->channels = 2; - sbc->joint = 0; - sbc->subbands = 8; - sbc->blocks = 16; - sbc->bitpool = 32; - sbc->swap = 0; + sbc_fill_defaults(sbc, flags); return 0; } @@ -1389,7 +1394,7 @@ ret = 4 + (4 * sbc->subbands * sbc->channels) / 8; - /* This term is not always evenly devide so we round it up */ + /* This term is not always evenly divide so we round it up */ if (sbc->channels == 1) ret += ((sbc->blocks * sbc->channels * sbc->bitpool) + 7) / 8; else @@ -1403,3 +1408,27 @@ { return sbc->subbands * sbc->blocks * sbc->channels * 2; } + +int sbc_reinit(sbc_t *sbc, unsigned long flags) +{ + struct sbc_priv *priv; + + if (!sbc || !sbc->priv) + return -EIO; + + priv = sbc->priv; + + if (priv && priv->init == 1) { + free(sbc->priv); + + sbc->priv = malloc(sizeof(struct sbc_priv)); + if (!sbc->priv) + return -ENOMEM; + + memset(sbc->priv, 0, sizeof(struct sbc_priv)); + } + + sbc_fill_defaults(sbc, flags); + + return 0; +} Index: sbc/sbc.h =================================================================== RCS file: /cvsroot/bluez/utils/sbc/sbc.h,v retrieving revision 1.7 diff -u -r1.7 sbc.h --- sbc/sbc.h 12 Nov 2007 18:16:00 -0000 1.7 +++ sbc/sbc.h 13 Nov 2007 17:52:57 -0000 @@ -50,6 +50,7 @@ typedef struct sbc_struct sbc_t; int sbc_init(sbc_t *sbc, unsigned long flags); +int sbc_reinit(sbc_t *sbc, unsigned long flags); int sbc_parse(sbc_t *sbc, void *input, int input_len); int sbc_decode(sbc_t *sbc, void *input, int input_len, void *output, int output_len, int *len);