summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/mpa/decode.c97
-rw-r--r--modules/mpa/encode.c9
-rw-r--r--modules/mpa/mpa.c10
3 files changed, 67 insertions, 49 deletions
diff --git a/modules/mpa/decode.c b/modules/mpa/decode.c
index 5554d25..e862a1e 100644
--- a/modules/mpa/decode.c
+++ b/modules/mpa/decode.c
@@ -24,6 +24,9 @@ static void destructor(void *arg)
{
struct audec_state *ads = arg;
+ if(ads->resampler)
+ speex_resampler_destroy(ads->resampler);
+
mpg123_close(ads->dec);
mpg123_delete(ads->dec);
#ifdef DEBUG
@@ -71,7 +74,7 @@ int mpa_decode_update(struct audec_state **adsp, const struct aucodec *ac,
result = mpg123_param(ads->dec, MPG123_VERBOSE, 0, 0.);
#endif
if (result != MPG123_OK) {
- error("MPA libmpg123 param error %s",
+ error("MPA libmpg123 param error %s\n",
mpg123_plain_strerror(result));
err = EINVAL;
goto out;
@@ -80,7 +83,7 @@ int mpa_decode_update(struct audec_state **adsp, const struct aucodec *ac,
result = mpg123_format_all(ads->dec);
if (result != MPG123_OK) {
- error("MPA libmpg123 format error %s",
+ error("MPA libmpg123 format error %s\n",
mpg123_plain_strerror(result));
err = EINVAL;
goto out;
@@ -88,7 +91,7 @@ int mpa_decode_update(struct audec_state **adsp, const struct aucodec *ac,
result = mpg123_open_feed(ads->dec);
if (result != MPG123_OK) {
- error("MPA libmpg123 open feed error %s",
+ error("MPA libmpg123 open feed error %s\n",
mpg123_plain_strerror(result));
err = EINVAL;
goto out;
@@ -108,12 +111,16 @@ int mpa_decode_update(struct audec_state **adsp, const struct aucodec *ac,
int mpa_decode_frm(struct audec_state *ads, int16_t *sampv, size_t *sampc,
const uint8_t *buf, size_t len)
{
- int result, channels, encoding, i, result2;
+ int result, channels, encoding, i;
long samplerate;
size_t n;
spx_uint32_t intermediate_len;
spx_uint32_t out_len;
+#ifdef DEBUG
+ info("mpa decode start %d %ld\n",len, *sampc);
+#endif
+
if (!ads || !sampv || !sampc || !buf || len<=4)
return EINVAL;
@@ -123,46 +130,16 @@ int mpa_decode_frm(struct audec_state *ads, int16_t *sampv, size_t *sampc,
return EPROTO;
}
- if (ads->resampler) {
+ n = 0;
result = mpg123_decode(ads->dec, buf+4, len-4,
(unsigned char*)ads->intermediate_buffer,
sizeof(ads->intermediate_buffer), &n);
/* n counts bytes */
- intermediate_len = n / 2 / ads->channels;
- /* intermediate_len counts samples per channel */
- out_len = *sampc;
- result2=speex_resampler_process_interleaved_int(
- ads->resampler, ads->intermediate_buffer,
- &intermediate_len, sampv, &out_len);
- if (result2!=RESAMPLER_ERR_SUCCESS) {
- error("mpa: upsample error: %s %d %d\n",
- strerror(result), out_len, *sampc/2);
- return EPROTO;
- }
-#ifdef DEBUG
- info("mpa decode %d %d %d %d\n",intermediate_len,*sampc,
- out_len,n);
-#endif
- *sampc = out_len * ads->channels;
- }
- else {
- result = mpg123_decode(ads->dec, buf+4, len-4,
- (unsigned char*)sampv, *sampc*2, &n);
+
#ifdef DEBUG
- info("mpa decode %d %d\n",*sampc,n);
+ info("mpa decoded %d %d %d %d\n",result, len-4, n, ads->channels);
#endif
- *sampc = n / 2;
- }
- if (ads->start<100) { /* mpg123 needs some to sync */
- ads->start++;
- *sampc=0;
- }
- if (ads->channels==1) {
- for (i=*sampc-1;i>=0;i--)
- sampv[i+i+1]=sampv[i+i]=sampv[i];
- *sampc *= 2;
- }
if (result == MPG123_NEW_FORMAT) {
mpg123_getformat(ads->dec, &samplerate, &channels, &encoding);
@@ -171,6 +148,8 @@ int mpa_decode_frm(struct audec_state *ads, int16_t *sampv, size_t *sampc,
ads->channels = channels;
ads->start = 0;
+ if(ads->resampler)
+ speex_resampler_destroy(ads->resampler);
if (samplerate != 48000) {
ads->resampler = speex_resampler_init(channels,
samplerate, 48000, 3, &result);
@@ -183,17 +162,53 @@ int mpa_decode_frm(struct audec_state *ads, int16_t *sampv, size_t *sampc,
else
ads->resampler = NULL;
}
- else if (result == MPG123_NEED_MORE)
- return 0;
+ else if (result == MPG123_NEED_MORE) ;
+// return 0;
else if (result != MPG123_OK) {
- error("MPA libmpg123 feed error %d %s", result,
+ error("MPA libmpg123 feed error %d %s\n", result,
mpg123_plain_strerror(result));
return EPROTO;
}
+ if (ads->resampler) {
+ intermediate_len = n / 2 / ads->channels;
+ /* intermediate_len counts samples per channel */
+ out_len = *sampc / 2;
+
+ result=speex_resampler_process_interleaved_int(
+ ads->resampler, ads->intermediate_buffer,
+ &intermediate_len, sampv, &out_len);
+ if (result!=RESAMPLER_ERR_SUCCESS) {
+ error("mpa: upsample error: %s %d %d\n",
+ strerror(result), out_len, *sampc/2);
+ return EPROTO;
+ }
+ if (ads->channels==1) {
+ for (i=out_len-1;i>=0;i--)
+ sampv[i+i+1]=sampv[i+i]=sampv[i];
+ *sampc = out_len * 2;
+ }
+ else
+ *sampc = out_len * ads->channels;
+ }
+ else {
+ n /= 2;
+ if(ads->channels!=1) {
+ for(i=0;(unsigned)i<n;i++)
+ sampv[i]=ads->intermediate_buffer[i];
+ *sampc = n;
+ }
+ else {
+ for(i=0;(unsigned)i<n;i++)
+ sampv[i*2]=sampv[i*2+1]=ads->intermediate_buffer[i];
+ *sampc = n * 2;
+ }
+
#ifdef DEBUG
- debug("mpa decode %d %d %d\n",*sampc,len,n);
+ info("mpa decode done %d\n",*sampc);
#endif
+ }
+
return 0;
}
diff --git a/modules/mpa/encode.c b/modules/mpa/encode.c
index 6ed6493..db18a61 100644
--- a/modules/mpa/encode.c
+++ b/modules/mpa/encode.c
@@ -23,6 +23,9 @@ static void destructor(void *arg)
{
struct auenc_state *aes = arg;
+ if(aes->resampler)
+ speex_resampler_destroy(aes->resampler);
+
if (aes->enc)
twolame_close(&aes->enc);
#ifdef DEBUG
@@ -51,7 +54,7 @@ int mpa_encode_update(struct auenc_state **aesp, const struct aucodec *ac,
aes = mem_zalloc(sizeof(*aes), destructor);
aes->enc = twolame_init();
if (!aes->enc) {
- error("mpa: encoder create failed");
+ error("mpa: encoder create failed\n");
mem_deref(aes);
return ENOMEM;
}
@@ -96,9 +99,9 @@ int mpa_encode_update(struct auenc_state **aesp, const struct aucodec *ac,
err=EINVAL;
goto out;
}
-
+#ifdef DEBUG
twolame_print_config(aes->enc);
-
+#endif
if (prm.samplerate != 48000) {
aes->resampler = speex_resampler_init(2, 48000,
prm.samplerate, 3, &result);
diff --git a/modules/mpa/mpa.c b/modules/mpa/mpa.c
index 6276bf2..2086ee4 100644
--- a/modules/mpa/mpa.c
+++ b/modules/mpa/mpa.c
@@ -82,7 +82,7 @@ static struct aucodec mpa = {
.pt = "14",
.name = "MPA",
.srate = 90000,
- .ch = 1,
+ .ch = 2,
.fmtp = "",
.encupdh = mpa_encode_update,
.ench = mpa_encode_frm,
@@ -106,7 +106,7 @@ static int module_init(void)
if (0 == conf_get_u32(conf, "mpa_bitrate", &value)) {
if (value<8000 || value>384000) {
error("MPA bitrate between 8000 and "
- "384000 are allowed.");
+ "384000 are allowed.\n");
return -1;
}
@@ -134,7 +134,7 @@ static int module_init(void)
break;
default:
error("MPA samplerates of 16, 22.05, 24, 32, "
- "44.1, and 48 kHz are allowed.");
+ "44.1, and 48 kHz are allowed.\n");
return -1;
}
(void)re_snprintf(fmtp+strlen(fmtp),
@@ -153,7 +153,7 @@ static int module_init(void)
&& strcmp(mode,"single_channel")
&& strcmp(mode,"dual_channel")) {
error("MPA mode: Permissible values are stereo, "
- "joint_stereo, single_channel, dual_channel");
+ "joint_stereo, single_channel, dual_channel.\n");
return -1;
}
@@ -170,7 +170,7 @@ static int module_init(void)
/* init decoder library */
res = mpg123_init();
if (res != MPG123_OK) {
- error("MPA libmpg123 init error %s",
+ error("MPA libmpg123 init error %s\n",
mpg123_plain_strerror(res));
return -1;
}