moved code to crossfade.c
decode.c should be a lot smaller; start by moving all code which handles cross-fading to crossfade.c. Also includes camelCase conversion.
This commit is contained in:
		| @@ -38,6 +38,7 @@ mpd_headers = \ | ||||
| 	command.h \ | ||||
| 	condition.h \ | ||||
| 	conf.h \ | ||||
| 	crossfade.h \ | ||||
| 	dbUtils.h \ | ||||
| 	decode.h \ | ||||
| 	decoder_api.h \ | ||||
| @@ -102,6 +103,7 @@ mpd_SOURCES = \ | ||||
| 	command.c \ | ||||
| 	condition.c \ | ||||
| 	conf.c \ | ||||
| 	crossfade.c \ | ||||
| 	dbUtils.c \ | ||||
| 	decode.c \ | ||||
| 	decoder_api.c \ | ||||
|   | ||||
							
								
								
									
										62
									
								
								src/crossfade.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/crossfade.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| /* the Music Player Daemon (MPD) | ||||
|  * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com) | ||||
|  * Copyright (C) 2008 Max Kellermann <max@duempel.org> | ||||
|  * This project's homepage is: http://www.musicpd.org | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
|  */ | ||||
|  | ||||
| #include "crossfade.h" | ||||
| #include "audio.h" | ||||
| #include "pcm_utils.h" | ||||
|  | ||||
| unsigned cross_fade_calc(float duration, float total_time, | ||||
| 			 const AudioFormat * af, | ||||
| 			 unsigned max_chunks) | ||||
| { | ||||
| 	unsigned int chunks; | ||||
|  | ||||
| 	if (duration <= 0 || duration >= total_time || | ||||
| 	    !isCurrentAudioFormat(af)) | ||||
| 		return 0; | ||||
|  | ||||
| 	assert(duration > 0); | ||||
| 	assert(af->bits > 0); | ||||
| 	assert(af->channels > 0); | ||||
| 	assert(af->sampleRate > 0); | ||||
|  | ||||
| 	chunks = audio_format_time_to_size(af) / CHUNK_SIZE; | ||||
| 	chunks = (chunks * duration + 0.5); | ||||
|  | ||||
| 	if (chunks > max_chunks) | ||||
| 		chunks = max_chunks; | ||||
|  | ||||
| 	return chunks; | ||||
| } | ||||
|  | ||||
| void cross_fade_apply(ob_chunk * a, const ob_chunk * b, | ||||
| 		      const AudioFormat * format, | ||||
| 		      unsigned int current_chunk, unsigned int num_chunks) | ||||
| { | ||||
| 	assert(current_chunk <= num_chunks); | ||||
|  | ||||
| 	pcm_mix(a->data, | ||||
| 		b->data, | ||||
| 		a->chunkSize, | ||||
| 		b->chunkSize, | ||||
| 		format, | ||||
| 		((float)current_chunk) / num_chunks); | ||||
| 	if (b->chunkSize > a->chunkSize) | ||||
| 		a->chunkSize = b->chunkSize; | ||||
| } | ||||
							
								
								
									
										34
									
								
								src/crossfade.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/crossfade.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| /* the Music Player Daemon (MPD) | ||||
|  * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com) | ||||
|  * Copyright (C) 2008 Max Kellermann <max@duempel.org> | ||||
|  * This project's homepage is: http://www.musicpd.org | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program; if not, write to the Free Software | ||||
|  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
|  */ | ||||
|  | ||||
| #ifndef CROSSFADE_H | ||||
| #define CROSSFADE_H | ||||
|  | ||||
| #include "audio_format.h" | ||||
| #include "outputBuffer.h" | ||||
|  | ||||
| unsigned cross_fade_calc(float duration, float total_time, | ||||
| 			 const AudioFormat * af, | ||||
| 			 unsigned max_chunks); | ||||
|  | ||||
| void cross_fade_apply(ob_chunk * a, const ob_chunk * b, | ||||
| 		      const AudioFormat * format, | ||||
| 		      unsigned int current_chunk, unsigned int num_chunks); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										59
									
								
								src/decode.c
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								src/decode.c
									
									
									
									
									
								
							| @@ -27,6 +27,7 @@ | ||||
