- /* 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;