summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--command.c5
-rw-r--r--libvo/x11_common.c1
-rw-r--r--mp_core.h5
-rw-r--r--mplayer.c46
-rw-r--r--parser-cfg.c2
5 files changed, 34 insertions, 25 deletions
diff --git a/command.c b/command.c
index 6ec37d4f26..83a0ca8755 100644
--- a/command.c
+++ b/command.c
@@ -2872,8 +2872,9 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd)
break;
case MP_CMD_QUIT:
- exit_player_with_rc(mpctx, EXIT_QUIT,
- (cmd->nargs > 0) ? cmd->args[0].v.i : 0);
+ mpctx->stop_play = PT_QUIT;
+ mpctx->quit_player_rc = (cmd->nargs > 0) ? cmd->args[0].v.i : 0;
+ break;
case MP_CMD_PLAYLIST_NEXT:
case MP_CMD_PLAYLIST_PREV:
diff --git a/libvo/x11_common.c b/libvo/x11_common.c
index 210f618533..fc6875b7d5 100644
--- a/libvo/x11_common.c
+++ b/libvo/x11_common.c
@@ -193,7 +193,6 @@ static int x11_errorhandler(Display * display, XErrorEvent * event)
event->error_code, event->request_code, event->minor_code);
// abort();
- //exit_player("X11 error");
return 0;
#undef MSGLEN
}
diff --git a/mp_core.h b/mp_core.h
index 153869d620..31834d61e9 100644
--- a/mp_core.h
+++ b/mp_core.h
@@ -54,6 +54,7 @@ enum stop_play_reason {
PT_NEXT_ENTRY, // prepare to play next entry in playlist
PT_CURRENT_ENTRY, // prepare to play mpctx->playlist->current
PT_STOP, // stop playback, clear playlist
+ PT_QUIT, // stop playback, quit player
};
enum exit_reason {
@@ -99,6 +100,9 @@ typedef struct MPContext {
enum stop_play_reason stop_play;
unsigned int initialized_flags; // which subsystems have been initialized
+ // Return code to use with PT_QUIT
+ int quit_player_rc;
+
struct content_source *sources;
int num_sources;
struct timeline_part *timeline;
@@ -227,7 +231,6 @@ void uninit_player(struct MPContext *mpctx, unsigned int mask);
void reinit_audio_chain(struct MPContext *mpctx);
void init_vo_spudec(struct MPContext *mpctx);
double playing_audio_pts(struct MPContext *mpctx);
-void exit_player_with_rc(struct MPContext *mpctx, enum exit_reason how, int rc);
void add_subtitles(struct MPContext *mpctx, char *filename, float fps, int noerr);
int reinit_video_chain(struct MPContext *mpctx);
void pause_player(struct MPContext *mpctx);
diff --git a/mplayer.c b/mplayer.c
index 45b04a58cc..b25a18a460 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -652,7 +652,7 @@ void uninit_player(struct MPContext *mpctx, unsigned int mask)
}
}
-void exit_player_with_rc(struct MPContext *mpctx, enum exit_reason how, int rc)
+static void exit_player(struct MPContext *mpctx, enum exit_reason how, int rc)
{
uninit_player(mpctx, INITIALIZED_ALL);
#if defined(__MINGW32__) || defined(__CYGWIN__)
@@ -700,11 +700,6 @@ void exit_player_with_rc(struct MPContext *mpctx, enum exit_reason how, int rc)
exit(rc);
}
-static void exit_player(struct MPContext *mpctx, enum exit_reason how)
-{
- exit_player_with_rc(mpctx, how, 1);
-}
-
#include "cfg-mplayer.h"
static int cfg_include(struct m_config *conf, char *filename)
@@ -714,14 +709,14 @@ static int cfg_include(struct m_config *conf, char *filename)
#define DEF_CONFIG "# Write your default config options here!\n\n\n"
-static void parse_cfgfiles(struct MPContext *mpctx, m_config_t *conf)
+static bool parse_cfgfiles(struct MPContext *mpctx, m_config_t *conf)
{
struct MPOpts *opts = &mpctx->opts;
char *conffile;
int conffile_fd;
if (!(opts->noconfig & 2) &&
m_config_parse_config_file(conf, MPLAYER_CONFDIR "/mplayer.conf") < 0)
- exit_player(mpctx, EXIT_NONE);
+ return false;
if ((conffile = get_path("")) == NULL)
mp_tmsg(MSGT_CPLAYER, MSGL_WARN, "Cannot find HOME directory.\n");
else {
@@ -739,10 +734,11 @@ static void parse_cfgfiles(struct MPContext *mpctx, m_config_t *conf)
}
if (!(opts->noconfig & 1) &&
m_config_parse_config_file(conf, conffile) < 0)
- exit_player(mpctx, EXIT_NONE);
+ return false;
free(conffile);
}
}
+ return true;
}
#define PROFILE_CFG_PROTOCOL "protocol."
@@ -1509,7 +1505,7 @@ void reinit_audio_chain(struct MPContext *mpctx)
&ao->samplerate, &ao->channels, &ao->format)) {
mp_tmsg(MSGT_CPLAYER, MSGL_ERR, "Error at audio filter chain "
"pre-init!\n");
- exit_player(mpctx, EXIT_ERROR);
+ goto init_error;
}
if (!ao->initialized) {
ao->buffersize = opts->ao_buffersize;
@@ -3564,7 +3560,9 @@ static bool process_playlist_demuxer(struct MPContext *mpctx)
static void idle_loop(struct MPContext *mpctx)
{
// ================= idle loop (STOP state) =========================
- while (mpctx->opts.player_idle_mode && !mpctx->playlist->current) {
+ while (mpctx->opts.player_idle_mode && !mpctx->playlist->current
+ && mpctx->stop_play != PT_QUIT)
+ {
uninit_player(mpctx, INITIALIZED_AO | INITIALIZED_VO);
mp_cmd_t *cmd;
while (!(cmd = mp_input_get_cmd(mpctx->input, WAKEUP_PERIOD * 1000,
@@ -3818,7 +3816,7 @@ goto_enable_cache:
}
}
#endif
- goto terminate_playback; // exit_player(_("Fatal error"));
+ goto terminate_playback;
}
/* display clip info */
@@ -4033,7 +4031,12 @@ static void play_files(struct MPContext *mpctx)
{
for (;;) {
idle_loop(mpctx);
+ if (mpctx->stop_play == PT_QUIT)
+ break;
+
play_current_file(mpctx);
+ if (mpctx->stop_play == PT_QUIT)
+ break;
if (!mpctx->stop_play || mpctx->stop_play == AT_END_OF_FILE)
mpctx->stop_play = PT_NEXT_ENTRY;
@@ -4127,7 +4130,7 @@ static bool handle_help_options(struct MPContext *mpctx)
return opt_exit;
}
-static void load_codecs_conf(struct MPContext *mpctx)
+static bool load_codecs_conf(struct MPContext *mpctx)
{
/* Check codecs.conf. */
if (!codecs_file || !parse_codec_cfg(codecs_file)) {
@@ -4135,13 +4138,14 @@ static void load_codecs_conf(struct MPContext *mpctx)
if (!parse_codec_cfg(mem_ptr = get_path("codecs.conf"))) {
if (!parse_codec_cfg(MPLAYER_CONFDIR "/codecs.conf")) {
if (!parse_codec_cfg(NULL))
- exit_player_with_rc(mpctx, EXIT_NONE, 0);
+ return false;
mp_tmsg(MSGT_CPLAYER, MSGL_V,
"Using built-in default codecs.conf.\n");
}
}
free(mem_ptr); // release the buffer created by get_path()
}
+ return true;
}
#ifdef PTW32_STATIC_LIB
@@ -4238,7 +4242,8 @@ int main(int argc, char *argv[])
print_version(false);
print_libav_versions();
- parse_cfgfiles(mpctx, mpctx->mconfig);
+ if (!parse_cfgfiles(mpctx, mpctx->mconfig))
+ exit_player(mpctx, EXIT_NONE, 1);
mpctx->playlist = talloc_struct(mpctx, struct playlist, {0});
if (m_config_parse_mp_command_line(mpctx->mconfig, mpctx->playlist,
@@ -4246,13 +4251,14 @@ int main(int argc, char *argv[])
{
mpctx->playlist->current = mpctx->playlist->first;
} else {
- exit_player(mpctx, EXIT_ERROR);
+ exit_player(mpctx, EXIT_ERROR, 1);
}
- load_codecs_conf(mpctx);
+ if (!load_codecs_conf(mpctx))
+ exit_player(mpctx, EXIT_ERROR, 1);
if (handle_help_options(mpctx))
- exit_player(mpctx, EXIT_NONE);
+ exit_player(mpctx, EXIT_NONE, 1);
mp_msg(MSGT_CPLAYER, MSGL_V, "Configuration: " CONFIGURATION "\n");
mp_tmsg(MSGT_CPLAYER, MSGL_V, "Command line:");
@@ -4264,7 +4270,7 @@ int main(int argc, char *argv[])
// no file/vcd/dvd -> show HELP:
print_version(true);
mp_msg(MSGT_CPLAYER, MSGL_INFO, "%s", mp_gtext(help_text));
- exit_player_with_rc(mpctx, EXIT_NONE, 0);
+ exit_player(mpctx, EXIT_NONE, 0);
}
#ifdef CONFIG_PRIORITY
@@ -4281,7 +4287,7 @@ int main(int argc, char *argv[])
play_files(mpctx);
- exit_player_with_rc(mpctx, EXIT_EOF, 0);
+ exit_player(mpctx, EXIT_EOF, mpctx->quit_player_rc);
return 1;
}
diff --git a/parser-cfg.c b/parser-cfg.c
index f6a4c67d3a..91ef37be53 100644
--- a/parser-cfg.c
+++ b/parser-cfg.c
@@ -41,7 +41,7 @@ static int recursion_depth = 0;
/// Setup the \ref Config from a config file.
/** \param config The config object.
* \param conffile Path to the config file.
- * \return 1 on sucess, -1 on error.
+ * \return 1 on sucess, -1 on error, 0 if file not accessible.
*/
int m_config_parse_config_file(m_config_t *config, const char *conffile)
{