playlist: moved code to playlist_state.c
Moved everything related to saving or loading the playlist from/to the state file to playlist_state.c.
This commit is contained in:
		| @@ -96,6 +96,7 @@ mpd_headers = \ | ||||
| 	playlist.h \ | ||||
| 	playlist_print.h \ | ||||
| 	playlist_save.h \ | ||||
| 	playlist_state.h \ | ||||
| 	queue.h \ | ||||
| 	queue_print.h \ | ||||
| 	queue_save.h \ | ||||
| @@ -183,6 +184,7 @@ mpd_SOURCES = \ | ||||
| 	playlist.c \ | ||||
| 	playlist_print.c \ | ||||
| 	playlist_save.c \ | ||||
| 	playlist_state.c \ | ||||
| 	queue.c \ | ||||
| 	queue_print.c \ | ||||
| 	queue_save.c \ | ||||
|   | ||||
							
								
								
									
										137
									
								
								src/playlist.c
									
									
									
									
									
								
							
							
						
						
									
										137
									
								
								src/playlist.c
									
									
									
									
									
								
							| @@ -18,8 +18,8 @@ | ||||
|  | ||||
| #include "playlist.h" | ||||
| #include "playlist_save.h" | ||||
| #include "playlist_state.h" | ||||
| #include "queue_print.h" | ||||
| #include "queue_save.h" | ||||
| #include "locate.h" | ||||
| #include "player_control.h" | ||||
| #include "command.h" | ||||
| @@ -29,7 +29,6 @@ | ||||
| #include "conf.h" | ||||
| #include "database.h" | ||||
| #include "mapper.h" | ||||
| #include "path.h" | ||||
| #include "stored_playlist.h" | ||||
| #include "ack.h" | ||||
| #include "idle.h" | ||||
| @@ -50,21 +49,6 @@ | ||||
|  */ | ||||
| #define PLAYLIST_PREV_UNLESS_ELAPSED    10 | ||||
|  | ||||
| #define PLAYLIST_STATE_FILE_STATE		"state: " | ||||
| #define PLAYLIST_STATE_FILE_RANDOM		"random: " | ||||
| #define PLAYLIST_STATE_FILE_REPEAT		"repeat: " | ||||
| #define PLAYLIST_STATE_FILE_CURRENT		"current: " | ||||
| #define PLAYLIST_STATE_FILE_TIME		"time: " | ||||
| #define PLAYLIST_STATE_FILE_CROSSFADE		"crossfade: " | ||||
| #define PLAYLIST_STATE_FILE_PLAYLIST_BEGIN	"playlist_begin" | ||||
| #define PLAYLIST_STATE_FILE_PLAYLIST_END	"playlist_end" | ||||
|  | ||||
| #define PLAYLIST_STATE_FILE_STATE_PLAY		"play" | ||||
| #define PLAYLIST_STATE_FILE_STATE_PAUSE		"pause" | ||||
| #define PLAYLIST_STATE_FILE_STATE_STOP		"stop" | ||||
|  | ||||
| #define PLAYLIST_BUFFER_SIZE	2*MPD_PATH_MAX | ||||
|  | ||||
| /** the global playlist object */ | ||||
| static struct playlist playlist; | ||||
|  | ||||
| @@ -139,127 +123,12 @@ void clearPlaylist(void) | ||||
|  | ||||
| void savePlaylistState(FILE *fp) | ||||
| { | ||||
| 	fprintf(fp, "%s", PLAYLIST_STATE_FILE_STATE); | ||||
|  | ||||
| 	if (playlist.playing) { | ||||
| 		switch (getPlayerState()) { | ||||
| 		case PLAYER_STATE_PAUSE: | ||||
| 			fprintf(fp, "%s\n", PLAYLIST_STATE_FILE_STATE_PAUSE); | ||||
| 			break; | ||||
| 		default: | ||||
| 			fprintf(fp, "%s\n", PLAYLIST_STATE_FILE_STATE_PLAY); | ||||
| 		} | ||||
| 		fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_CURRENT, | ||||
| 			queue_order_to_position(&playlist.queue, | ||||
| 						playlist.current)); | ||||
| 		fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_TIME, | ||||
| 		        getPlayerElapsedTime()); | ||||
| 	} else | ||||
| 		fprintf(fp, "%s\n", PLAYLIST_STATE_FILE_STATE_STOP); | ||||
|  | ||||
| 	fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_RANDOM, | ||||
| 		playlist.queue.random); | ||||
| 	fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_REPEAT, | ||||
| 		playlist.queue.repeat); | ||||
| 	fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_CROSSFADE, | ||||
| 	        (int)(getPlayerCrossFade())); | ||||
| 	fprintf(fp, "%s\n", PLAYLIST_STATE_FILE_PLAYLIST_BEGIN); | ||||
| 	queue_save(fp, &playlist.queue); | ||||
| 	fprintf(fp, "%s\n", PLAYLIST_STATE_FILE_PLAYLIST_END); | ||||
| } | ||||
|  | ||||
| static void loadPlaylistFromStateFile(FILE *fp, char *buffer, | ||||
| 				      int state, int current, int seek_time) | ||||
| { | ||||
| 	int song; | ||||
|  | ||||
| 	if (!fgets(buffer, PLAYLIST_BUFFER_SIZE, fp)) { | ||||
| 		g_warning("No playlist in state file"); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	while (!g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_PLAYLIST_END)) { | ||||
| 		g_strchomp(buffer); | ||||
|  | ||||
| 		song = queue_load_song(&playlist.queue, buffer); | ||||
| 		if (song >= 0 && song == current) { | ||||
| 			if (state != PLAYER_STATE_STOP) { | ||||
| 				playPlaylist(queue_length(&playlist.queue) - 1); | ||||
| 			} | ||||
| 			if (state == PLAYER_STATE_PAUSE) { | ||||
| 				playerPause(); | ||||
| 			} | ||||
| 			if (state != PLAYER_STATE_STOP) { | ||||
| 				seekSongInPlaylist(queue_length(&playlist.queue) - 1, | ||||
| 						   seek_time); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (!fgets(buffer, PLAYLIST_BUFFER_SIZE, fp)) { | ||||
| 			g_warning("'%s' not found in state file", | ||||
| 				  PLAYLIST_STATE_FILE_PLAYLIST_END); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 	playlist_state_save(fp, &playlist); | ||||
| } | ||||
|  | ||||
| void readPlaylistState(FILE *fp) | ||||
| { | ||||
| 	int current = -1; | ||||
| 	int seek_time = 0; | ||||
| 	int state = PLAYER_STATE_STOP; | ||||
| 	char buffer[PLAYLIST_BUFFER_SIZE]; | ||||
| 	bool random_mode = false; | ||||
|  | ||||
| 	while (fgets(buffer, sizeof(buffer), fp)) { | ||||
| 		g_strchomp(buffer); | ||||
|  | ||||
| 		if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_STATE)) { | ||||
| 			if (strcmp(&(buffer[strlen(PLAYLIST_STATE_FILE_STATE)]), | ||||
| 				   PLAYLIST_STATE_FILE_STATE_PLAY) == 0) { | ||||
| 				state = PLAYER_STATE_PLAY; | ||||
| 			} else | ||||
| 			    if (strcmp | ||||
| 				(&(buffer[strlen(PLAYLIST_STATE_FILE_STATE)]), | ||||
| 				 PLAYLIST_STATE_FILE_STATE_PAUSE) | ||||
| 				== 0) { | ||||
| 				state = PLAYER_STATE_PAUSE; | ||||
| 			} | ||||
| 		} else if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_TIME)) { | ||||
| 			seek_time = | ||||
| 			    atoi(&(buffer[strlen(PLAYLIST_STATE_FILE_TIME)])); | ||||
| 		} else | ||||
| 		    if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_REPEAT)) { | ||||
| 			if (strcmp | ||||
| 			    (&(buffer[strlen(PLAYLIST_STATE_FILE_REPEAT)]), | ||||
| 			     "1") == 0) { | ||||
| 				setPlaylistRepeatStatus(true); | ||||
| 			} else | ||||
| 				setPlaylistRepeatStatus(false); | ||||
| 		} else if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_CROSSFADE)) { | ||||
| 			setPlayerCrossFade(atoi | ||||
| 					   (& | ||||
| 					    (buffer | ||||
| 					     [strlen | ||||
| 					      (PLAYLIST_STATE_FILE_CROSSFADE)]))); | ||||
| 		} else if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_RANDOM)) { | ||||
| 			random_mode = | ||||
| 				strcmp(buffer + strlen(PLAYLIST_STATE_FILE_RANDOM), | ||||
| 				       "1") == 0; | ||||
| 		} else if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_CURRENT)) { | ||||
| 			current = atoi(&(buffer | ||||
| 					 [strlen | ||||
| 					  (PLAYLIST_STATE_FILE_CURRENT)])); | ||||
| 		} else if (g_str_has_prefix(buffer, | ||||
| 					    PLAYLIST_STATE_FILE_PLAYLIST_BEGIN)) { | ||||
| 			if (state == PLAYER_STATE_STOP) | ||||
| 				current = -1; | ||||
| 			loadPlaylistFromStateFile(fp, buffer, state, | ||||
| 						  current, seek_time); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	setPlaylistRandomStatus(random_mode); | ||||
| 	playlist_state_restore(fp, &playlist); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
							
								
								
									
										175
									
								
								src/playlist_state.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								src/playlist_state.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,175 @@ | ||||
| /* | ||||
|  * Copyright (C) 2003-2009 The Music Player Daemon Project | ||||
|  * 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 | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Saving and loading the playlist to/from the state file. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include "playlist_state.h" | ||||
| #include "playlist.h" | ||||
| #include "player_control.h" | ||||
| #include "queue_save.h" | ||||
| #include "path.h" | ||||
|  | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #define PLAYLIST_STATE_FILE_STATE		"state: " | ||||
| #define PLAYLIST_STATE_FILE_RANDOM		"random: " | ||||
| #define PLAYLIST_STATE_FILE_REPEAT		"repeat: " | ||||
| #define PLAYLIST_STATE_FILE_CURRENT		"current: " | ||||
| #define PLAYLIST_STATE_FILE_TIME		"time: " | ||||
| #define PLAYLIST_STATE_FILE_CROSSFADE		"crossfade: " | ||||
| #define PLAYLIST_STATE_FILE_PLAYLIST_BEGIN	"playlist_begin" | ||||
| #define PLAYLIST_STATE_FILE_PLAYLIST_END	"playlist_end" | ||||
|  | ||||
| #define PLAYLIST_STATE_FILE_STATE_PLAY		"play" | ||||
| #define PLAYLIST_STATE_FILE_STATE_PAUSE		"pause" | ||||
| #define PLAYLIST_STATE_FILE_STATE_STOP		"stop" | ||||
|  | ||||
| #define PLAYLIST_BUFFER_SIZE	2*MPD_PATH_MAX | ||||
|  | ||||
| void | ||||
| playlist_state_save(FILE *fp, const struct playlist *playlist) | ||||
| { | ||||
| 	fprintf(fp, "%s", PLAYLIST_STATE_FILE_STATE); | ||||
|  | ||||
| 	if (playlist->playing) { | ||||
| 		switch (getPlayerState()) { | ||||
| 		case PLAYER_STATE_PAUSE: | ||||
| 			fprintf(fp, "%s\n", PLAYLIST_STATE_FILE_STATE_PAUSE); | ||||
| 			break; | ||||
| 		default: | ||||
| 			fprintf(fp, "%s\n", PLAYLIST_STATE_FILE_STATE_PLAY); | ||||
| 		} | ||||
| 		fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_CURRENT, | ||||
| 			queue_order_to_position(&playlist->queue, | ||||
| 						playlist->current)); | ||||
| 		fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_TIME, | ||||
| 			getPlayerElapsedTime()); | ||||
| 	} else | ||||
| 		fprintf(fp, "%s\n", PLAYLIST_STATE_FILE_STATE_STOP); | ||||
|  | ||||
| 	fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_RANDOM, | ||||
| 		playlist->queue.random); | ||||
| 	fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_REPEAT, | ||||
| 		playlist->queue.repeat); | ||||
| 	fprintf(fp, "%s%i\n", PLAYLIST_STATE_FILE_CROSSFADE, | ||||
| 		(int)(getPlayerCrossFade())); | ||||
| 	fprintf(fp, "%s\n", PLAYLIST_STATE_FILE_PLAYLIST_BEGIN); | ||||
| 	queue_save(fp, &playlist->queue); | ||||
| 	fprintf(fp, "%s\n", PLAYLIST_STATE_FILE_PLAYLIST_END); | ||||
| } | ||||
|  | ||||
| static void | ||||
| playlist_state_load(FILE *fp, struct playlist *playlist, | ||||
| 		    char *buffer, | ||||
| 		    int state, int current, int seek_time) | ||||
| { | ||||
| 	int song; | ||||
|  | ||||
| 	if (!fgets(buffer, PLAYLIST_BUFFER_SIZE, fp)) { | ||||
| 		g_warning("No playlist in state file"); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	while (!g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_PLAYLIST_END)) { | ||||
| 		g_strchomp(buffer); | ||||
|  | ||||
| 		song = queue_load_song(&playlist->queue, buffer); | ||||
| 		if (song >= 0 && song == current) { | ||||
| 			if (state != PLAYER_STATE_STOP) { | ||||
| 				playPlaylist(queue_length(&playlist->queue) - 1); | ||||
| 			} | ||||
| 			if (state == PLAYER_STATE_PAUSE) { | ||||
| 				playerPause(); | ||||
| 			} | ||||
| 			if (state != PLAYER_STATE_STOP) { | ||||
| 				seekSongInPlaylist(queue_length(&playlist->queue) - 1, | ||||
| 						   seek_time); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (!fgets(buffer, PLAYLIST_BUFFER_SIZE, fp)) { | ||||
| 			g_warning("'%s' not found in state file", | ||||
| 				  PLAYLIST_STATE_FILE_PLAYLIST_END); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void | ||||
| playlist_state_restore(FILE *fp, struct playlist *playlist) | ||||
| { | ||||
| 	int current = -1; | ||||
| 	int seek_time = 0; | ||||
| 	int state = PLAYER_STATE_STOP; | ||||
| 	char buffer[PLAYLIST_BUFFER_SIZE]; | ||||
| 	bool random_mode = false; | ||||
|  | ||||
| 	while (fgets(buffer, sizeof(buffer), fp)) { | ||||
| 		g_strchomp(buffer); | ||||
|  | ||||
| 		if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_STATE)) { | ||||
| 			if (strcmp(&(buffer[strlen(PLAYLIST_STATE_FILE_STATE)]), | ||||
| 				   PLAYLIST_STATE_FILE_STATE_PLAY) == 0) { | ||||
| 				state = PLAYER_STATE_PLAY; | ||||
| 			} else | ||||
| 			    if (strcmp | ||||
| 				(&(buffer[strlen(PLAYLIST_STATE_FILE_STATE)]), | ||||
| 				 PLAYLIST_STATE_FILE_STATE_PAUSE) | ||||
| 				== 0) { | ||||
| 				state = PLAYER_STATE_PAUSE; | ||||
| 			} | ||||
| 		} else if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_TIME)) { | ||||
| 			seek_time = | ||||
| 			    atoi(&(buffer[strlen(PLAYLIST_STATE_FILE_TIME)])); | ||||
| 		} else | ||||
| 		    if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_REPEAT)) { | ||||
| 			if (strcmp | ||||
| 			    (&(buffer[strlen(PLAYLIST_STATE_FILE_REPEAT)]), | ||||
| 			     "1") == 0) { | ||||
| 				setPlaylistRepeatStatus(true); | ||||
| 			} else | ||||
| 				setPlaylistRepeatStatus(false); | ||||
| 		} else if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_CROSSFADE)) { | ||||
| 			setPlayerCrossFade(atoi | ||||
| 					   (& | ||||
| 					    (buffer | ||||
| 					     [strlen | ||||
| 					      (PLAYLIST_STATE_FILE_CROSSFADE)]))); | ||||
| 		} else if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_RANDOM)) { | ||||
| 			random_mode = | ||||
| 				strcmp(buffer + strlen(PLAYLIST_STATE_FILE_RANDOM), | ||||
| 				       "1") == 0; | ||||
| 		} else if (g_str_has_prefix(buffer, PLAYLIST_STATE_FILE_CURRENT)) { | ||||
| 			current = atoi(&(buffer | ||||
| 					 [strlen | ||||
| 					  (PLAYLIST_STATE_FILE_CURRENT)])); | ||||
| 		} else if (g_str_has_prefix(buffer, | ||||
| 					    PLAYLIST_STATE_FILE_PLAYLIST_BEGIN)) { | ||||
| 			if (state == PLAYER_STATE_STOP) | ||||
| 				current = -1; | ||||
| 			playlist_state_load(fp, playlist, buffer, state, | ||||
| 					    current, seek_time); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	setPlaylistRandomStatus(random_mode); | ||||
| } | ||||
							
								
								
									
										37
									
								
								src/playlist_state.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/playlist_state.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| /* | ||||
|  * Copyright (C) 2003-2009 The Music Player Daemon Project | ||||
|  * 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 | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Saving and loading the playlist to/from the state file. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef PLAYLIST_STATE_H | ||||
| #define PLAYLIST_STATE_H | ||||
|  | ||||
| #include <stdio.h> | ||||
|  | ||||
| struct playlist; | ||||
|  | ||||
| void | ||||
| playlist_state_save(FILE *fp, const struct playlist *playlist); | ||||
|  | ||||
| void | ||||
| playlist_state_restore(FILE *fp, struct playlist *playlist); | ||||
|  | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann