if (resource_transport_connect(rif) == DISCONNECTED)
schedule_connect(u, rif);
}
- }
+ }
rif->seqno.request = 1;
rif->nodes.rsetid = pa_hashmap_new(pa_idxset_string_hash_func,
mrp_domctl_table_t *t;
size_t size;
size_t idx;
-
+
pa_assert(u);
pa_assert(table);
pa_assert(columns);
mrp_domctl_watch_t *w;
size_t size;
size_t idx;
-
+
pa_assert(u);
pa_assert(table);
pa_assert(columns);
if (!msg)
pa_log("can't to create new resource message");
-
+
return msg;
}
if (!PUSH_VALUE(msg, ATTRIBUTE_VALUE, SINT8, *v.i32))
return false;
break;
-
+
case mqi_unsignd:
if (sts < 0)
v.u32 = &attr->def.value.unsignd;
if (!PUSH_VALUE(msg, ATTRIBUTE_VALUE, SINT8, *v.u32))
return false;
break;
-
+
case mqi_floating:
if (sts < 0)
v.dbl = &attr->def.value.floating;
PA_LLIST_FOREACH_SAFE(req, n, rif->reqs) {
if (req->seqno <= seqno) {
nodidx = req->nodidx;
-
+
if (req->reqid == reqid) {
PA_LLIST_REMOVE(resource_request, rif->reqs, req);
pa_xfree(req);
}
-
+
if (!(node = mir_node_find_by_index(u, nodidx))) {
if (reqid != RESPROTO_DESTROY_RESOURCE_SET) {
pa_log("got response (reqid:%u seqno:%u) but can't "
pa_log_debug("got response (reqid:%u seqno:%u "
"node:'%s')", reqid, seqno,
node ? node->amname : "<unknown>");
-
+
switch (reqid) {
case RESPROTO_CREATE_RESOURCE_SET:
resource_set_create_response(u, node, msg, &curs);
}
node->rsetid = pa_sprintf_malloc("%d", rsetid);
-
+
if (pa_murphyif_add_node(u, node) == 0) {
pa_log_debug("resource set was successfully created");
mir_node_print(node, buf, sizeof(buf));
struct userdata *u = (struct userdata *)data;
pa_murphyif *murphyif;
resource_interface *rif;
-
+
int state;
pa_assert(u);
case CONNECTED:
cancel_schedule(u, rif);
break;
-
+
case DISCONNECTED:
schedule_connect(u, rif);
break;
pa_assert(node);
pa_assert(rset);
pa_assert(rset->policy);
-
+
if (pa_streq(rset->policy, "relaxed"))
req = PA_STREAM_RUN;
pa_assert(pid);
pa_assert(node || rset);
pa_assert_se((murphyif = u->murphyif));
-
+
rif = &murphyif->resource;
ph = pa_xnew0(pid_hash, 1);
pa_assert(u);
pa_assert(pid);
pa_assert(murphyif = u->murphyif);
-
+
rif = &murphyif->resource;
if ((ph = pa_hashmap_get(rif->nodes.pid, pid)))
pa_assert(u);
pa_assert(pid);
pa_assert(murphyif = u->murphyif);
-
+
rif = &murphyif->resource;
if ((ph = pa_hashmap_get(rif->nodes.pid, pid)))
pa_assert(rsetid);
pa_assert(node);
pa_assert_se((murphyif = u->murphyif));
-
+
rif = &murphyif->resource;
if ((rh = pa_hashmap_get(rif->nodes.rsetid, rsetid))) {
pa_assert(u);
pa_assert(rsetid);
pa_assert(murphyif = u->murphyif);
-
+
rif = &murphyif->resource;
if ((rh = pa_hashmap_get(rif->nodes.rsetid, rsetid)))
pa_assert(u);
pa_assert(node);
pa_assert_se((core = u->core));
-
+
if (node->implement == mir_stream && node->paidx != PA_IDXSET_INVALID) {
if (node->direction == mir_input) {
if ((i = pa_idxset_get_by_index(core->sink_inputs, node->paidx)))
pa_proplist *pl;
pa_assert(u);
-
+
if (node && (pl = get_node_proplist(u, node)))
return pa_proplist_gets(pl, PA_PROP_APPLICATION_PROCESS_ID);
static bool compare_bridge(lua_State *, void *, const char *,
mrp_funcbridge_value_t *, char *,
mrp_funcbridge_value_t *);
+static bool change_bridge(lua_State *, void *, const char *,
+ mrp_funcbridge_value_t *, char *,
+ mrp_funcbridge_value_t *);
static int apclass_create(lua_State *);
static int apclass_getfield(lua_State *);
f = luaL_checkstring(L, 2);
luaL_error(L, "attempt to set '%s' field of read-only mdb.import", f);
-
+
MRP_LUA_LEAVE(0);
}
pa_assert(imp->update);
pa_assert_se((ptval = imp->values));
pa_assert_se((prow = ptval->array));
-
+
maxrow = -ptval->type;
maxcol = imp->columns->nstring;
arr = (pa_value *)luaL_checkudata(L, 1, ARRAY_CLASSID);
pa_assert(arr->type < 0);
-
+
dimension = -arr->type;
key_type = lua_type(L, 2);
-
+
switch (key_type) {
case LUA_TNUMBER:
idx = lua_tointeger(L, 2) - 1;
#if 0
static void array_destroy(void *data)
{
- pa_value *value = (pa_value *)data;
+ pa_value *value = (pa_value *)data;
MRP_LUA_ENTER;
pa_assert(u);
pa_assert(node);
-
+
pa_assert_se((scripting = u->scripting));
pa_assert_se((L = scripting->L));
const char *f;
MRP_LUA_ENTER;
-
+
f = luaL_checkstring(L, 2);
luaL_error(L, "attempt to set '%s' field of read-only node", f);
f = luaL_checkstring(L, 2);
luaL_error(L, "attempt to set '%s' field of read-only zone", f);
-
+
MRP_LUA_LEAVE(0);
}
MRP_LUA_ENTER;
pa_xfree((void *)zone->name);
-
+
zone->name = NULL;
MRP_LUA_LEAVE_NOARG;
f = luaL_checkstring(L, 2);
luaL_error(L, "attempt to set '%s' field of read-only resource_class", f);
-
+
MRP_LUA_LEAVE(0);
}
resource_names_destroy(res->name);
attributes_destroy(res->attributes);
-
+
res->name = NULL;
res->attributes = NULL;
f = luaL_checkstring(L, 2);
luaL_error(L, "attempt to set '%s' field of read-only routing_group", f);
-
+
MRP_LUA_LEAVE(0);
}
}
+static bool change_bridge(lua_State *L, void *data,
+ const char *signature, mrp_funcbridge_value_t *args,
+ char *ret_type, mrp_funcbridge_value_t *ret_val)
+{
+ mir_change_value_t change;
+ scripting_import *imp;
+ struct userdata *u;
+ bool success;
+ const char *s = "default";
+
+ (void)L;
+
+ pa_assert(signature);
+ pa_assert(args);
+ pa_assert(ret_type);
+ pa_assert(ret_val);
+
+ pa_assert_se((change = (mir_change_value_t)data));
+
+ if (strcmp(signature, "o"))
+ success = false;
+ else {
+ pa_assert_se((imp = args[0].pointer));
+ pa_assert_se((u = imp->userdata));
+
+ /* FIXME: is this how it is supposed to be done?! */
+
+ if (imp->values && imp->values->array && imp->values->array[0] &&
+ imp->values->array[0]->array &&
+ imp->values->array[0]->array[0] &&
+ imp->values->array[0]->array[0]->type == pa_value_string)
+ pa_assert_se((s = imp->values->array[0]->array[0]->string));
+
+ success = true;
+ *ret_type = MRP_FUNCBRIDGE_NO_DATA;
+ memset(ret_val, 0, sizeof(mrp_funcbridge_value_t));
+ change(u, s);
+ }
+
+ return success;
+}
+
+
static int apclass_create(lua_State *L)
{
struct userdata *u;
make_id(name, sizeof(name), "%s", mir_node_type_str(type));
- mir_router_assign_class_priority(u, type, priority);
+ mir_router_assign_class_priority(u, type, priority);
ir = or = true;
f = luaL_checkstring(L, 2);
luaL_error(L,"attempt to set '%s' field of read-only application class",f);
-
+
MRP_LUA_LEAVE(0);
}
route_definition_push(L, rt->input);
lua_settable(L, -3);
}
-
+
if (rt->output) {
lua_pushstring(L, "output");
route_definition_push(L, rt->output);
}
else if (correct) {
/* *(double **)vlim->args = limit->value; */
-
+
memcpy(vlim->args, &limit->value, sizeof(limit->value));
}
f = luaL_checkstring(L, 2);
luaL_error(L, "attempt to set '%s' field of read-only volume_limit", f);
-
+
MRP_LUA_LEAVE(0);
}
for (i = 0; i < len; i++) {
lua_pushnumber(L, (int)(i+1));
lua_gettable(L, idx);
-
+
val = luaL_checkint(L, -1);
-
+
lua_pop(L, 1);
-
+
if (val < min || val >= max)
- luaL_error(L, "array [%u]: out of range value (%d)", i, val);
-
+ luaL_error(L, "array [%u]: out of range value (%d)", i, val);
+
arr->ints[i] = val;
}
}
def = lua_gettop(L);
attr->def.name = pa_xstrdup(fldnam);
-
+
if ((len = luaL_getn(L, def)) != 3)
luaL_error(L, "invalid attribute definition '%s'", fldnam);
m->needres = FALSE;
m->role = mrp_strdup(lua_tostring(L, def));
break;
-
+
case LUA_TTABLE:
m->needres = true;
case 10:
if (!strcmp(name, "attributes"))
return ATTRIBUTES;
- break;
+ break;
case 11:
if (!strcmp(name, "autorelease"))
return AUTORELEASE;
if (!strcmp(name, "description"))
return DESCRIPTION;
- break;
+ break;
default:
break;
{"compare_phone" ,"ooo", compare_bridge ,mir_router_phone_compare },
{"volume_supress" ,"odo", calculate_bridge,mir_volume_suppress },
{"volume_correct" ,"odo", calculate_bridge,mir_volume_correction },
+ {"change_volume_context","o",change_bridge,mir_volume_change_context},
{ NULL , NULL, NULL , NULL }
};
return 0;
}
-
+
/*
* Local Variables:
* c-basic-offset: 4
#include <pulsecore/pulsecore-config.h>
+#include <pulsemodule/modules/main-volume-policy/main-volume-policy.h>
+
#include <pulse/proplist.h>
#include <pulsecore/core-util.h>
#include <pulsecore/module.h>
return attenuation;
}
-
+
double mir_volume_suppress(struct userdata *u, int class, mir_node *node,
void *arg)
return 0.0;
}
+void mir_volume_change_context(struct userdata *u, const char *volume_class)
+{
+ pa_main_volume_policy *policy;
+ pa_main_volume_context *ctx;
+
+ pa_assert(u);
+
+ if (!volume_class) {
+ pa_log_error("no volume class set");
+ return;
+ }
+
+ policy = pa_main_volume_policy_get(u->core);
+
+ /* see if there is a context available that maps to the volume class */
+
+ ctx = (pa_main_volume_context *) pa_hashmap_get(policy->main_volume_contexts, volume_class);
+
+ if (ctx) {
+ pa_main_volume_policy_set_active_main_volume_context(policy, ctx);
+ pa_log_debug("volume context changed to: '%s'", volume_class);
+ }
+
+ /* TODO: change volume class here */
+}
+
static void add_to_table(vlim_table *tbl, mir_volume_func_t func, void *arg)
{
size_t size;
static void destroy_table(vlim_table *tbl)
{
pa_assert(tbl);
-
+
free(tbl->entries);
}
}
else {
mask = ((uint32_t)1) << (class - mir_application_class_begin);
-
+
if (class < volume->classlen && volume->classlim[class].nentry > 0) {
if (!(vlim->clmask & mask)) {