diff options
Diffstat (limited to '')
-rw-r--r-- | src/PlayerControl.cxx (renamed from src/player_control.c) | 170 |
1 files changed, 56 insertions, 114 deletions
diff --git a/src/player_control.c b/src/PlayerControl.cxx index 90f616d77..62a8a4f80 100644 --- a/src/player_control.c +++ b/src/PlayerControl.cxx @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2011 The Music Player Daemon Project + * Copyright (C) 2003-2013 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -18,78 +18,61 @@ */ #include "config.h" -#include "player_control.h" -#include "decoder_control.h" -#include "path.h" -#include "log.h" -#include "tag.h" +#include "PlayerControl.hxx" +#include "Idle.hxx" #include "song.h" -#include "idle.h" -#include "pcm_volume.h" -#include "main.h" +#include "DecoderControl.hxx" +#include "Main.hxx" + +#include <cmath> #include <assert.h> #include <stdio.h> -#include <math.h> static void pc_enqueue_song_locked(struct player_control *pc, struct song *song); -struct player_control * -pc_new(unsigned buffer_chunks, unsigned int buffered_before_play) +player_control::player_control(unsigned _buffer_chunks, + unsigned _buffered_before_play) + :buffer_chunks(_buffer_chunks), + buffered_before_play(_buffered_before_play), + thread(nullptr), + command(PLAYER_COMMAND_NONE), + state(PLAYER_STATE_STOP), + error_type(PLAYER_ERROR_NONE), + error(nullptr), + next_song(nullptr), + cross_fade_seconds(0), + mixramp_db(0), + mixramp_delay_seconds(std::nanf("")), + total_play_time(0), + border_pause(false) { - struct player_control *pc = g_new0(struct player_control, 1); - - pc->buffer_chunks = buffer_chunks; - pc->buffered_before_play = buffered_before_play; - - pc->mutex = g_mutex_new(); - pc->cond = g_cond_new(); - - pc->command = PLAYER_COMMAND_NONE; - pc->error = PLAYER_ERROR_NOERROR; - pc->state = PLAYER_STATE_STOP; - pc->cross_fade_seconds = 0; - pc->mixramp_db = 0; - pc->mixramp_delay_seconds = nanf(""); - - return pc; } -void -pc_free(struct player_control *pc) +player_control::~player_control() { - g_cond_free(pc->cond); - g_mutex_free(pc->mutex); - g_free(pc); + if (next_song != nullptr) + song_free(next_song); } void -player_wait_decoder(struct player_control *pc, struct decoder_control *dc) +player_wait_decoder(gcc_unused struct player_control *pc, + struct decoder_control *dc) { assert(pc != NULL); assert(dc != NULL); - assert(dc->client_cond == pc->cond); /* during this function, the decoder lock is held, because we're waiting for the decoder thread */ - g_cond_wait(pc->cond, dc->mutex); -} - -void -pc_song_deleted(struct player_control *pc, const struct song *song) -{ - if (pc->errored_song == song) { - pc->error = PLAYER_ERROR_NOERROR; - pc->errored_song = NULL; - } + g_cond_wait(dc->client_cond, dc->mutex); } static void player_command_wait_locked(struct player_control *pc) { while (pc->command != PLAYER_COMMAND_NONE) - g_cond_wait(main_cond, pc->mutex); + pc->cond.wait(pc->mutex); } static void @@ -236,70 +219,43 @@ pc_get_status(struct player_control *pc, struct player_status *status) player_unlock(pc); } -enum player_state -pc_get_state(struct player_control *pc) +void +pc_set_error(struct player_control *pc, enum player_error type, + GError *error) { - return pc->state; + assert(pc != NULL); + assert(type != PLAYER_ERROR_NONE); + assert(error != NULL); + + if (pc->error_type != PLAYER_ERROR_NONE) + g_error_free(pc->error); + + pc->error_type = type; + pc->error = error; } void pc_clear_error(struct player_control *pc) { player_lock(pc); - pc->error = PLAYER_ERROR_NOERROR; - pc->errored_song = NULL; - player_unlock(pc); -} -enum player_error -pc_get_error(struct player_control *pc) -{ - return pc->error; -} + if (pc->error_type != PLAYER_ERROR_NONE) { + pc->error_type = PLAYER_ERROR_NONE; + g_error_free(pc->error); + } -static char * -pc_errored_song_uri(struct player_control *pc) -{ - return song_get_uri(pc->errored_song); + player_unlock(pc); } char * pc_get_error_message(struct player_control *pc) { - char *error; - char *uri; - - switch (pc->error) { - case PLAYER_ERROR_NOERROR: - return NULL; - - case PLAYER_ERROR_FILENOTFOUND: - uri = pc_errored_song_uri(pc); - error = g_strdup_printf("file \"%s\" does not exist or is inaccessible", uri); - g_free(uri); - return error; - - case PLAYER_ERROR_FILE: - uri = pc_errored_song_uri(pc); - error = g_strdup_printf("problems decoding \"%s\"", uri); - g_free(uri); - return error; - - case PLAYER_ERROR_AUDIO: - return g_strdup("problems opening audio device"); - - case PLAYER_ERROR_SYSTEM: - return g_strdup("system error occurred"); - - case PLAYER_ERROR_UNKTYPE: - uri = pc_errored_song_uri(pc); - error = g_strdup_printf("file type of \"%s\" is unknown", uri); - g_free(uri); - return error; - } - - assert(false); - return NULL; + player_lock(pc); + char *message = pc->error_type != PLAYER_ERROR_NONE + ? g_strdup(pc->error->message) + : NULL; + player_unlock(pc); + return message; } static void @@ -328,6 +284,10 @@ pc_seek(struct player_control *pc, struct song *song, float seek_time) assert(song != NULL); player_lock(pc); + + if (pc->next_song != NULL) + song_free(pc->next_song); + pc->next_song = song; pc->seek_where = seek_time; player_command_locked(pc, PLAYER_COMMAND_SEEK); @@ -356,12 +316,6 @@ pc_set_cross_fade(struct player_control *pc, float cross_fade_seconds) idle_add(IDLE_OPTIONS); } -float -pc_get_mixramp_db(const struct player_control *pc) -{ - return pc->mixramp_db; -} - void pc_set_mixramp_db(struct player_control *pc, float mixramp_db) { @@ -370,12 +324,6 @@ pc_set_mixramp_db(struct player_control *pc, float mixramp_db) idle_add(IDLE_OPTIONS); } -float -pc_get_mixramp_delay(const struct player_control *pc) -{ - return pc->mixramp_delay_seconds; -} - void pc_set_mixramp_delay(struct player_control *pc, float mixramp_delay_seconds) { @@ -383,9 +331,3 @@ pc_set_mixramp_delay(struct player_control *pc, float mixramp_delay_seconds) idle_add(IDLE_OPTIONS); } - -double -pc_get_total_play_time(const struct player_control *pc) -{ - return pc->total_play_time; -} |