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:
		| @@ -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]; | ||||
|   | ||||
| @@ -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, | ||||
| 					¤t_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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Warren Dukes
					Warren Dukes