paswitch: add robustness
This commit is contained in:
parent
1f36351ab7
commit
da2899f721
28
paswitch.c
28
paswitch.c
@ -196,6 +196,15 @@ app_context_free (struct app_context *self)
|
||||
poller_free (&self->poller);
|
||||
}
|
||||
|
||||
static struct sink *
|
||||
current_sink (struct app_context *ctx)
|
||||
{
|
||||
LIST_FOR_EACH (struct sink, iter, ctx->sinks)
|
||||
if (iter->index == ctx->selected_sink)
|
||||
return iter;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
#define VOLUME_PERCENT(x) (((x) * 100 + PA_VOLUME_NORM / 2) / PA_VOLUME_NORM)
|
||||
@ -260,9 +269,14 @@ on_sink_info (pa_context *context, const pa_sink_info *info, int eol,
|
||||
}
|
||||
if (!info || eol)
|
||||
{
|
||||
// TODO: handle the case of when sinks disappear
|
||||
if (ctx->selected_sink == PA_INVALID_INDEX && ctx->sinks)
|
||||
struct sink *sink = current_sink (ctx);
|
||||
if (!sink && ctx->sinks)
|
||||
{
|
||||
ctx->selected_sink = ctx->sinks->index;
|
||||
ctx->selected_port = -1;
|
||||
}
|
||||
else if (sink && ctx->selected_port >= (ssize_t) sink->ports_len)
|
||||
ctx->selected_port = -1;
|
||||
|
||||
poller_idle_set (&ctx->redraw_event);
|
||||
ctx->reset_sinks = true;
|
||||
@ -304,6 +318,8 @@ update_sinks (struct app_context *ctx)
|
||||
(ctx->context, on_sink_info, ctx));
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
static void
|
||||
forget_sink_inputs (struct app_context *ctx)
|
||||
{
|
||||
@ -358,6 +374,8 @@ on_server_info (pa_context *context, const struct pa_server_info *info,
|
||||
cstr_set (&ctx->default_sink, NULL);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
static void
|
||||
update_server_info (struct app_context *ctx)
|
||||
{
|
||||
@ -600,11 +618,7 @@ on_action (struct app_context *ctx, enum action action)
|
||||
{
|
||||
poller_idle_set (&ctx->redraw_event);
|
||||
|
||||
struct sink *sink = NULL;
|
||||
LIST_FOR_EACH (struct sink, iter, ctx->sinks)
|
||||
if (iter->index == ctx->selected_sink)
|
||||
sink = iter;
|
||||
|
||||
struct sink *sink = current_sink (ctx);
|
||||
switch (action)
|
||||
{
|
||||
case ACTION_UP:
|
||||
|
Loading…
Reference in New Issue
Block a user