aboutsummaryrefslogtreecommitdiffstats
path: root/src/PlayerThread.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/PlayerThread.cxx')
-rw-r--r--src/PlayerThread.cxx428
1 files changed, 214 insertions, 214 deletions
diff --git a/src/PlayerThread.cxx b/src/PlayerThread.cxx
index 0086c797a..20563a091 100644
--- a/src/PlayerThread.cxx
+++ b/src/PlayerThread.cxx
@@ -50,9 +50,9 @@ enum xfade_state {
};
struct player {
- struct player_control *pc;
+ player_control &pc;
- struct decoder_control *dc;
+ decoder_control &dc;
MusicBuffer &buffer;
@@ -128,7 +128,7 @@ struct player {
*/
float elapsed_time;
- player(player_control *_pc, decoder_control *_dc,
+ player(player_control &_pc, decoder_control &_dc,
MusicBuffer &_buffer)
:pc(_pc), dc(_dc), buffer(_buffer),
buffering(false),
@@ -145,20 +145,20 @@ struct player {
};
static void
-player_command_finished_locked(struct player_control *pc)
+player_command_finished_locked(player_control &pc)
{
- assert(pc->command != PLAYER_COMMAND_NONE);
+ assert(pc.command != PLAYER_COMMAND_NONE);
- pc->command = PLAYER_COMMAND_NONE;
- pc->ClientSignal();
+ pc.command = PLAYER_COMMAND_NONE;
+ pc.ClientSignal();
}
static void
-player_command_finished(struct player_control *pc)
+player_command_finished(player_control &pc)
{
- pc->Lock();
+ pc.Lock();
player_command_finished_locked(pc);
- pc->Unlock();
+ pc.Unlock();
}
/**
@@ -169,19 +169,19 @@ player_command_finished(struct player_control *pc)
static void
player_dc_start(struct player *player, MusicPipe &pipe)
{
- struct player_control *pc = player->pc;
- struct decoder_control *dc = player->dc;
+ player_control &pc = player->pc;
+ decoder_control &dc = player->dc;
- assert(player->queued || pc->command == PLAYER_COMMAND_SEEK);
- assert(pc->next_song != NULL);
+ assert(player->queued || pc.command == PLAYER_COMMAND_SEEK);
+ 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);
+ unsigned start_ms = pc.next_song->start_ms;
+ if (pc.command == PLAYER_COMMAND_SEEK)
+ start_ms += (unsigned)(pc.seek_where * 1000);
- dc->Start(pc->next_song->DupDetached(),
- start_ms, pc->next_song->end_ms,
- player->buffer, pipe);
+ dc.Start(pc.next_song->DupDetached(),
+ start_ms, pc.next_song->end_ms,
+ player->buffer, pipe);
}
/**
@@ -196,7 +196,7 @@ player_dc_at_current_song(const struct player *player)
assert(player != NULL);
assert(player->pipe != NULL);
- return player->dc->pipe == player->pipe;
+ return player->dc.pipe == player->pipe;
}
/**
@@ -207,7 +207,7 @@ player_dc_at_current_song(const struct player *player)
static bool
player_dc_at_next_song(const struct player *player)
{
- return player->dc->pipe != NULL && !player_dc_at_current_song(player);
+ return player->dc.pipe != NULL && !player_dc_at_current_song(player);
}
/**
@@ -218,19 +218,19 @@ player_dc_at_next_song(const struct player *player)
static void
player_dc_stop(struct player *player)
{
- struct decoder_control *dc = player->dc;
+ decoder_control &dc = player->dc;
- dc->Stop();
+ dc.Stop();
- if (dc->pipe != NULL) {
+ if (dc.pipe != NULL) {
/* clear and free the decoder pipe */
- dc->pipe->Clear(player->buffer);
+ dc.pipe->Clear(player->buffer);
- if (dc->pipe != player->pipe)
- delete dc->pipe;
+ if (dc.pipe != player->pipe)
+ delete dc.pipe;
- dc->pipe = NULL;
+ dc.pipe = NULL;
}
}
@@ -244,23 +244,23 @@ player_dc_stop(struct player *player)
static bool
player_wait_for_decoder(struct player *player)
{
- struct player_control *pc = player->pc;
- struct decoder_control *dc = player->dc;
+ player_control &pc = player->pc;
+ decoder_control &dc = player->dc;
- assert(player->queued || pc->command == PLAYER_COMMAND_SEEK);
- assert(pc->next_song != NULL);
+ assert(player->queued || pc.command == PLAYER_COMMAND_SEEK);
+ assert(pc.next_song != NULL);
player->queued = false;
- Error error = dc->LockGetError();
+ Error error = dc.LockGetError();
if (error.IsDefined()) {
- pc->Lock();
- pc->SetError(PLAYER_ERROR_DECODER, std::move(error));
+ pc.Lock();
+ pc.SetError(PLAYER_ERROR_DECODER, std::move(error));
- pc->next_song->Free();
- pc->next_song = NULL;
+ pc.next_song->Free();
+ pc.next_song = NULL;
- pc->Unlock();
+ pc.Unlock();
return false;
}
@@ -268,24 +268,24 @@ player_wait_for_decoder(struct player *player)
if (player->song != NULL)
player->song->Free();
- player->song = pc->next_song;
+ player->song = pc.next_song;
player->elapsed_time = 0.0;
/* set the "starting" flag, which will be cleared by
player_check_decoder_startup() */
player->decoder_starting = true;
- pc->Lock();
+ pc.Lock();
/* update player_control's song information */
- pc->total_time = pc->next_song->GetDuration();
- pc->bit_rate = 0;
- pc->audio_format.Clear();
+ pc.total_time = pc.next_song->GetDuration();
+ pc.bit_rate = 0;
+ pc.audio_format.Clear();
/* clear the queued song */
- pc->next_song = NULL;
+ pc.next_song = NULL;
- pc->Unlock();
+ pc.Unlock();
/* call syncPlaylistWithQueue() in the main thread */
GlobalEvents::Emit(GlobalEvents::PLAYLIST);
@@ -322,11 +322,11 @@ real_song_duration(const Song *song, double decoder_duration)
static bool
player_open_output(struct player *player)
{
- struct player_control *pc = player->pc;
+ player_control &pc = player->pc;
assert(player->play_audio_format.IsDefined());
- assert(pc->state == PLAYER_STATE_PLAY ||
- pc->state == PLAYER_STATE_PAUSE);
+ assert(pc.state == PLAYER_STATE_PLAY ||
+ pc.state == PLAYER_STATE_PAUSE);
Error error;
if (audio_output_all_open(player->play_audio_format, player->buffer,
@@ -334,9 +334,9 @@ player_open_output(struct player *player)
player->output_open = true;
player->paused = false;
- pc->Lock();
- pc->state = PLAYER_STATE_PLAY;
- pc->Unlock();
+ pc.Lock();
+ pc.state = PLAYER_STATE_PLAY;
+ pc.Unlock();
idle_add(IDLE_PLAYER);
@@ -350,10 +350,10 @@ player_open_output(struct player *player)
audio output becomes available */
player->paused = true;
- pc->Lock();
- pc->SetError(PLAYER_ERROR_OUTPUT, std::move(error));
- pc->state = PLAYER_STATE_PAUSE;
- pc->Unlock();
+ pc.Lock();
+ pc.SetError(PLAYER_ERROR_OUTPUT, std::move(error));
+ pc.state = PLAYER_STATE_PAUSE;
+ pc.Unlock();
idle_add(IDLE_PLAYER);
@@ -371,46 +371,46 @@ player_open_output(struct player *player)
static bool
player_check_decoder_startup(struct player *player)
{
- struct player_control *pc = player->pc;
- struct decoder_control *dc = player->dc;
+ player_control &pc = player->pc;
+ decoder_control &dc = player->dc;
assert(player->decoder_starting);
- dc->Lock();
+ dc.Lock();
- Error error = dc->GetError();
+ Error error = dc.GetError();
if (error.IsDefined()) {
/* the decoder failed */
- dc->Unlock();
+ dc.Unlock();
- pc->Lock();
- pc->SetError(PLAYER_ERROR_DECODER, std::move(error));
- pc->Unlock();
+ pc.Lock();
+ pc.SetError(PLAYER_ERROR_DECODER, std::move(error));
+ pc.Unlock();
return false;
- } else if (!dc->IsStarting()) {
+ } else if (!dc.IsStarting()) {
/* the decoder is ready and ok */
- dc->Unlock();
+ dc.Unlock();
if (player->output_open &&
- !audio_output_all_wait(pc, 1))
+ !audio_output_all_wait(&pc, 1))
/* the output devices havn't finished playing
all chunks yet - wait for that */
return true;
- pc->Lock();
- pc->total_time = real_song_duration(dc->song, dc->total_time);
- pc->audio_format = dc->in_audio_format;
- pc->Unlock();
+ pc.Lock();
+ pc.total_time = real_song_duration(dc.song, dc.total_time);
+ pc.audio_format = dc.in_audio_format;
+ pc.Unlock();
idle_add(IDLE_PLAYER);
- player->play_audio_format = dc->out_audio_format;
+ player->play_audio_format = dc.out_audio_format;
player->decoder_starting = false;
if (!player->paused && !player_open_output(player)) {
- char *uri = dc->song->GetURI();
+ char *uri = dc.song->GetURI();
g_warning("problems opening audio device "
"while playing \"%s\"", uri);
g_free(uri);
@@ -422,8 +422,8 @@ player_check_decoder_startup(struct player *player)
} else {
/* the decoder is not yet ready; wait
some more */
- dc->WaitForDecoder();
- dc->Unlock();
+ dc.WaitForDecoder();
+ dc.Unlock();
return true;
}
@@ -478,15 +478,15 @@ player_send_silence(struct player *player)
*/
static bool player_seek_decoder(struct player *player)
{
- struct player_control *pc = player->pc;
- Song *song = pc->next_song;
- struct decoder_control *dc = player->dc;
+ player_control &pc = player->pc;
+ Song *song = pc.next_song;
+ decoder_control &dc = player->dc;
- assert(pc->next_song != NULL);
+ assert(pc.next_song != NULL);
const unsigned start_ms = song->start_ms;
- if (!dc->LockIsCurrentSong(song)) {
+ if (!dc.LockIsCurrentSong(song)) {
/* the decoder is already decoding the "next" song -
stop it and start the previous song again */
@@ -509,11 +509,11 @@ static bool player_seek_decoder(struct player *player)
but it is the same song file; exchange the pipe */
player->pipe->Clear(player->buffer);
delete player->pipe;
- player->pipe = dc->pipe;
+ player->pipe = dc.pipe;
}
- pc->next_song->Free();
- pc->next_song = NULL;
+ pc.next_song->Free();
+ pc.next_song = NULL;
player->queued = false;
}
@@ -529,13 +529,13 @@ static bool player_seek_decoder(struct player *player)
/* send the SEEK command */
- double where = pc->seek_where;
- if (where > pc->total_time)
- where = pc->total_time - 0.1;
+ double where = pc.seek_where;
+ if (where > pc.total_time)
+ where = pc.total_time - 0.1;
if (where < 0.0)
where = 0.0;
- if (!dc->Seek(where + start_ms / 1000.0)) {
+ if (!dc.Seek(where + start_ms / 1000.0)) {
/* decoder failure */
player_command_finished(pc);
return false;
@@ -560,10 +560,10 @@ static bool player_seek_decoder(struct player *player)
*/
static void player_process_command(struct player *player)
{
- struct player_control *pc = player->pc;
- gcc_unused struct decoder_control *dc = player->dc;
+ player_control &pc = player->pc;
+ gcc_unused decoder_control &dc = player->dc;
- switch (pc->command) {
+ switch (pc.command) {
case PLAYER_COMMAND_NONE:
case PLAYER_COMMAND_STOP:
case PLAYER_COMMAND_EXIT:
@@ -571,14 +571,14 @@ static void player_process_command(struct player *player)
break;
case PLAYER_COMMAND_UPDATE_AUDIO:
- pc->Unlock();
+ pc.Unlock();
audio_output_all_enable_disable();
- pc->Lock();
+ pc.Lock();
player_command_finished_locked(pc);
break;
case PLAYER_COMMAND_QUEUE:
- assert(pc->next_song != NULL);
+ assert(pc.next_song != NULL);
assert(!player->queued);
assert(!player_dc_at_next_song(player));
@@ -587,68 +587,68 @@ static void player_process_command(struct player *player)
break;
case PLAYER_COMMAND_PAUSE:
- pc->Unlock();
+ pc.Unlock();
player->paused = !player->paused;
if (player->paused) {
audio_output_all_pause();
- pc->Lock();
+ pc.Lock();
- pc->state = PLAYER_STATE_PAUSE;
+ pc.state = PLAYER_STATE_PAUSE;
} else if (!player->play_audio_format.IsDefined()) {
/* the decoder hasn't provided an audio format
yet - don't open the audio device yet */
- pc->Lock();
+ pc.Lock();
- pc->state = PLAYER_STATE_PLAY;
+ pc.state = PLAYER_STATE_PLAY;
} else {
player_open_output(player);
- pc->Lock();
+ pc.Lock();
}
player_command_finished_locked(pc);
break;
case PLAYER_COMMAND_SEEK:
- pc->Unlock();
+ pc.Unlock();
player_seek_decoder(player);
- pc->Lock();
+ pc.Lock();
break;
case PLAYER_COMMAND_CANCEL:
- if (pc->next_song == NULL) {
+ if (pc.next_song == NULL) {
/* the cancel request arrived too late, we're
already playing the queued song... stop
everything now */
- pc->command = PLAYER_COMMAND_STOP;
+ pc.command = PLAYER_COMMAND_STOP;
return;
}
if (player_dc_at_next_song(player)) {
/* the decoder is already decoding the song -
stop it and reset the position */
- pc->Unlock();
+ pc.Unlock();
player_dc_stop(player);
- pc->Lock();
+ pc.Lock();
}
- pc->next_song->Free();
- pc->next_song = NULL;
+ pc.next_song->Free();
+ pc.next_song = NULL;
player->queued = false;
player_command_finished_locked(pc);
break;
case PLAYER_COMMAND_REFRESH:
if (player->output_open && !player->paused) {
- pc->Unlock();
+ pc.Unlock();
audio_output_all_check();
- pc->Lock();
+ pc.Lock();
}
- pc->elapsed_time = audio_output_all_get_elapsed_time();
- if (pc->elapsed_time < 0.0)
- pc->elapsed_time = player->elapsed_time;
+ pc.elapsed_time = audio_output_all_get_elapsed_time();
+ if (pc.elapsed_time < 0.0)
+ pc.elapsed_time = player->elapsed_time;
player_command_finished_locked(pc);
break;
@@ -685,7 +685,7 @@ update_song_tag(Song *song, const Tag &new_tag)
* Player lock is not held.
*/
static bool
-play_chunk(struct player_control *pc,
+play_chunk(player_control &pc,
Song *song, struct music_chunk *chunk,
MusicBuffer &buffer,
const AudioFormat format,
@@ -701,16 +701,16 @@ play_chunk(struct player_control *pc,
return true;
}
- pc->Lock();
- pc->bit_rate = chunk->bit_rate;
- pc->Unlock();
+ pc.Lock();
+ pc.bit_rate = chunk->bit_rate;
+ pc.Unlock();
/* send the chunk to the audio outputs */
if (!audio_output_all_play(chunk, error))
return false;
- pc->total_play_time += (double)chunk->length /
+ pc.total_play_time += (double)chunk->length /
format.GetTimeToSize();
return true;
}
@@ -724,10 +724,10 @@ play_chunk(struct player_control *pc,
static bool
play_next_chunk(struct player *player)
{
- struct player_control *pc = player->pc;
- struct decoder_control *dc = player->dc;
+ player_control &pc = player->pc;
+ decoder_control &dc = player->dc;
- if (!audio_output_all_wait(pc, 64))
+ if (!audio_output_all_wait(&pc, 64))
/* the output pipe is still large enough, don't send
another chunk */
return true;
@@ -739,7 +739,7 @@ play_next_chunk(struct player *player)
(cross_fade_position = player->pipe->GetSize())
<= player->cross_fade_chunks) {
/* perform cross fade */
- music_chunk *other_chunk = dc->pipe->Shift();
+ music_chunk *other_chunk = dc.pipe->Shift();
if (!player->cross_fading) {
/* beginning of the cross fade - adjust
@@ -763,7 +763,7 @@ play_next_chunk(struct player *player)
other_chunk->tag);
other_chunk->tag = NULL;
- if (std::isnan(pc->mixramp_delay_seconds)) {
+ if (std::isnan(pc.mixramp_delay_seconds)) {
chunk->mix_ratio = ((float)cross_fade_position)
/ player->cross_fade_chunks;
} else {
@@ -786,19 +786,19 @@ play_next_chunk(struct player *player)
} else {
/* there are not enough decoded chunks yet */
- dc->Lock();
+ dc.Lock();
- if (dc->IsIdle()) {
+ if (dc.IsIdle()) {
/* the decoder isn't running, abort
cross fading */
- dc->Unlock();
+ dc.Unlock();
player->xfade = XFADE_DISABLED;
} else {
/* wait for the decoder */
- dc->Signal();
- dc->WaitForDecoder();
- dc->Unlock();
+ dc.Signal();
+ dc.WaitForDecoder();
+ dc.Unlock();
return true;
}
@@ -827,16 +827,16 @@ play_next_chunk(struct player *player)
player->buffer.Return(chunk);
- pc->Lock();
+ pc.Lock();
- pc->SetError(PLAYER_ERROR_OUTPUT, std::move(error));
+ pc.SetError(PLAYER_ERROR_OUTPUT, std::move(error));
/* pause: the user may resume playback as soon as an
audio output becomes available */
- pc->state = PLAYER_STATE_PAUSE;
+ pc.state = PLAYER_STATE_PAUSE;
player->paused = true;
- pc->Unlock();
+ pc.Unlock();
idle_add(IDLE_PLAYER);
@@ -846,12 +846,12 @@ play_next_chunk(struct player *player)
/* this formula should prevent that the decoder gets woken up
with each chunk; it is more efficient to make it decode a
larger block at a time */
- dc->Lock();
- if (!dc->IsIdle() &&
- dc->pipe->GetSize() <= (pc->buffered_before_play +
+ dc.Lock();
+ if (!dc.IsIdle() &&
+ dc.pipe->GetSize() <= (pc.buffered_before_play +
player->buffer.GetSize() * 3) / 4)
- dc->Signal();
- dc->Unlock();
+ dc.Signal();
+ dc.Unlock();
return true;
}
@@ -875,23 +875,23 @@ player_song_border(struct player *player)
g_free(uri);
delete player->pipe;
- player->pipe = player->dc->pipe;
+ player->pipe = player->dc.pipe;
audio_output_all_song_border();
if (!player_wait_for_decoder(player))
return false;
- struct player_control *const pc = player->pc;
- pc->Lock();
+ player_control &pc = player->pc;
+ pc.Lock();
- const bool border_pause = pc->border_pause;
+ const bool border_pause = pc.border_pause;
if (border_pause) {
player->paused = true;
- pc->state = PLAYER_STATE_PAUSE;
+ pc.state = PLAYER_STATE_PAUSE;
}
- pc->Unlock();
+ pc.Unlock();
if (border_pause)
idle_add(IDLE_PLAYER);
@@ -905,12 +905,12 @@ player_song_border(struct player *player)
* decoder thread and the output threads.
*/
static void
-do_play(struct player_control *pc, struct decoder_control *dc,
+do_play(player_control &pc, decoder_control &dc,
MusicBuffer &buffer)
{
player player(pc, dc, buffer);
- pc->Unlock();
+ pc.Unlock();
player.pipe = new MusicPipe();
@@ -922,37 +922,37 @@ do_play(struct player_control *pc, struct decoder_control *dc,
player_command_finished(pc);
delete player.pipe;
GlobalEvents::Emit(GlobalEvents::PLAYLIST);
- pc->Lock();
+ pc.Lock();
return;
}
- pc->Lock();
- pc->state = PLAYER_STATE_PLAY;
+ pc.Lock();
+ pc.state = PLAYER_STATE_PLAY;
- if (pc->command == PLAYER_COMMAND_SEEK)
- player.elapsed_time = pc->seek_where;
+ if (pc.command == PLAYER_COMMAND_SEEK)
+ player.elapsed_time = pc.seek_where;
player_command_finished_locked(pc);
while (true) {
player_process_command(&player);
- if (pc->command == PLAYER_COMMAND_STOP ||
- pc->command == PLAYER_COMMAND_EXIT ||
- pc->command == PLAYER_COMMAND_CLOSE_AUDIO) {
- pc->Unlock();
+ if (pc.command == PLAYER_COMMAND_STOP ||
+ pc.command == PLAYER_COMMAND_EXIT ||
+ pc.command == PLAYER_COMMAND_CLOSE_AUDIO) {
+ pc.Unlock();
audio_output_all_cancel();
break;
}
- pc->Unlock();
+ pc.Unlock();
if (player.buffering) {
/* buffering at the start of the song - wait
until the buffer is large enough, to
prevent stuttering on slow machines */
- if (player.pipe->GetSize() < pc->buffered_before_play &&
- !dc->LockIsIdle()) {
+ if (player.pipe->GetSize() < pc.buffered_before_play &&
+ !dc.LockIsIdle()) {
/* not enough decoded buffer space yet */
if (!player.paused &&
@@ -961,11 +961,11 @@ do_play(struct player_control *pc, struct decoder_control *dc,
!player_send_silence(&player))
break;
- dc->Lock();
+ dc.Lock();
/* XXX race condition: check decoder again */
- dc->WaitForDecoder();
- dc->Unlock();
- pc->Lock();
+ dc.WaitForDecoder();
+ dc.Unlock();
+ pc.Lock();
continue;
} else {
/* buffering is complete */
@@ -979,7 +979,7 @@ do_play(struct player_control *pc, struct decoder_control *dc,
if (!player_check_decoder_startup(&player))
break;
- pc->Lock();
+ pc.Lock();
continue;
}
@@ -987,41 +987,41 @@ do_play(struct player_control *pc, struct decoder_control *dc,
/*
music_pipe_check_format(&play_audio_format,
player.next_song_chunk,
- &dc->out_audio_format);
+ &dc.out_audio_format);
*/
#endif
- if (dc->LockIsIdle() && player.queued &&
- dc->pipe == player.pipe) {
+ if (dc.LockIsIdle() && player.queued &&
+ dc.pipe == player.pipe) {
/* the decoder has finished the current song;
make it decode the next song */
- assert(dc->pipe == NULL || dc->pipe == player.pipe);
+ assert(dc.pipe == NULL || dc.pipe == player.pipe);
player_dc_start(&player, *new MusicPipe());
}
if (/* no cross-fading if MPD is going to pause at the
end of the current song */
- !pc->border_pause &&
+ !pc.border_pause &&
player_dc_at_next_song(&player) &&
player.xfade == XFADE_UNKNOWN &&
- !dc->LockIsStarting()) {
+ !dc.LockIsStarting()) {
/* enable cross fading in this song? if yes,
calculate how many chunks will be required
for it */
player.cross_fade_chunks =
- cross_fade_calc(pc->cross_fade_seconds, dc->total_time,
- pc->mixramp_db,
- pc->mixramp_delay_seconds,
- dc->replay_gain_db,
- dc->replay_gain_prev_db,
- dc->mixramp_start,
- dc->mixramp_prev_end,
- dc->out_audio_format,
+ cross_fade_calc(pc.cross_fade_seconds, dc.total_time,
+ pc.mixramp_db,
+ pc.mixramp_delay_seconds,
+ dc.replay_gain_db,
+ dc.replay_gain_prev_db,
+ dc.mixramp_start,
+ dc.mixramp_prev_end,
+ dc.out_audio_format,
player.play_audio_format,
player.buffer.GetSize() -
- pc->buffered_before_play);
+ pc.buffered_before_play);
if (player.cross_fade_chunks > 0) {
player.xfade = XFADE_ENABLED;
player.cross_fading = false;
@@ -1032,10 +1032,10 @@ do_play(struct player_control *pc, struct decoder_control *dc,
}
if (player.paused) {
- pc->Lock();
+ pc.Lock();
- if (pc->command == PLAYER_COMMAND_NONE)
- pc->Wait();
+ if (pc.command == PLAYER_COMMAND_NONE)
+ pc.Wait();
continue;
} else if (!player.pipe->IsEmpty()) {
/* at least one music chunk is ready - send it
@@ -1054,7 +1054,7 @@ do_play(struct player_control *pc, struct decoder_control *dc,
if (!player_song_border(&player))
break;
- } else if (dc->LockIsIdle()) {
+ } else if (dc.LockIsIdle()) {
/* check the size of the pipe again, because
the decoder thread may have added something
since we last checked */
@@ -1072,7 +1072,7 @@ do_play(struct player_control *pc, struct decoder_control *dc,
break;
}
- pc->Lock();
+ pc.Lock();
}
player_dc_stop(&player);
@@ -1085,66 +1085,66 @@ do_play(struct player_control *pc, struct decoder_control *dc,
if (player.song != NULL)
player.song->Free();
- pc->Lock();
+ pc.Lock();
if (player.queued) {
- assert(pc->next_song != NULL);
- pc->next_song->Free();
- pc->next_song = NULL;
+ assert(pc.next_song != NULL);
+ pc.next_song->Free();
+ pc.next_song = NULL;
}
- pc->state = PLAYER_STATE_STOP;
+ pc.state = PLAYER_STATE_STOP;
- pc->Unlock();
+ pc.Unlock();
GlobalEvents::Emit(GlobalEvents::PLAYLIST);
- pc->Lock();
+ pc.Lock();
}
static gpointer
player_task(gpointer arg)
{
- struct player_control *pc = (struct player_control *)arg;
+ player_control &pc = *(player_control *)arg;
decoder_control dc;
decoder_thread_start(&dc);
- MusicBuffer buffer(pc->buffer_chunks);
+ MusicBuffer buffer(pc.buffer_chunks);
- pc->Lock();
+ pc.Lock();
while (1) {
- switch (pc->command) {
+ switch (pc.command) {
case PLAYER_COMMAND_SEEK:
case PLAYER_COMMAND_QUEUE:
- assert(pc->next_song != NULL);
+ assert(pc.next_song != NULL);
- do_play(pc, &dc, buffer);
+ do_play(pc, dc, buffer);
break;
case PLAYER_COMMAND_STOP:
- pc->Unlock();
+ pc.Unlock();
audio_output_all_cancel();
- pc->Lock();
+ pc.Lock();
/* fall through */
case PLAYER_COMMAND_PAUSE:
- if (pc->next_song != NULL) {
- pc->next_song->Free();
- pc->next_song = NULL;
+ if (pc.next_song != NULL) {
+ pc.next_song->Free();
+ pc.next_song = NULL;
}
player_command_finished_locked(pc);
break;
case PLAYER_COMMAND_CLOSE_AUDIO:
- pc->Unlock();
+ pc.Unlock();
audio_output_all_release();
- pc->Lock();
+ pc.Lock();
player_command_finished_locked(pc);
assert(buffer.IsEmptyUnsafe());
@@ -1152,14 +1152,14 @@ player_task(gpointer arg)
break;
case PLAYER_COMMAND_UPDATE_AUDIO:
- pc->Unlock();
+ pc.Unlock();
audio_output_all_enable_disable();
- pc->Lock();
+ pc.Lock();
player_command_finished_locked(pc);
break;
case PLAYER_COMMAND_EXIT:
- pc->Unlock();
+ pc.Unlock();
dc.Quit();
@@ -1169,9 +1169,9 @@ player_task(gpointer arg)
return NULL;
case PLAYER_COMMAND_CANCEL:
- if (pc->next_song != NULL) {
- pc->next_song->Free();
- pc->next_song = NULL;
+ if (pc.next_song != NULL) {
+ pc.next_song->Free();
+ pc.next_song = NULL;
}
player_command_finished_locked(pc);
@@ -1183,23 +1183,23 @@ player_task(gpointer arg)
break;
case PLAYER_COMMAND_NONE:
- pc->Wait();
+ pc.Wait();
break;
}
}
}
void
-player_create(struct player_control *pc)
+player_create(player_control &pc)
{
- assert(pc->thread == NULL);
+ assert(pc.thread == NULL);
#if GLIB_CHECK_VERSION(2,32,0)
- pc->thread = g_thread_new("player", player_task, pc);
+ pc.thread = g_thread_new("player", player_task, &pc);
#else
GError *e = NULL;
- pc->thread = g_thread_create(player_task, pc, true, &e);
- if (pc->thread == NULL)
+ pc.thread = g_thread_create(player_task, &pc, true, &e);
+ if (pc.thread == NULL)
FatalError("Failed to spawn player task", e);
#endif
}