aboutsummaryrefslogtreecommitdiffstats
path: root/src/PlayerControl.cxx
diff options
context:
space:
mode:
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;
-}