player_thread: make variables more local
This commit is contained in:
@@ -356,16 +356,9 @@ player_check_decoder_startup(struct player *player)
|
|||||||
static bool
|
static bool
|
||||||
player_send_silence(struct player *player)
|
player_send_silence(struct player *player)
|
||||||
{
|
{
|
||||||
struct music_chunk *chunk;
|
|
||||||
size_t frame_size =
|
|
||||||
audio_format_frame_size(&player->play_audio_format);
|
|
||||||
/* this formula ensures that we don't send
|
|
||||||
partial frames */
|
|
||||||
unsigned num_frames = sizeof(chunk->data) / frame_size;
|
|
||||||
|
|
||||||
assert(audio_format_defined(&player->play_audio_format));
|
assert(audio_format_defined(&player->play_audio_format));
|
||||||
|
|
||||||
chunk = music_buffer_allocate(player_buffer);
|
struct music_chunk *chunk = music_buffer_allocate(player_buffer);
|
||||||
if (chunk == NULL) {
|
if (chunk == NULL) {
|
||||||
g_warning("Failed to allocate silence buffer");
|
g_warning("Failed to allocate silence buffer");
|
||||||
return false;
|
return false;
|
||||||
@@ -375,6 +368,12 @@ player_send_silence(struct player *player)
|
|||||||
chunk->audio_format = player->play_audio_format;
|
chunk->audio_format = player->play_audio_format;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
size_t frame_size =
|
||||||
|
audio_format_frame_size(&player->play_audio_format);
|
||||||
|
/* this formula ensures that we don't send
|
||||||
|
partial frames */
|
||||||
|
unsigned num_frames = sizeof(chunk->data) / frame_size;
|
||||||
|
|
||||||
chunk->times = -1.0; /* undefined time stamp */
|
chunk->times = -1.0; /* undefined time stamp */
|
||||||
chunk->length = num_frames * frame_size;
|
chunk->length = num_frames * frame_size;
|
||||||
memset(chunk->data, 0, chunk->length);
|
memset(chunk->data, 0, chunk->length);
|
||||||
@@ -396,8 +395,6 @@ static bool player_seek_decoder(struct player *player)
|
|||||||
{
|
{
|
||||||
struct song *song = pc.next_song;
|
struct song *song = pc.next_song;
|
||||||
struct decoder_control *dc = player->dc;
|
struct decoder_control *dc = player->dc;
|
||||||
double where;
|
|
||||||
bool ret;
|
|
||||||
|
|
||||||
assert(pc.next_song != NULL);
|
assert(pc.next_song != NULL);
|
||||||
|
|
||||||
@@ -413,8 +410,7 @@ static bool player_seek_decoder(struct player *player)
|
|||||||
|
|
||||||
/* re-start the decoder */
|
/* re-start the decoder */
|
||||||
player_dc_start(player, player->pipe);
|
player_dc_start(player, player->pipe);
|
||||||
ret = player_wait_for_decoder(player);
|
if (!player_wait_for_decoder(player)) {
|
||||||
if (!ret) {
|
|
||||||
/* decoder failure */
|
/* decoder failure */
|
||||||
player_command_finished();
|
player_command_finished();
|
||||||
return false;
|
return false;
|
||||||
@@ -435,8 +431,7 @@ static bool player_seek_decoder(struct player *player)
|
|||||||
/* wait for the decoder to complete initialization */
|
/* wait for the decoder to complete initialization */
|
||||||
|
|
||||||
while (player->decoder_starting) {
|
while (player->decoder_starting) {
|
||||||
ret = player_check_decoder_startup(player);
|
if (!player_check_decoder_startup(player)) {
|
||||||
if (!ret) {
|
|
||||||
/* decoder failure */
|
/* decoder failure */
|
||||||
player_command_finished();
|
player_command_finished();
|
||||||
return false;
|
return false;
|
||||||
@@ -445,14 +440,13 @@ static bool player_seek_decoder(struct player *player)
|
|||||||
|
|
||||||
/* send the SEEK command */
|
/* send the SEEK command */
|
||||||
|
|
||||||
where = pc.seek_where;
|
double where = pc.seek_where;
|
||||||
if (where > pc.total_time)
|
if (where > pc.total_time)
|
||||||
where = pc.total_time - 0.1;
|
where = pc.total_time - 0.1;
|
||||||
if (where < 0.0)
|
if (where < 0.0)
|
||||||
where = 0.0;
|
where = 0.0;
|
||||||
|
|
||||||
ret = dc_seek(dc, where + song->start_ms / 1000.0);
|
if (!dc_seek(dc, where + song->start_ms / 1000.0)) {
|
||||||
if (!ret) {
|
|
||||||
/* decoder failure */
|
/* decoder failure */
|
||||||
player_command_finished();
|
player_command_finished();
|
||||||
return false;
|
return false;
|
||||||
@@ -583,14 +577,12 @@ static void player_process_command(struct player *player)
|
|||||||
static void
|
static void
|
||||||
update_song_tag(struct song *song, const struct tag *new_tag)
|
update_song_tag(struct song *song, const struct tag *new_tag)
|
||||||
{
|
{
|
||||||
struct tag *old_tag;
|
|
||||||
|
|
||||||
if (song_is_file(song))
|
if (song_is_file(song))
|
||||||
/* don't update tags of local files, only remote
|
/* don't update tags of local files, only remote
|
||||||
streams may change tags dynamically */
|
streams may change tags dynamically */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
old_tag = song->tag;
|
struct tag *old_tag = song->tag;
|
||||||
song->tag = tag_dup(new_tag);
|
song->tag = tag_dup(new_tag);
|
||||||
|
|
||||||
if (old_tag != NULL)
|
if (old_tag != NULL)
|
||||||
@@ -648,15 +640,14 @@ static bool
|
|||||||
play_next_chunk(struct player *player)
|
play_next_chunk(struct player *player)
|
||||||
{
|
{
|
||||||
struct decoder_control *dc = player->dc;
|
struct decoder_control *dc = player->dc;
|
||||||
struct music_chunk *chunk = NULL;
|
|
||||||
unsigned cross_fade_position;
|
|
||||||
bool success;
|
|
||||||
|
|
||||||
if (!audio_output_all_wait(64))
|
if (!audio_output_all_wait(64))
|
||||||
/* the output pipe is still large enough, don't send
|
/* the output pipe is still large enough, don't send
|
||||||
another chunk */
|
another chunk */
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
unsigned cross_fade_position;
|
||||||
|
struct music_chunk *chunk = NULL;
|
||||||
if (player->xfade == XFADE_ENABLED &&
|
if (player->xfade == XFADE_ENABLED &&
|
||||||
player_dc_at_next_song(player) &&
|
player_dc_at_next_song(player) &&
|
||||||
(cross_fade_position = music_pipe_size(player->pipe))
|
(cross_fade_position = music_pipe_size(player->pipe))
|
||||||
@@ -732,9 +723,7 @@ play_next_chunk(struct player *player)
|
|||||||
|
|
||||||
/* play the current chunk */
|
/* play the current chunk */
|
||||||
|
|
||||||
success = play_chunk(player->song, chunk, &player->play_audio_format);
|
if (!play_chunk(player->song, chunk, &player->play_audio_format)) {
|
||||||
|
|
||||||
if (!success) {
|
|
||||||
music_buffer_return(player_buffer, chunk);
|
music_buffer_return(player_buffer, chunk);
|
||||||
|
|
||||||
player_lock();
|
player_lock();
|
||||||
@@ -776,11 +765,9 @@ play_next_chunk(struct player *player)
|
|||||||
static bool
|
static bool
|
||||||
player_song_border(struct player *player)
|
player_song_border(struct player *player)
|
||||||
{
|
{
|
||||||
char *uri;
|
|
||||||
|
|
||||||
player->xfade = XFADE_UNKNOWN;
|
player->xfade = XFADE_UNKNOWN;
|
||||||
|
|
||||||
uri = song_get_uri(player->song);
|
char *uri = song_get_uri(player->song);
|
||||||
g_message("played \"%s\"", uri);
|
g_message("played \"%s\"", uri);
|
||||||
g_free(uri);
|
g_free(uri);
|
||||||
|
|
||||||
@@ -875,15 +862,12 @@ static void do_play(struct decoder_control *dc)
|
|||||||
|
|
||||||
if (player.decoder_starting) {
|
if (player.decoder_starting) {
|
||||||
/* wait until the decoder is initialized completely */
|
/* wait until the decoder is initialized completely */
|
||||||
bool success;
|
|
||||||
const struct song *song;
|
|
||||||
|
|
||||||
success = player_check_decoder_startup(&player);
|
if (!player_check_decoder_startup(&player))
|
||||||
if (!success)
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* seek to the beginning of the range */
|
/* seek to the beginning of the range */
|
||||||
song = decoder_current_song(dc);
|
const struct song *song = decoder_current_song(dc);
|
||||||
if (song != NULL && song->start_ms > 0 &&
|
if (song != NULL && song->start_ms > 0 &&
|
||||||
!dc_seek(dc, song->start_ms / 1000.0))
|
!dc_seek(dc, song->start_ms / 1000.0))
|
||||||
player_dc_stop(&player);
|
player_dc_stop(&player);
|
||||||
@@ -1092,10 +1076,9 @@ static gpointer player_task(G_GNUC_UNUSED gpointer arg)
|
|||||||
|
|
||||||
void player_create(void)
|
void player_create(void)
|
||||||
{
|
{
|
||||||
GError *e = NULL;
|
|
||||||
|
|
||||||
assert(pc.thread == NULL);
|
assert(pc.thread == NULL);
|
||||||
|
|
||||||
|
GError *e = NULL;
|
||||||
pc.thread = g_thread_create(player_task, NULL, true, &e);
|
pc.thread = g_thread_create(player_task, NULL, true, &e);
|
||||||
if (pc.thread == NULL)
|
if (pc.thread == NULL)
|
||||||
MPD_ERROR("Failed to spawn player task: %s", e->message);
|
MPD_ERROR("Failed to spawn player task: %s", e->message);
|
||||||
|
Reference in New Issue
Block a user