From 81f3d893d9e41120d76a3e710db77ccd829cbf42 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 4 Jan 2013 22:31:53 +0100 Subject: player_control.h: convert header to C++ --- Makefile.am | 3 +- src/Main.cxx | 2 +- src/OutputAll.cxx | 2 +- src/OutputCommand.cxx | 2 +- src/OutputThread.cxx | 2 +- src/PlayerCommands.cxx | 4 +- src/PlayerControl.cxx | 2 +- src/PlayerControl.hxx | 339 ++++++++++++++++++++++++++++++++++++++++++++++++ src/PlayerThread.cxx | 2 +- src/Playlist.cxx | 2 +- src/PlaylistControl.cxx | 5 +- src/PlaylistEdit.cxx | 2 +- src/PlaylistState.cxx | 2 +- src/Stats.cxx | 2 +- src/player_control.h | 339 ------------------------------------------------ test/run_output.cxx | 2 +- 16 files changed, 355 insertions(+), 357 deletions(-) create mode 100644 src/PlayerControl.hxx delete mode 100644 src/player_control.h diff --git a/Makefile.am b/Makefile.am index e0ef76586..387100dfc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -114,7 +114,6 @@ mpd_headers = \ src/output/httpd_client.h \ src/output/httpd_internal.h \ src/page.h \ - src/player_control.h \ src/Playlist.hxx \ src/playlist_error.h \ src/PlaylistInternal.hxx \ @@ -265,7 +264,7 @@ src_mpd_SOURCES = \ src/page.c \ src/Permission.cxx src/Permission.hxx \ src/PlayerThread.cxx src/PlayerThread.hxx \ - src/PlayerControl.cxx \ + src/PlayerControl.cxx src/PlayerControl.hxx \ src/Playlist.cxx \ src/PlaylistGlobal.cxx \ src/PlaylistControl.cxx \ diff --git a/src/Main.cxx b/src/Main.cxx index 3340bf3de..b10e0f328 100644 --- a/src/Main.cxx +++ b/src/Main.cxx @@ -22,6 +22,7 @@ #include "CommandLine.hxx" #include "Playlist.hxx" #include "PlaylistFile.hxx" +#include "PlayerControl.hxx" #include "UpdateGlue.hxx" #include "MusicChunk.hxx" #include "StateFile.hxx" @@ -41,7 +42,6 @@ extern "C" { #include "idle.h" #include "conf.h" #include "path.h" -#include "player_control.h" #include "stats.h" #include "sig_handlers.h" #include "audio_config.h" diff --git a/src/OutputAll.cxx b/src/OutputAll.cxx index 113eca43c..d211cdce4 100644 --- a/src/OutputAll.cxx +++ b/src/OutputAll.cxx @@ -24,6 +24,7 @@ extern "C" { #include "output_internal.h" } +#include "PlayerControl.hxx" #include "OutputControl.hxx" #include "OutputError.hxx" #include "MusicBuffer.hxx" @@ -32,7 +33,6 @@ extern "C" { #include "mpd_error.h" extern "C" { -#include "player_control.h" #include "conf.h" #include "notify.h" } diff --git a/src/OutputCommand.cxx b/src/OutputCommand.cxx index ed4cd8e88..cce1a5b04 100644 --- a/src/OutputCommand.cxx +++ b/src/OutputCommand.cxx @@ -26,13 +26,13 @@ #include "config.h" #include "OutputCommand.hxx" +#include "PlayerControl.hxx" extern "C" { #include "output_all.h" #include "output_internal.h" #include "output_plugin.h" #include "mixer_control.h" -#include "player_control.h" #include "idle.h" } diff --git a/src/OutputThread.cxx b/src/OutputThread.cxx index 6fddf15de..3d0d96f7a 100644 --- a/src/OutputThread.cxx +++ b/src/OutputThread.cxx @@ -23,7 +23,6 @@ extern "C" { #include "output_api.h" #include "output_internal.h" -#include "player_control.h" #include "pcm_mix.h" #include "filter_plugin.h" #include "filter/convert_filter_plugin.h" @@ -31,6 +30,7 @@ extern "C" { #include "notify.h" } +#include "PlayerControl.hxx" #include "MusicPipe.hxx" #include "MusicChunk.hxx" diff --git a/src/PlayerCommands.cxx b/src/PlayerCommands.cxx index 55bd83a13..25b82f37d 100644 --- a/src/PlayerCommands.cxx +++ b/src/PlayerCommands.cxx @@ -28,11 +28,13 @@ #include "protocol/ArgParser.hxx" extern "C" { -#include "player_control.h" +#include "audio_format.h" #include "volume.h" #include "replay_gain_config.h" } +#include "PlayerControl.hxx" + #include #define COMMAND_STATUS_STATE "state" diff --git a/src/PlayerControl.cxx b/src/PlayerControl.cxx index 07749b7f0..7d729bfdc 100644 --- a/src/PlayerControl.cxx +++ b/src/PlayerControl.cxx @@ -18,9 +18,9 @@ */ #include "config.h" +#include "PlayerControl.hxx" extern "C" { -#include "player_control.h" #include "idle.h" } diff --git a/src/PlayerControl.hxx b/src/PlayerControl.hxx new file mode 100644 index 000000000..3b536b8ba --- /dev/null +++ b/src/PlayerControl.hxx @@ -0,0 +1,339 @@ +/* + * Copyright (C) 2003-2011 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_PLAYER_H +#define MPD_PLAYER_H + +#include "audio_format.h" + +#include + +#include + +struct decoder_control; + +enum player_state { + PLAYER_STATE_STOP = 0, + PLAYER_STATE_PAUSE, + PLAYER_STATE_PLAY +}; + +enum player_command { + PLAYER_COMMAND_NONE = 0, + PLAYER_COMMAND_EXIT, + PLAYER_COMMAND_STOP, + PLAYER_COMMAND_PAUSE, + PLAYER_COMMAND_SEEK, + PLAYER_COMMAND_CLOSE_AUDIO, + + /** + * At least one audio_output.enabled flag has been modified; + * commit those changes to the output threads. + */ + PLAYER_COMMAND_UPDATE_AUDIO, + + /** player_control.next_song has been updated */ + PLAYER_COMMAND_QUEUE, + + /** + * cancel pre-decoding player_control.next_song; if the player + * has already started playing this song, it will completely + * stop + */ + PLAYER_COMMAND_CANCEL, + + /** + * Refresh status information in the #player_control struct, + * e.g. elapsed_time. + */ + PLAYER_COMMAND_REFRESH, +}; + +enum player_error { + PLAYER_ERROR_NONE = 0, + + /** + * The decoder has failed to decode the song. + */ + PLAYER_ERROR_DECODER, + + /** + * The audio output has failed. + */ + PLAYER_ERROR_OUTPUT, +}; + +struct player_status { + enum player_state state; + uint16_t bit_rate; + struct audio_format audio_format; + float total_time; + float elapsed_time; +}; + +struct player_control { + unsigned buffer_chunks; + + unsigned int buffered_before_play; + + /** the handle of the player thread, or NULL if the player + thread isn't running */ + GThread *thread; + + /** + * This lock protects #command, #state, #error. + */ + GMutex *mutex; + + /** + * Trigger this object after you have modified #command. + */ + GCond *cond; + + enum player_command command; + enum player_state state; + + enum player_error error_type; + + /** + * The error that occurred in the player thread. This + * attribute is only valid if #error is not + * #PLAYER_ERROR_NONE. The object must be freed when this + * object transitions back to #PLAYER_ERROR_NONE. + */ + GError *error; + + uint16_t bit_rate; + struct audio_format audio_format; + float total_time; + float elapsed_time; + + /** + * The next queued song. + * + * This is a duplicate, and must be freed when this attribute + * is cleared. + */ + struct song *next_song; + + double seek_where; + float cross_fade_seconds; + float mixramp_db; + float mixramp_delay_seconds; + double total_play_time; + + /** + * If this flag is set, then the player will be auto-paused at + * the end of the song, before the next song starts to play. + * + * This is a copy of the queue's "single" flag most of the + * time. + */ + bool border_pause; +}; + +struct player_control * +pc_new(unsigned buffer_chunks, unsigned buffered_before_play); + +void +pc_free(struct player_control *pc); + +/** + * Locks the #player_control object. + */ +static inline void +player_lock(struct player_control *pc) +{ + g_mutex_lock(pc->mutex); +} + +/** + * Unlocks the #player_control object. + */ +static inline void +player_unlock(struct player_control *pc) +{ + g_mutex_unlock(pc->mutex); +} + +/** + * Waits for a signal on the #player_control object. This function is + * only valid in the player thread. The object must be locked prior + * to calling this function. + */ +static inline void +player_wait(struct player_control *pc) +{ + g_cond_wait(pc->cond, pc->mutex); +} + +/** + * Waits for a signal on the #player_control object. This function is + * only valid in the player thread. The #decoder_control object must + * be locked prior to calling this function. + * + * Note the small difference to the player_wait() function! + */ +void +player_wait_decoder(struct player_control *pc, struct decoder_control *dc); + +/** + * Signals the #player_control object. The object should be locked + * prior to calling this function. + */ +static inline void +player_signal(struct player_control *pc) +{ + g_cond_signal(pc->cond); +} + +/** + * Signals the #player_control object. The object is temporarily + * locked by this function. + */ +static inline void +player_lock_signal(struct player_control *pc) +{ + player_lock(pc); + player_signal(pc); + player_unlock(pc); +} + +/** + * @param song the song to be queued; the given instance will be owned + * and freed by the player + */ +void +pc_play(struct player_control *pc, struct song *song); + +/** + * see PLAYER_COMMAND_CANCEL + */ +void +pc_cancel(struct player_control *pc); + +void +pc_set_pause(struct player_control *pc, bool pause_flag); + +void +pc_pause(struct player_control *pc); + +/** + * Set the player's #border_pause flag. + */ +void +pc_set_border_pause(struct player_control *pc, bool border_pause); + +void +pc_kill(struct player_control *pc); + +void +pc_get_status(struct player_control *pc, struct player_status *status); + +static inline enum player_state +pc_get_state(struct player_control *pc) +{ + return pc->state; +} + +/** + * Set the error. Discards any previous error condition. + * + * Caller must lock the object. + * + * @param type the error type; must not be #PLAYER_ERROR_NONE + * @param error detailed error information; must not be NULL; the + * #player_control takes over ownership of this #GError instance + */ +void +pc_set_error(struct player_control *pc, enum player_error type, + GError *error); + +void +pc_clear_error(struct player_control *pc); + +/** + * Returns the human-readable message describing the last error during + * playback, NULL if no error occurred. The caller has to free the + * returned string. + */ +char * +pc_get_error_message(struct player_control *pc); + +static inline enum player_error +pc_get_error_type(struct player_control *pc) +{ + return pc->error_type; +} + +void +pc_stop(struct player_control *pc); + +void +pc_update_audio(struct player_control *pc); + +/** + * @param song the song to be queued; the given instance will be owned + * and freed by the player + */ +void +pc_enqueue_song(struct player_control *pc, struct song *song); + +/** + * Makes the player thread seek the specified song to a position. + * + * @param song the song to be queued; the given instance will be owned + * and freed by the player + * @return true on success, false on failure (e.g. if MPD isn't + * playing currently) + */ +bool +pc_seek(struct player_control *pc, struct song *song, float seek_time); + +void +pc_set_cross_fade(struct player_control *pc, float cross_fade_seconds); + +float +pc_get_cross_fade(const struct player_control *pc); + +void +pc_set_mixramp_db(struct player_control *pc, float mixramp_db); + +static inline float +pc_get_mixramp_db(const struct player_control *pc) +{ + return pc->mixramp_db; +} + +void +pc_set_mixramp_delay(struct player_control *pc, float mixramp_delay_seconds); + +static inline float +pc_get_mixramp_delay(const struct player_control *pc) +{ + return pc->mixramp_delay_seconds; +} + +static inline double +pc_get_total_play_time(const struct player_control *pc) +{ + return pc->total_play_time; +} + +#endif diff --git a/src/PlayerThread.cxx b/src/PlayerThread.cxx index 624698f5c..0343b9fcd 100644 --- a/src/PlayerThread.cxx +++ b/src/PlayerThread.cxx @@ -28,9 +28,9 @@ #include "Main.hxx" #include "mpd_error.h" #include "CrossFade.hxx" +#include "PlayerControl.hxx" extern "C" { -#include "player_control.h" #include "output_all.h" #include "event_pipe.h" #include "tag.h" diff --git a/src/Playlist.cxx b/src/Playlist.cxx index de2daf144..9f08439a0 100644 --- a/src/Playlist.cxx +++ b/src/Playlist.cxx @@ -19,10 +19,10 @@ #include "config.h" #include "PlaylistInternal.hxx" +#include "PlayerControl.hxx" #include "song.h" extern "C" { -#include "player_control.h" #include "conf.h" #include "idle.h" } diff --git a/src/PlaylistControl.cxx b/src/PlaylistControl.cxx index 464b25cfc..89c680523 100644 --- a/src/PlaylistControl.cxx +++ b/src/PlaylistControl.cxx @@ -24,12 +24,9 @@ #include "config.h" #include "PlaylistInternal.hxx" +#include "PlayerControl.hxx" #include "song.h" -extern "C" { -#include "player_control.h" -} - #include #undef G_LOG_DOMAIN diff --git a/src/PlaylistEdit.cxx b/src/PlaylistEdit.cxx index baf483427..90a65fd29 100644 --- a/src/PlaylistEdit.cxx +++ b/src/PlaylistEdit.cxx @@ -25,9 +25,9 @@ #include "config.h" #include "PlaylistInternal.hxx" +#include "PlayerControl.hxx" extern "C" { -#include "player_control.h" #include "uri.h" #include "song.h" #include "idle.h" diff --git a/src/PlaylistState.cxx b/src/PlaylistState.cxx index 92aa62947..32929d077 100644 --- a/src/PlaylistState.cxx +++ b/src/PlaylistState.cxx @@ -27,9 +27,9 @@ #include "Playlist.hxx" #include "QueueSave.hxx" #include "TextFile.hxx" +#include "PlayerControl.hxx" extern "C" { -#include "player_control.h" #include "conf.h" } diff --git a/src/Stats.cxx b/src/Stats.cxx index f96bcf177..f848a9b03 100644 --- a/src/Stats.cxx +++ b/src/Stats.cxx @@ -21,9 +21,9 @@ extern "C" { #include "stats.h" -#include "player_control.h" } +#include "PlayerControl.hxx" #include "ClientInternal.hxx" #include "DatabaseSelection.hxx" #include "DatabaseGlue.hxx" diff --git a/src/player_control.h b/src/player_control.h deleted file mode 100644 index 3b536b8ba..000000000 --- a/src/player_control.h +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Copyright (C) 2003-2011 The Music Player Daemon Project - * http://www.musicpd.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef MPD_PLAYER_H -#define MPD_PLAYER_H - -#include "audio_format.h" - -#include - -#include - -struct decoder_control; - -enum player_state { - PLAYER_STATE_STOP = 0, - PLAYER_STATE_PAUSE, - PLAYER_STATE_PLAY -}; - -enum player_command { - PLAYER_COMMAND_NONE = 0, - PLAYER_COMMAND_EXIT, - PLAYER_COMMAND_STOP, - PLAYER_COMMAND_PAUSE, - PLAYER_COMMAND_SEEK, - PLAYER_COMMAND_CLOSE_AUDIO, - - /** - * At least one audio_output.enabled flag has been modified; - * commit those changes to the output threads. - */ - PLAYER_COMMAND_UPDATE_AUDIO, - - /** player_control.next_song has been updated */ - PLAYER_COMMAND_QUEUE, - - /** - * cancel pre-decoding player_control.next_song; if the player - * has already started playing this song, it will completely - * stop - */ - PLAYER_COMMAND_CANCEL, - - /** - * Refresh status information in the #player_control struct, - * e.g. elapsed_time. - */ - PLAYER_COMMAND_REFRESH, -}; - -enum player_error { - PLAYER_ERROR_NONE = 0, - - /** - * The decoder has failed to decode the song. - */ - PLAYER_ERROR_DECODER, - - /** - * The audio output has failed. - */ - PLAYER_ERROR_OUTPUT, -}; - -struct player_status { - enum player_state state; - uint16_t bit_rate; - struct audio_format audio_format; - float total_time; - float elapsed_time; -}; - -struct player_control { - unsigned buffer_chunks; - - unsigned int buffered_before_play; - - /** the handle of the player thread, or NULL if the player - thread isn't running */ - GThread *thread; - - /** - * This lock protects #command, #state, #error. - */ - GMutex *mutex; - - /** - * Trigger this object after you have modified #command. - */ - GCond *cond; - - enum player_command command; - enum player_state state; - - enum player_error error_type; - - /** - * The error that occurred in the player thread. This - * attribute is only valid if #error is not - * #PLAYER_ERROR_NONE. The object must be freed when this - * object transitions back to #PLAYER_ERROR_NONE. - */ - GError *error; - - uint16_t bit_rate; - struct audio_format audio_format; - float total_time; - float elapsed_time; - - /** - * The next queued song. - * - * This is a duplicate, and must be freed when this attribute - * is cleared. - */ - struct song *next_song; - - double seek_where; - float cross_fade_seconds; - float mixramp_db; - float mixramp_delay_seconds; - double total_play_time; - - /** - * If this flag is set, then the player will be auto-paused at - * the end of the song, before the next song starts to play. - * - * This is a copy of the queue's "single" flag most of the - * time. - */ - bool border_pause; -}; - -struct player_control * -pc_new(unsigned buffer_chunks, unsigned buffered_before_play); - -void -pc_free(struct player_control *pc); - -/** - * Locks the #player_control object. - */ -static inline void -player_lock(struct player_control *pc) -{ - g_mutex_lock(pc->mutex); -} - -/** - * Unlocks the #player_control object. - */ -static inline void -player_unlock(struct player_control *pc) -{ - g_mutex_unlock(pc->mutex); -} - -/** - * Waits for a signal on the #player_control object. This function is - * only valid in the player thread. The object must be locked prior - * to calling this function. - */ -static inline void -player_wait(struct player_control *pc) -{ - g_cond_wait(pc->cond, pc->mutex); -} - -/** - * Waits for a signal on the #player_control object. This function is - * only valid in the player thread. The #decoder_control object must - * be locked prior to calling this function. - * - * Note the small difference to the player_wait() function! - */ -void -player_wait_decoder(struct player_control *pc, struct decoder_control *dc); - -/** - * Signals the #player_control object. The object should be locked - * prior to calling this function. - */ -static inline void -player_signal(struct player_control *pc) -{ - g_cond_signal(pc->cond); -} - -/** - * Signals the #player_control object. The object is temporarily - * locked by this function. - */ -static inline void -player_lock_signal(struct player_control *pc) -{ - player_lock(pc); - player_signal(pc); - player_unlock(pc); -} - -/** - * @param song the song to be queued; the given instance will be owned - * and freed by the player - */ -void -pc_play(struct player_control *pc, struct song *song); - -/** - * see PLAYER_COMMAND_CANCEL - */ -void -pc_cancel(struct player_control *pc); - -void -pc_set_pause(struct player_control *pc, bool pause_flag); - -void -pc_pause(struct player_control *pc); - -/** - * Set the player's #border_pause flag. - */ -void -pc_set_border_pause(struct player_control *pc, bool border_pause); - -void -pc_kill(struct player_control *pc); - -void -pc_get_status(struct player_control *pc, struct player_status *status); - -static inline enum player_state -pc_get_state(struct player_control *pc) -{ - return pc->state; -} - -/** - * Set the error. Discards any previous error condition. - * - * Caller must lock the object. - * - * @param type the error type; must not be #PLAYER_ERROR_NONE - * @param error detailed error information; must not be NULL; the - * #player_control takes over ownership of this #GError instance - */ -void -pc_set_error(struct player_control *pc, enum player_error type, - GError *error); - -void -pc_clear_error(struct player_control *pc); - -/** - * Returns the human-readable message describing the last error during - * playback, NULL if no error occurred. The caller has to free the - * returned string. - */ -char * -pc_get_error_message(struct player_control *pc); - -static inline enum player_error -pc_get_error_type(struct player_control *pc) -{ - return pc->error_type; -} - -void -pc_stop(struct player_control *pc); - -void -pc_update_audio(struct player_control *pc); - -/** - * @param song the song to be queued; the given instance will be owned - * and freed by the player - */ -void -pc_enqueue_song(struct player_control *pc, struct song *song); - -/** - * Makes the player thread seek the specified song to a position. - * - * @param song the song to be queued; the given instance will be owned - * and freed by the player - * @return true on success, false on failure (e.g. if MPD isn't - * playing currently) - */ -bool -pc_seek(struct player_control *pc, struct song *song, float seek_time); - -void -pc_set_cross_fade(struct player_control *pc, float cross_fade_seconds); - -float -pc_get_cross_fade(const struct player_control *pc); - -void -pc_set_mixramp_db(struct player_control *pc, float mixramp_db); - -static inline float -pc_get_mixramp_db(const struct player_control *pc) -{ - return pc->mixramp_db; -} - -void -pc_set_mixramp_delay(struct player_control *pc, float mixramp_delay_seconds); - -static inline float -pc_get_mixramp_delay(const struct player_control *pc) -{ - return pc->mixramp_delay_seconds; -} - -static inline double -pc_get_total_play_time(const struct player_control *pc) -{ - return pc->total_play_time; -} - -#endif diff --git a/test/run_output.cxx b/test/run_output.cxx index 9307256ab..18967ead2 100644 --- a/test/run_output.cxx +++ b/test/run_output.cxx @@ -33,7 +33,7 @@ extern "C" { } #include "Playlist.hxx" -#include "player_control.h" +#include "PlayerControl.hxx" #include "stdbin.h" #include -- cgit v1.2.3