| #include "ls.h" | ||||
| #include "main_notify.h" | ||||
| #include "audio.h" | ||||
| #include "crossfade.h" | ||||
|  | ||||
| enum xfade_state { | ||||
| 	XFADE_DISABLED = -1, | ||||
| @@ -64,29 +65,6 @@ static void quitDecode(void) | ||||
| 	wakeup_main_task(); | ||||
| } | ||||
|  | ||||
| static unsigned calculateCrossFadeChunks(AudioFormat * af, | ||||
| 					 float totalTime, unsigned max_chunks) | ||||
| { | ||||
| 	unsigned int chunks; | ||||
|  | ||||
| 	if (pc.crossFade == 0 || pc.crossFade >= totalTime || | ||||
| 	    !isCurrentAudioFormat(af)) | ||||
| 		return 0; | ||||
|  | ||||
| 	assert(pc.crossFade > 0); | ||||
| 	assert(af->bits > 0); | ||||
| 	assert(af->channels > 0); | ||||
| 	assert(af->sampleRate > 0); | ||||
|  | ||||
| 	chunks = audio_format_time_to_size(af) / CHUNK_SIZE; | ||||
| 	chunks = (chunks * pc.crossFade + 0.5); | ||||
|  | ||||
| 	if (chunks > max_chunks) | ||||
| 		chunks = max_chunks; | ||||
|  | ||||
| 	return chunks; | ||||
| } | ||||
|  | ||||
| static int waitOnDecode(int *decodeWaitedOn) | ||||
| { | ||||
| 	while (dc.command == DECODE_COMMAND_START) { | ||||
| @@ -360,23 +338,6 @@ void decoderInit(void) | ||||
| 		FATAL("Failed to spawn decoder task: %s\n", strerror(errno)); | ||||
| } | ||||
|  | ||||
| static void crossFade(ob_chunk * a, ob_chunk * b, | ||||
| 		      AudioFormat * format, | ||||
| 		      unsigned int fadePosition, unsigned int crossFadeChunks) | ||||
| { | ||||
| 	assert(fadePosition <= crossFadeChunks); | ||||
|  | ||||
| 	pcm_mix(a->data, | ||||
| 		b->data, | ||||
| 		a->chunkSize, | ||||
| 		b->chunkSize, | ||||
| 		format, | ||||
| 		((float)fadePosition) / | ||||
| 		crossFadeChunks); | ||||
| 	if (b->chunkSize > a->chunkSize) | ||||
| 		a->chunkSize = b->chunkSize; | ||||
| } | ||||
|  | ||||
| static int playChunk(ob_chunk * chunk, | ||||
| 		     const AudioFormat * format, double sizeToTime) | ||||
| { | ||||
| @@ -498,10 +459,10 @@ static void decodeParent(void) | ||||
| 			   calculate how many chunks will be required | ||||
| 			   for it */ | ||||
| 			crossFadeChunks = | ||||
| 				calculateCrossFadeChunks(&(ob.audioFormat), | ||||
| 							 dc.totalTime, | ||||
| 							 ob.size - | ||||
| 							 buffered_before_play); | ||||
| 				cross_fade_calc(pc.crossFade, dc.totalTime, | ||||
| 						&(ob.audioFormat), | ||||
| 						ob.size - | ||||
| 						buffered_before_play); | ||||
| 			if (crossFadeChunks > 0) { | ||||
| 				do_xfade = XFADE_ENABLED; | ||||
| 				nextChunk = -1; | ||||
| @@ -531,11 +492,11 @@ static void decodeParent(void) | ||||
| 				nextChunk = ob_absolute(crossFadeChunks); | ||||
| 				if (nextChunk >= 0) { | ||||
| 					ob_set_lazy(1); | ||||
| 					crossFade(beginChunk, | ||||
| 						  ob_get_chunk(nextChunk), | ||||
| 						  &(ob.audioFormat), | ||||
| 						  fadePosition, | ||||
| 						  crossFadeChunks); | ||||
| 					cross_fade_apply(beginChunk, | ||||
| 							 ob_get_chunk(nextChunk), | ||||
| 							 &(ob.audioFormat), | ||||
| 							 fadePosition, | ||||
| 							 crossFadeChunks); | ||||
| 				} else { | ||||
| 					/* there are not enough | ||||
| 					   decoded chunks yet */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann