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