player_thread: handle SEEK while not playing
This commit is contained in:
		
							
								
								
									
										3
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								NEWS
									
									
									
									
									
								
							| @@ -10,6 +10,9 @@ ver 0.16.5 (2010/??/??) | |||||||
|   - ffmpeg: higher precision timestamps |   - ffmpeg: higher precision timestamps | ||||||
|   - ffmpeg: don't require key frame for seeking |   - ffmpeg: don't require key frame for seeking | ||||||
|   - fix CUE track seeking |   - fix CUE track seeking | ||||||
|  | * player: | ||||||
|  |   - make seeking to CUE track more reliable | ||||||
|  |   - the "seek" command works when MPD is stopped | ||||||
| * WIN32: close sockets properly | * WIN32: close sockets properly | ||||||
| * install systemd service file if systemd is available | * install systemd service file if systemd is available | ||||||
|  |  | ||||||
|   | |||||||
| @@ -145,8 +145,12 @@ player_dc_start(struct player *player, struct music_pipe *pipe) | |||||||
| 	assert(player->queued || pc.command == PLAYER_COMMAND_SEEK); | 	assert(player->queued || pc.command == PLAYER_COMMAND_SEEK); | ||||||
| 	assert(pc.next_song != NULL); | 	assert(pc.next_song != NULL); | ||||||
|  |  | ||||||
|  | 	unsigned start_ms = pc.next_song->start_ms; | ||||||
|  | 	if (pc.command == PLAYER_COMMAND_SEEK) | ||||||
|  | 		start_ms += (unsigned)(pc.seek_where * 1000); | ||||||
|  |  | ||||||
| 	dc_start(dc, pc.next_song, | 	dc_start(dc, pc.next_song, | ||||||
| 		 pc.next_song->start_ms, pc.next_song->end_ms, | 		 start_ms, pc.next_song->end_ms, | ||||||
| 		 player_buffer, pipe); | 		 player_buffer, pipe); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -835,6 +839,10 @@ static void do_play(struct decoder_control *dc) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	player_lock(); | 	player_lock(); | ||||||
|  |  | ||||||
|  | 	if (pc.command == PLAYER_COMMAND_SEEK) | ||||||
|  | 		player.elapsed_time = pc.seek_where; | ||||||
|  |  | ||||||
| 	pc.state = PLAYER_STATE_PLAY; | 	pc.state = PLAYER_STATE_PLAY; | ||||||
| 	player_command_finished_locked(); | 	player_command_finished_locked(); | ||||||
|  |  | ||||||
| @@ -1013,6 +1021,7 @@ static gpointer player_task(G_GNUC_UNUSED gpointer arg) | |||||||
|  |  | ||||||
| 	while (1) { | 	while (1) { | ||||||
| 		switch (pc.command) { | 		switch (pc.command) { | ||||||
|  | 		case PLAYER_COMMAND_SEEK: | ||||||
| 		case PLAYER_COMMAND_QUEUE: | 		case PLAYER_COMMAND_QUEUE: | ||||||
| 			assert(pc.next_song != NULL); | 			assert(pc.next_song != NULL); | ||||||
|  |  | ||||||
| @@ -1026,7 +1035,6 @@ static gpointer player_task(G_GNUC_UNUSED gpointer arg) | |||||||
|  |  | ||||||
| 			/* fall through */ | 			/* fall through */ | ||||||
|  |  | ||||||
| 		case PLAYER_COMMAND_SEEK: |  | ||||||
| 		case PLAYER_COMMAND_PAUSE: | 		case PLAYER_COMMAND_PAUSE: | ||||||
| 			pc.next_song = NULL; | 			pc.next_song = NULL; | ||||||
| 			player_command_finished_locked(); | 			player_command_finished_locked(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann