summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2014-01-23 14:16:38 +0200
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2014-01-23 14:19:42 +0200
commit6e079c0287c81f91d76828f57d1154958a9f1989 (patch)
treecbb7268c056b717569871805a58b5d8fc3b15aba
parent27fab34fb2d1dc97fcce849de709cd17638826d8 (diff)
downloadsbc-6e079c0287c81f91d76828f57d1154958a9f1989.tar.gz
sbc: Add sbc_reinit_a2dp
This adds sbc_reinit_a2dp that can be used to reconfigure a previous initialized sbc_t with new A2DP configuration.
-rw-r--r--sbc/sbc.c49
-rw-r--r--sbc/sbc.h2
2 files changed, 37 insertions, 14 deletions
diff --git a/sbc/sbc.c b/sbc/sbc.c
index 51bca55..534027e 100644
--- a/sbc/sbc.c
+++ b/sbc/sbc.c
@@ -1087,19 +1087,14 @@ SBC_EXPORT int sbc_init_msbc(sbc_t *sbc, unsigned long flags)
return 0;
}
-SBC_EXPORT int sbc_init_a2dp(sbc_t *sbc, unsigned long flags,
+static int sbc_set_a2dp(sbc_t *sbc, unsigned long flags,
const void *conf, size_t conf_len)
{
const struct a2dp_sbc *a2dp;
- int err;
if (conf_len != sizeof(*a2dp))
return -EINVAL;
- err = sbc_init(sbc, flags);
- if (err < 0)
- return err;
-
a2dp = conf;
switch (a2dp->frequency) {
@@ -1116,7 +1111,7 @@ SBC_EXPORT int sbc_init_a2dp(sbc_t *sbc, unsigned long flags,
sbc->frequency = SBC_FREQ_48000;
break;
default:
- goto failed;
+ return -EINVAL;
}
switch (a2dp->channel_mode) {
@@ -1133,7 +1128,7 @@ SBC_EXPORT int sbc_init_a2dp(sbc_t *sbc, unsigned long flags,
sbc->mode = SBC_MODE_JOINT_STEREO;
break;
default:
- goto failed;
+ return -EINVAL;
}
switch (a2dp->allocation_method) {
@@ -1144,7 +1139,7 @@ SBC_EXPORT int sbc_init_a2dp(sbc_t *sbc, unsigned long flags,
sbc->allocation = SBC_AM_LOUDNESS;
break;
default:
- goto failed;
+ return -EINVAL;
}
switch (a2dp->subbands) {
@@ -1155,7 +1150,7 @@ SBC_EXPORT int sbc_init_a2dp(sbc_t *sbc, unsigned long flags,
sbc->subbands = SBC_SB_8;
break;
default:
- goto failed;
+ return -EINVAL;
}
switch (a2dp->block_length) {
@@ -1172,14 +1167,40 @@ SBC_EXPORT int sbc_init_a2dp(sbc_t *sbc, unsigned long flags,
sbc->blocks = SBC_BLK_16;
break;
default:
- goto failed;
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+SBC_EXPORT int sbc_init_a2dp(sbc_t *sbc, unsigned long flags,
+ const void *conf, size_t conf_len)
+{
+ int err;
+
+ err = sbc_init(sbc, flags);
+ if (err < 0)
+ return err;
+
+ err = sbc_set_a2dp(sbc, flags, conf, conf_len);
+ if (err < 0) {
+ sbc_finish(sbc);
+ return err;
}
return 0;
+}
+
+int sbc_reinit_a2dp(sbc_t *sbc, unsigned long flags,
+ const void *conf, size_t conf_len)
+{
+ int err;
+
+ err = sbc_reinit(sbc, flags);
+ if (err < 0)
+ return err;
-failed:
- sbc_finish(sbc);
- return -EINVAL;
+ return sbc_set_a2dp(sbc, flags, conf, conf_len);
}
SBC_EXPORT ssize_t sbc_parse(sbc_t *sbc, const void *input, size_t input_len)
diff --git a/sbc/sbc.h b/sbc/sbc.h
index a542845..d6f123e 100644
--- a/sbc/sbc.h
+++ b/sbc/sbc.h
@@ -87,6 +87,8 @@ int sbc_reinit(sbc_t *sbc, unsigned long flags);
int sbc_init_msbc(sbc_t *sbc, unsigned long flags);
int sbc_init_a2dp(sbc_t *sbc, unsigned long flags,
const void *conf, size_t conf_len);
+int sbc_reinit_a2dp(sbc_t *sbc, unsigned long flags,
+ const void *conf, size_t conf_len);
ssize_t sbc_parse(sbc_t *sbc, const void *input, size_t input_len);