[client] implement stream paused alert

This commit is contained in:
Geoffrey McRae 2018-07-24 01:09:53 +10:00
parent 697dbc7a96
commit 60070e6076
3 changed files with 60 additions and 11 deletions

View File

@ -118,7 +118,7 @@ typedef void (* LG_RendererOnResize )(void * opaque, const int width,
typedef bool (* LG_RendererOnMouseShape)(void * opaque, const LG_RendererCursor cursor, const int width, const int height, const int pitch, const uint8_t * data); typedef bool (* LG_RendererOnMouseShape)(void * opaque, const LG_RendererCursor cursor, const int width, const int height, const int pitch, const uint8_t * data);
typedef bool (* LG_RendererOnMouseEvent)(void * opaque, const bool visible , const int x, const int y); typedef bool (* LG_RendererOnMouseEvent)(void * opaque, const bool visible , const int x, const int y);
typedef bool (* LG_RendererOnFrameEvent)(void * opaque, const LG_RendererFormat format, const uint8_t * data); typedef bool (* LG_RendererOnFrameEvent)(void * opaque, const LG_RendererFormat format, const uint8_t * data);
typedef void (* LG_RendererOnAlert )(void * opaque, const LG_RendererAlert alert, const char * message); typedef void (* LG_RendererOnAlert )(void * opaque, const LG_RendererAlert alert, const char * message, bool ** closeFlag);
typedef bool (* LG_RendererRender )(void * opaque, SDL_Window *window); typedef bool (* LG_RendererRender )(void * opaque, SDL_Window *window);
typedef struct LG_Renderer typedef struct LG_Renderer

View File

@ -540,7 +540,8 @@ int eventFilter(void * userdata, SDL_Event * event)
state.lgr->on_alert( state.lgr->on_alert(
state.lgrData, state.lgrData,
serverMode ? LG_ALERT_SUCCESS : LG_ALERT_WARNING, serverMode ? LG_ALERT_SUCCESS : LG_ALERT_WARNING,
serverMode ? "Capture Enabled" : "Capture Disabled" serverMode ? "Capture Enabled" : "Capture Disabled",
NULL
); );
if (!serverMode) if (!serverMode)
@ -970,6 +971,7 @@ int run()
break; break;
} }
bool *closeAlert = NULL;
while(state.running) while(state.running)
{ {
SDL_Event event; SDL_Event event;
@ -982,6 +984,29 @@ int run()
break; break;
} }
} }
if (closeAlert == NULL)
{
if (state.shm->flags & KVMFR_HEADER_FLAG_PAUSED)
{
if (state.lgr && !params.disableAlerts)
state.lgr->on_alert(
state.lgrData,
LG_ALERT_WARNING,
"Stream Paused",
&closeAlert
);
}
}
else
{
if (!(state.shm->flags & KVMFR_HEADER_FLAG_PAUSED))
{
*closeAlert = true;
closeAlert = NULL;
}
}
usleep(1000); usleep(1000);
} }

View File

@ -43,6 +43,8 @@ Place, Suite 330, Boston, MA 02111-1307 USA
#define ALERT_TEXTURE 2 #define ALERT_TEXTURE 2
#define TEXTURE_COUNT 3 #define TEXTURE_COUNT 3
#define ALERT_TIMEOUT_FLAG ((uint64_t)-1)
#define FADE_TIME 1000000 #define FADE_TIME 1000000
struct Options struct Options
@ -63,9 +65,13 @@ static struct Options defaultOptions =
struct Alert struct Alert
{ {
bool ready;
bool useCloseFlag;
SDL_Surface *text; SDL_Surface *text;
float r, g, b, a; float r, g, b, a;
uint64_t timeout; uint64_t timeout;
bool closeFlag;
}; };
struct Inst struct Inst
@ -343,7 +349,7 @@ bool opengl_on_frame_event(void * opaque, const LG_RendererFormat format, const
return true; return true;
} }
void opengl_on_alert(void * opaque, const LG_RendererAlert alert, const char * message) void opengl_on_alert(void * opaque, const LG_RendererAlert alert, const char * message, bool ** closeFlag)
{ {
struct Inst * this = (struct Inst *)opaque; struct Inst * this = (struct Inst *)opaque;
struct Alert * a = malloc(sizeof(struct Alert)); struct Alert * a = malloc(sizeof(struct Alert));
@ -388,6 +394,12 @@ void opengl_on_alert(void * opaque, const LG_RendererAlert alert, const char * m
return; return;
} }
if (closeFlag)
{
a->useCloseFlag = true;
*closeFlag = &a->closeFlag;
}
ll_push(this->alerts, a); ll_push(this->alerts, a);
} }
@ -534,7 +546,7 @@ bool opengl_render(void * opaque, SDL_Window * window)
struct Alert * alert; struct Alert * alert;
while(ll_peek_head(this->alerts, (void **)&alert)) while(ll_peek_head(this->alerts, (void **)&alert))
{ {
if (alert->timeout == 0) if (!alert->ready)
{ {
surface_to_texture(alert->text, this->textures[ALERT_TEXTURE]); surface_to_texture(alert->text, this->textures[ALERT_TEXTURE]);
@ -566,17 +578,29 @@ bool opengl_render(void * opaque, SDL_Window * window)
glDisable(GL_BLEND); glDisable(GL_BLEND);
glEndList(); glEndList();
if (!alert->useCloseFlag)
alert->timeout = microtime() + 2*1000000; alert->timeout = microtime() + 2*1000000;
alert->ready = true;
SDL_FreeSurface(alert->text); SDL_FreeSurface(alert->text);
alert->text = NULL; alert->text = NULL;
alert->ready = true;
} }
else
{
bool close = false;
if (alert->useCloseFlag)
close = alert->closeFlag;
else if (alert->timeout < microtime()) else if (alert->timeout < microtime())
close = true;
if (close)
{ {
free(alert); free(alert);
ll_shift(this->alerts, NULL); ll_shift(this->alerts, NULL);
continue; continue;
} }
}
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();