mirror of https://github.com/mpv-player/mpv
client API: include the reason in MPV_EVENT_END_FILE
Otherwise, the client API user could not know why playback was stopped. Regarding the fact that 0 is used both for normal EOF and EOF on error: this is because mplayer traditionally did not distinguish these, and in general it's hard to tell the real reason. (There are various weird corner cases which make it hard.)
This commit is contained in:
parent
d3e9f51c71
commit
86094c2c5a
|
@ -817,6 +817,7 @@ typedef enum mpv_event_id {
|
|||
MPV_EVENT_START_FILE = 6,
|
||||
/**
|
||||
* Notification after playback end (after the file was unloaded).
|
||||
* See also mpv_event and mpv_event_end_file.
|
||||
*/
|
||||
MPV_EVENT_END_FILE = 7,
|
||||
/**
|
||||
|
@ -1000,6 +1001,18 @@ typedef struct mpv_event_pause_reason {
|
|||
int by_keep_open;
|
||||
} mpv_event_pause_reason;
|
||||
|
||||
typedef struct mpv_event_end_file {
|
||||
/**
|
||||
* Identifies the reason why playback was stopped:
|
||||
* 0: the end of the file was reached or initialization failed
|
||||
* 1: the file is restarted (e.g. edition switching)
|
||||
* 2: playback was aborted by an external action (e.g. playlist controls)
|
||||
* 3: the player received the quit command
|
||||
* Other values should be treated as unknown.
|
||||
*/
|
||||
int reason;
|
||||
} mpv_event_end_file;
|
||||
|
||||
typedef struct mpv_event_script_input_dispatch {
|
||||
/**
|
||||
* Arbitrary integer value that was provided as argument to the
|
||||
|
@ -1054,6 +1067,7 @@ typedef struct mpv_event {
|
|||
* MPV_EVENT_UNPAUSE: mpv_event_pause_reason*
|
||||
* MPV_EVENT_SCRIPT_INPUT_DISPATCH: mpv_event_script_input_dispatch*
|
||||
* MPV_EVENT_CLIENT_MESSAGE: mpv_event_client_message*
|
||||
* MPV_EVENT_END_FILE: mpv_event_end_file*
|
||||
* other: NULL
|
||||
*
|
||||
* Note: future enhancements might add new event structs for existing or new
|
||||
|
|
|
@ -393,6 +393,9 @@ static void dup_event_data(struct mpv_event *ev)
|
|||
ev->data = msg;
|
||||
break;
|
||||
}
|
||||
case MPV_EVENT_END_FILE:
|
||||
ev->data = talloc_memdup(NULL, ev->data, sizeof(mpv_event_end_file));
|
||||
break;
|
||||
default:
|
||||
// Doesn't use events with memory allocation.
|
||||
if (ev->data)
|
||||
|
|
|
@ -1421,7 +1421,18 @@ terminate_playback: // don't jump here after ao/vo/getch initialization!
|
|||
}
|
||||
|
||||
mp_notify(mpctx, MPV_EVENT_TRACKS_CHANGED, NULL);
|
||||
mp_notify(mpctx, MPV_EVENT_END_FILE, NULL);
|
||||
struct mpv_event_end_file end_event = {0};
|
||||
switch (mpctx->stop_play) {
|
||||
case AT_END_OF_FILE: end_event.reason = 0; break;
|
||||
case PT_RESTART:
|
||||
case PT_RELOAD_DEMUXER: end_event.reason = 1; break;
|
||||
case PT_NEXT_ENTRY:
|
||||
case PT_CURRENT_ENTRY:
|
||||
case PT_STOP: end_event.reason = 2; break;
|
||||
case PT_QUIT: end_event.reason = 3; break;
|
||||
default: end_event.reason = -1; break;
|
||||
};
|
||||
mp_notify(mpctx, MPV_EVENT_END_FILE, &end_event);
|
||||
}
|
||||
|
||||
// Determine the next file to play. Note that if this function returns non-NULL,
|
||||
|
|
Loading…
Reference in New Issue