output_all: moved code to audio_output_all_wait()
Synchronization with the output thread will be implemented in output_all.c, not in player_thread.c. Currently, that's just a simple g_usleep(1ms).
This commit is contained in:
		| @@ -408,6 +408,18 @@ audio_output_all_check(void) | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| bool | ||||
| audio_output_all_wait(unsigned threshold) | ||||
| { | ||||
| 	if (audio_output_all_check() < threshold) | ||||
| 		return true; | ||||
|  | ||||
| 	/* XXX synchronize in a better way */ | ||||
| 	g_usleep(1000); | ||||
|  | ||||
| 	return audio_output_all_check() < threshold; | ||||
| } | ||||
|  | ||||
| void | ||||
| audio_output_all_pause(void) | ||||
| { | ||||
|   | ||||
| @@ -104,6 +104,17 @@ audio_output_all_play(struct music_chunk *chunk); | ||||
| unsigned | ||||
| audio_output_all_check(void); | ||||
|  | ||||
| /** | ||||
|  * Checks if the size of the #music_pipe is below the #threshold.  If | ||||
|  * not, it attempts to synchronize with all output threads, and waits | ||||
|  * until another #music_chunk is finished. | ||||
|  * | ||||
|  * @param threshold the maximum number of chunks in the pipe | ||||
|  * @return true if there are less than #threshold chunks in the pipe | ||||
|  */ | ||||
| bool | ||||
| audio_output_all_wait(unsigned threshold); | ||||
|  | ||||
| /** | ||||
|  * Puts all audio outputs into pause mode.  Most implementations will | ||||
|  * simply close it then. | ||||
|   | ||||
| @@ -192,14 +192,10 @@ player_check_decoder_startup(struct player *player) | ||||
| 		/* the decoder is ready and ok */ | ||||
|  | ||||
| 		if (audio_format_defined(&player->play_audio_format) && | ||||
| 		    audio_output_all_check() > 0) { | ||||
| 		    !audio_output_all_wait(1)) | ||||
| 			/* the output devices havn't finished playing | ||||
| 			   all chunks yet - wait for that */ | ||||
|  | ||||
| 			/* XXX synchronize in a better way */ | ||||
| 			g_usleep(1000); | ||||
| 			return true; | ||||
| 		} | ||||
|  | ||||
| 		player->decoder_starting = false; | ||||
|  | ||||
| @@ -479,14 +475,10 @@ play_next_chunk(struct player *player) | ||||
| 	unsigned cross_fade_position; | ||||
| 	bool success; | ||||
|  | ||||
| 	if (audio_output_all_check() >= 64) { | ||||
| 	if (!audio_output_all_wait(64)) | ||||
| 		/* the output pipe is still large enough, don't send | ||||
| 		   another chunk */ | ||||
|  | ||||
| 		/* XXX synchronize in a better way */ | ||||
| 		g_usleep(1000); | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	if (player->xfade == XFADE_ENABLED && | ||||
| 	    dc.pipe != NULL && dc.pipe != player->pipe && | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann