mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-17 17:12:39 -05:00
Fix for FS#10492, by Aoyumi: Data abort errors when playing some Vorbis files.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22653 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
649b50cba1
commit
f733ec194f
3 changed files with 17 additions and 25 deletions
|
|
@ -164,9 +164,11 @@ static int _vds_init(vorbis_dsp_state *v,vorbis_info *vi){
|
||||||
|
|
||||||
/* allocate IRAM buffer for the PCM data generated by synthesis */
|
/* allocate IRAM buffer for the PCM data generated by synthesis */
|
||||||
iram_malloc_init();
|
iram_malloc_init();
|
||||||
v->iram_pcm=(ogg_int32_t *)iram_malloc(vi->channels*ci->blocksizes[1]*sizeof(ogg_int32_t));
|
v->first_pcm=(ogg_int32_t *)iram_malloc(vi->channels*ci->blocksizes[1]*sizeof(ogg_int32_t));
|
||||||
if(v->iram_pcm != NULL) v->iram_pcm_storage=ci->blocksizes[1];
|
/* when can't allocate IRAM buffer, allocate normal RAM buffer */
|
||||||
else v->iram_pcm_storage=0;
|
if(v->first_pcm == NULL){
|
||||||
|
v->first_pcm=(ogg_int32_t *)_ogg_malloc(vi->channels*ci->blocksizes[1]*sizeof(ogg_int32_t));
|
||||||
|
}
|
||||||
|
|
||||||
v->centerW=0;
|
v->centerW=0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -77,9 +77,8 @@ typedef struct vorbis_dsp_state{
|
||||||
|
|
||||||
void *backend_state;
|
void *backend_state;
|
||||||
|
|
||||||
ogg_int32_t *iram_pcm; /* IRAM PCM buffer */
|
ogg_int32_t *first_pcm; /* PCM buffer (for normal RAM or IRAM)*/
|
||||||
ogg_int32_t *iram_double_pcm; /* IRAM PCM 2nd buffer */
|
ogg_int32_t *iram_double_pcm; /* PCM 2nd buffer for IRAM */
|
||||||
int iram_pcm_storage; /* size of IRAM PCM buffer */
|
|
||||||
bool reset_pcmb;
|
bool reset_pcmb;
|
||||||
} vorbis_dsp_state;
|
} vorbis_dsp_state;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,10 +70,9 @@ int vorbis_synthesis(vorbis_block *vb,ogg_packet *op,int decodep){
|
||||||
if(decodep && vi->channels<=CHANNELS){
|
if(decodep && vi->channels<=CHANNELS){
|
||||||
vb->pcm = ipcm_vect;
|
vb->pcm = ipcm_vect;
|
||||||
|
|
||||||
/* alloc pcm passback storage */
|
/* set pcm end point */
|
||||||
vb->pcmend=ci->blocksizes[vb->W];
|
vb->pcmend=ci->blocksizes[vb->W];
|
||||||
if (vd->iram_pcm_storage >= vb->pcmend) {
|
/* use statically allocated buffer */
|
||||||
/* use statically allocated iram buffer */
|
|
||||||
if(vd->reset_pcmb || vb->pcm[0]==NULL)
|
if(vd->reset_pcmb || vb->pcm[0]==NULL)
|
||||||
{
|
{
|
||||||
/* one-time initialisation at codec start
|
/* one-time initialisation at codec start
|
||||||
|
|
@ -81,15 +80,7 @@ int vorbis_synthesis(vorbis_block *vb,ogg_packet *op,int decodep){
|
||||||
allows us to flip between buffers once initialised
|
allows us to flip between buffers once initialised
|
||||||
by simply flipping pointers */
|
by simply flipping pointers */
|
||||||
for(i=0; i<vi->channels; i++)
|
for(i=0; i<vi->channels; i++)
|
||||||
vb->pcm[i] = &vd->iram_pcm[i*vd->iram_pcm_storage];
|
vb->pcm[i] = &vd->first_pcm[i*ci->blocksizes[1]];
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(vd->reset_pcmb || vb->pcm[0]==NULL)
|
|
||||||
{
|
|
||||||
/* dynamic allocation (slower) */
|
|
||||||
for(i=0;i<vi->channels;i++)
|
|
||||||
vb->pcm[i]=(ogg_int32_t *)_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i]));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
vd->reset_pcmb = false;
|
vd->reset_pcmb = false;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue