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:
Warren Dukes 2004-03-05 16:02:47 +00:00
parent 8b214b7c8c
commit 09efb14dbb
2 changed files with 13 additions and 10 deletions

View File

@ -356,9 +356,9 @@ void decode() {
if(nextChunk<0) {
crossFadeChunks = fadePosition;
}
nextChunk = cb->begin+crossFadeChunks;
test = cb->end;
if(cb->wrap) test+=buffered_chunks;
nextChunk = cb->begin+crossFadeChunks;
if(nextChunk<test) {
if(nextChunk>=buffered_chunks)
{
@ -390,10 +390,7 @@ void decode() {
{
doCrossFade = -1;
}
else {
usleep(10);
continue;
}
else continue;
}
}
pc->elapsedTime = cb->times[cb->begin];

View File

@ -63,6 +63,7 @@ int ogg_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc)
int eof = 0;
long ret;
char chunk[CHUNK_SIZE];
int chunkpos = 0;
long bitRate = 0;
long test;
@ -70,13 +71,17 @@ int ogg_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc)
if(dc->seek) {
cb->end = 0;
cb->wrap = 0;
chunkpos = 0;
ov_time_seek_page(&vf,dc->seekWhere);
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,
&current_section);
if(ret<=0) eof = 1;
else {
else chunkpos+=ret;
if(chunkpos>=CHUNK_SIZE || eof) {
while(cb->begin==cb->end && cb->wrap &&
!dc->stop && !dc->seek)
{
@ -89,8 +94,9 @@ int ogg_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc)
af->bits);
#endif
memcpy(cb->chunks+cb->end*CHUNK_SIZE,
chunk,CHUNK_SIZE);
cb->chunkSize[cb->end] = ret;
chunk,chunkpos);
cb->chunkSize[cb->end] = chunkpos;
chunkpos = 0;
cb->times[cb->end] = ov_time_tell(&vf);
if((test = ov_bitrate_instant(&vf))>0) {
bitRate = test/1000;