]> code.delx.au - pulseaudio/commitdiff
bluetooth: detect when bitpool has changed on sbc codec
authorLuiz Augusto von Dentz <luiz.dentz-von@nokia.com>
Thu, 23 Dec 2010 11:13:28 +0000 (13:13 +0200)
committerLuiz Augusto von Dentz <luiz.dentz-von@nokia.com>
Thu, 23 Dec 2010 11:16:43 +0000 (13:16 +0200)
A2DP spec allow bitpool changes midstream which is why sbc configuration
has a range of values for bitpool that the encoder can use and decoder
must support.

Bitpool changes do not affect the state of encoder/decoder so they don't
need to be reinitialize when this happens, so the impact is fairly small,
what it does change is the frame length so encoders may change the
bitpool to use the link more efficiently.

src/modules/bluetooth/sbc.c

index 779be4bd975b981d6dd4b7a13c78b85e91aee1e0..5157c70f44c4d07773919bcc98bd5f5e50723159 100644 (file)
@@ -1005,7 +1005,8 @@ ssize_t sbc_decode(sbc_t *sbc, const void *input, size_t input_len,
 
                priv->frame.codesize = sbc_get_codesize(sbc);
                priv->frame.length = framelen;
-       }
+       } else if (priv->frame.bitpool != sbc->bitpool)
+               sbc->bitpool = priv->frame.bitpool;
 
        if (!output)
                return framelen;
@@ -1076,6 +1077,9 @@ ssize_t sbc_encode(sbc_t *sbc, const void *input, size_t input_len,
 
                sbc_encoder_init(&priv->enc_state, &priv->frame);
                priv->init = 1;
+       } else if (priv->frame.bitpool != sbc->bitpool) {
+               priv->frame.length = sbc_get_frame_length(sbc);
+               priv->frame.bitpool = sbc->bitpool;
        }
 
        /* input must be large enough to encode a complete frame */
@@ -1140,7 +1144,7 @@ size_t sbc_get_frame_length(sbc_t *sbc)
        struct sbc_priv *priv;
 
        priv = sbc->priv;
-       if (priv->init)
+       if (priv->init && priv->frame.bitpool == sbc->bitpool)
                return priv->frame.length;
 
        subbands = sbc->subbands ? 8 : 4;