summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/gstsbcenc.c3
-rw-r--r--sbc/sbc.c38
-rw-r--r--sbc/sbc.h1
3 files changed, 32 insertions, 10 deletions
diff --git a/audio/gstsbcenc.c b/audio/gstsbcenc.c
index 1749460d..54bb7f8a 100644
--- a/audio/gstsbcenc.c
+++ b/audio/gstsbcenc.c
@@ -215,8 +215,7 @@ gboolean gst_sbc_enc_fill_sbc_params(GstSbcEnc *enc, GstCaps *caps)
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;
diff --git a/sbc/sbc.c b/sbc/sbc.c
index ec1cc37d..12906718 100644
--- a/sbc/sbc.c
+++ b/sbc/sbc.c
@@ -1208,6 +1208,17 @@ struct sbc_priv {
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 @@ int sbc_init(sbc_t *sbc, unsigned long flags)
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 @@ int sbc_get_frame_length(sbc_t *sbc)
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,20 @@ int sbc_get_codesize(sbc_t *sbc)
{
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->init == 1)
+ memset(sbc->priv, 0, sizeof(struct sbc_priv));
+
+ sbc_fill_defaults(sbc, flags);
+
+ return 0;
+}
diff --git a/sbc/sbc.h b/sbc/sbc.h
index d55587d0..08c3e020 100644
--- a/sbc/sbc.h
+++ b/sbc/sbc.h
@@ -50,6 +50,7 @@ struct sbc_struct {
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);