fix crossfading issue with ogg
problem was, ov_read doesn't always fill to CHUNK_SIZE and we were moving chunk on every ov_read, instead now we only dump the buffer when its full git-svn-id: https://svn.musicpd.org/mpd/trunk@206 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
8b214b7c8c
commit
09efb14dbb
|
@ -345,7 +345,7 @@ void decode() {
|
||||||
else if((cb->begin!=cb->end || cb->wrap) &&
|
else if((cb->begin!=cb->end || cb->wrap) &&
|
||||||
cb->begin!=cb->next)
|
cb->begin!=cb->next)
|
||||||
{
|
{
|
||||||
if(doCrossFade==1 && cb->next>=0 &&
|
if(doCrossFade==1 && cb->next>=0 &&
|
||||||
((cb->next>cb->begin &&
|
((cb->next>cb->begin &&
|
||||||
(fadePosition=cb->next-cb->begin)
|
(fadePosition=cb->next-cb->begin)
|
||||||
<=crossFadeChunks) ||
|
<=crossFadeChunks) ||
|
||||||
|
@ -356,9 +356,9 @@ void decode() {
|
||||||
if(nextChunk<0) {
|
if(nextChunk<0) {
|
||||||
crossFadeChunks = fadePosition;
|
crossFadeChunks = fadePosition;
|
||||||
}
|
}
|
||||||
nextChunk = cb->begin+crossFadeChunks;
|
|
||||||
test = cb->end;
|
test = cb->end;
|
||||||
if(cb->wrap) test+=buffered_chunks;
|
if(cb->wrap) test+=buffered_chunks;
|
||||||
|
nextChunk = cb->begin+crossFadeChunks;
|
||||||
if(nextChunk<test) {
|
if(nextChunk<test) {
|
||||||
if(nextChunk>=buffered_chunks)
|
if(nextChunk>=buffered_chunks)
|
||||||
{
|
{
|
||||||
|
@ -390,10 +390,7 @@ void decode() {
|
||||||
{
|
{
|
||||||
doCrossFade = -1;
|
doCrossFade = -1;
|
||||||
}
|
}
|
||||||
else {
|
else continue;
|
||||||
usleep(10);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pc->elapsedTime = cb->times[cb->begin];
|
pc->elapsedTime = cb->times[cb->begin];
|
||||||
|
|
|
@ -63,6 +63,7 @@ int ogg_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc)
|
||||||
int eof = 0;
|
int eof = 0;
|
||||||
long ret;
|
long ret;
|
||||||
char chunk[CHUNK_SIZE];
|
char chunk[CHUNK_SIZE];
|
||||||
|
int chunkpos = 0;
|
||||||
long bitRate = 0;
|
long bitRate = 0;
|
||||||
long test;
|
long test;
|
||||||
|
|
||||||
|
@ -70,13 +71,17 @@ int ogg_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc)
|
||||||
if(dc->seek) {
|
if(dc->seek) {
|
||||||
cb->end = 0;
|
cb->end = 0;
|
||||||
cb->wrap = 0;
|
cb->wrap = 0;
|
||||||
|
chunkpos = 0;
|
||||||
ov_time_seek_page(&vf,dc->seekWhere);
|
ov_time_seek_page(&vf,dc->seekWhere);
|
||||||
dc->seek = 0;
|
dc->seek = 0;
|
||||||
}
|
}
|
||||||
ret = ov_read(&vf,chunk,CHUNK_SIZE,0,2,1,
|
ret = ov_read(&vf,chunk+chunkpos,
|
||||||
|
CHUNK_SIZE-chunkpos,
|
||||||
|
0,2,1,
|
||||||
¤t_section);
|
¤t_section);
|
||||||
if(ret<=0) eof = 1;
|
if(ret<=0) eof = 1;
|
||||||
else {
|
else chunkpos+=ret;
|
||||||
|
if(chunkpos>=CHUNK_SIZE || eof) {
|
||||||
while(cb->begin==cb->end && cb->wrap &&
|
while(cb->begin==cb->end && cb->wrap &&
|
||||||
!dc->stop && !dc->seek)
|
!dc->stop && !dc->seek)
|
||||||
{
|
{
|
||||||
|
@ -89,8 +94,9 @@ int ogg_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc)
|
||||||
af->bits);
|
af->bits);
|
||||||
#endif
|
#endif
|
||||||
memcpy(cb->chunks+cb->end*CHUNK_SIZE,
|
memcpy(cb->chunks+cb->end*CHUNK_SIZE,
|
||||||
chunk,CHUNK_SIZE);
|
chunk,chunkpos);
|
||||||
cb->chunkSize[cb->end] = ret;
|
cb->chunkSize[cb->end] = chunkpos;
|
||||||
|
chunkpos = 0;
|
||||||
cb->times[cb->end] = ov_time_tell(&vf);
|
cb->times[cb->end] = ov_time_tell(&vf);
|
||||||
if((test = ov_bitrate_instant(&vf))>0) {
|
if((test = ov_bitrate_instant(&vf))>0) {
|
||||||
bitRate = test/1000;
|
bitRate = test/1000;
|
||||||
|
|
Loading…
Reference in New Issue