static ssize_t wmadec_convert(char *inbuffer, size_t len,
struct filter_node *fn)
{
- int ret, out_size = fn->bufsize - fn->loaded;
+ int ret, converted = 0;
struct private_wmadec_data *pwd = fn->private_data;
- if (out_size < 128 * 1024)
- return 0;
if (len <= WMA_FRAME_SKIP)
return 0;
if (!pwd) {
fn->fc->samplerate = pwd->ahi.sample_rate;
return pwd->ahi.header_len;
}
- /* skip 31 bytes */
- if (len <= WMA_FRAME_SKIP + pwd->ahi.block_align)
- return 0;
- ret = wma_decode_superframe(pwd, fn->buf + fn->loaded,
- &out_size, (uint8_t *)inbuffer + WMA_FRAME_SKIP,
- len - WMA_FRAME_SKIP);
- if (ret < 0)
- return ret;
- fn->loaded += out_size;
- return ret + WMA_FRAME_SKIP;
+ for (;;) {
+ int out_size;
+ if (converted + WMA_FRAME_SKIP + pwd->ahi.block_align > len)
+ break;
+ out_size = fn->bufsize - fn->loaded;
+ if (out_size < 128 * 1024)
+ break;
+ ret = wma_decode_superframe(pwd, fn->buf + fn->loaded,
+ &out_size, (uint8_t *)inbuffer + converted + WMA_FRAME_SKIP,
+ len - WMA_FRAME_SKIP);
+ if (ret < 0)
+ return ret;
+ fn->loaded += out_size;
+ converted += ret + WMA_FRAME_SKIP;
+ }
+ return converted;
}
static void wmadec_close(struct filter_node *fn)