From 09efb14dbbbbcbf1d96bbb0932009ab25e76868a Mon Sep 17 00:00:00 2001
From: Warren Dukes <warren.dukes@gmail.com>
Date: Fri, 5 Mar 2004 16:02:47 +0000
Subject: [PATCH] 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
---
 src/decode.c     |  9 +++------
 src/ogg_decode.c | 14 ++++++++++----
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/src/decode.c b/src/decode.c
index b1c0bb012..ce2629f5f 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -345,7 +345,7 @@ void decode() {
 			else if((cb->begin!=cb->end || cb->wrap) && 
 				cb->begin!=cb->next)
 			{
-				if(doCrossFade==1 && cb->next>=0 && 
+				if(doCrossFade==1 && cb->next>=0 &&
 					((cb->next>cb->begin && 
 					(fadePosition=cb->next-cb->begin)
 					<=crossFadeChunks) || 
@@ -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];
diff --git a/src/ogg_decode.c b/src/ogg_decode.c
index 158428beb..c9cf0016c 100644
--- a/src/ogg_decode.c
+++ b/src/ogg_decode.c
@@ -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;