本文整理汇总了C++中pa_log_debug函数的典型用法代码示例。如果您正苦于以下问题:C++ pa_log_debug函数的具体用法?C++ pa_log_debug怎么用?C++ pa_log_debug使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pa_log_debug函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: process_render
static void process_render(struct context *context, pa_usec_t now)
{
pa_memchunk chunk;
int request_bytes;
pa_assert(context);
if (context->got_max_latency)
{
return;
}
pa_log_debug("process_render: u->block_usec %lu", context->block_usec);
while (context->timestamp < now + context->block_usec)
{
request_bytes = context->sink->thread_info.max_request;
request_bytes = MIN(request_bytes, 16 * 1024);
pa_sink_render(context->sink, request_bytes, &chunk);
pa_log("process_render: %lu bytes", chunk.length);
data_send(context, &chunk);
pa_memblock_unref(chunk.memblock);
context->timestamp += pa_bytes_to_usec(chunk.length, &context->sink->sample_spec);
}
}
开发者ID:vworkspace,项目名称:FreeRDS,代码行数:24,代码来源:module-freerds-sink.c
示例2: register_object
static void register_object(struct pa_policy_object *object,
enum pa_policy_object_type type,
const char *name, void *ptr, int lineno)
{
const char *type_str;
if (object->type == type && object->match.method(name,&object->match.arg)){
type_str = object_type_str(type);
if (object->ptr != NULL) {
pa_log("multiple match for %s '%s' (line %d in config file)",
type_str, name, lineno);
}
else {
pa_log_debug("registering context-rule for %s '%s' "
"(line %d in config file)", type_str, name, lineno);
object->ptr = ptr;
object->index = object_index(type, ptr);
}
}
}
开发者ID:alinelena,项目名称:pulseaudio-policy-enforcement,代码行数:24,代码来源:context.c
示例3: handle_removed_sink_input
static void handle_removed_sink_input(struct userdata *u,
struct pa_sink_input *sinp)
{
struct pa_policy_group *group = NULL;
struct pa_sink_input_ext *ext;
struct pa_sink *sink;
uint32_t idx;
const char *snam;
uint32_t flags;
if (sinp && u) {
idx = sinp->index;
sink = sinp->sink;
snam = sink_input_ext_get_name(sinp->proplist);
pa_assert_se((group = get_group_or_classify(u, sinp, &flags)));
if (flags & PA_POLICY_LOCAL_ROUTE)
pa_sink_ext_restore_port(u, sink);
if (flags & PA_POLICY_LOCAL_MUTE)
pa_policy_groupset_restore_volume(u, sink);
pa_policy_context_unregister(u, pa_policy_object_sink_input,
snam, sinp, sinp->index);
pa_policy_group_remove_sink_input(u, sinp->index);
if ((ext = pa_index_hash_remove(u->hsi, idx)) == NULL)
pa_log("no extension found for sink-input '%s' (idx=%u)",snam,idx);
else {
pa_xfree(ext);
}
pa_log_debug("removed sink_input '%s' (idx=%d) (group=%s)",
snam, idx, group->name);
}
}
开发者ID:jusa,项目名称:pulseaudio-policy-enforcement,代码行数:36,代码来源:sink-input-ext.c
示例4: perform_activity_action
/* force_state can be -1 - do not force , 0 force inactive, 1 force active */
static int perform_activity_action(pa_sink *sink, struct pa_policy_activity_variable *var, int force_state) {
struct pa_policy_context_rule *rule;
union pa_policy_context_action *actn;
int is_opened;
pa_assert(sink);
if ((force_state != -1 && force_state == 1) ||
(force_state == -1 && PA_SINK_IS_OPENED(pa_sink_get_state(sink)))) {
rule = var->active_rules;
is_opened = 1;
} else {
rule = var->inactive_rules;
is_opened = 0;
}
for ( ; rule != NULL; rule = rule->next) {
if (rule->match.method(sink->name, &rule->match.arg)) {
if (force_state == -1 && var->sink_opened != -1 && var->sink_opened == is_opened) {
pa_log_debug("Already executed actions for state change, skip.");
return 1;
}
var->sink_opened = is_opened;
for (actn = rule->actions; actn; actn = actn->any.next)
{
if (!perform_action(var->userdata, actn, NULL))
pa_log("Failed to perform activity action.");
}
}
}
return 1;
}
开发者ID:alinelena,项目名称:pulseaudio-policy-enforcement,代码行数:37,代码来源:context.c
示例5: process
static pa_hook_result_t process(struct userdata *u, pa_proplist *p) {
struct rule *r;
time_t now;
const char *pn;
pa_assert(u);
pa_assert(p);
if (!(pn = pa_proplist_gets(p, PA_PROP_APPLICATION_PROCESS_BINARY)))
return PA_HOOK_OK;
if (*pn == '.' || strchr(pn, '/'))
return PA_HOOK_OK;
time(&now);
pa_log_debug("Looking for .desktop file for %s", pn);
if ((r = pa_hashmap_get(u->cache, pn))) {
if (now-r->timestamp > STAT_INTERVAL) {
r->timestamp = now;
update_rule(r);
}
} else {
make_room(u->cache);
r = pa_xnew0(struct rule, 1);
r->process_name = pa_xstrdup(pn);
r->timestamp = now;
pa_hashmap_put(u->cache, r->process_name, r);
update_rule(r);
}
apply_rule(r, p);
return PA_HOOK_OK;
}
开发者ID:plbossart,项目名称:pulseaudio,代码行数:36,代码来源:module-augment-properties.c
示例6: sink_update_requested_latency_cb
static void sink_update_requested_latency_cb(pa_sink *s)
{
struct context *context;
size_t nbytes;
pa_sink_assert_ref(s);
pa_assert_se(context = s->userdata);
context->block_usec = BLOCK_USEC;
//context->block_usec = pa_sink_get_requested_latency_within_thread(s);
pa_log("1 block_usec %lu", context->block_usec);
context->got_max_latency = 0;
if (context->block_usec == (pa_usec_t) -1)
{
context->block_usec = s->thread_info.max_latency;
pa_log_debug("2 block_usec %lu", context->block_usec);
context->got_max_latency = 1;
}
nbytes = pa_usec_to_bytes(context->block_usec, &s->sample_spec);
pa_sink_set_max_rewind_within_thread(s, nbytes);
pa_sink_set_max_request_within_thread(s, nbytes);
}
开发者ID:vworkspace,项目名称:FreeRDS,代码行数:24,代码来源:module-freerds-sink.c
示例7: streams_add
static void streams_add(struct pa_classify_stream_def **defs, const char *prop,
enum pa_classify_method method, const char *arg, const char *clnam,
const char *sname, uid_t uid, const char *exe, const char *group, uint32_t flags)
{
struct pa_classify_stream_def *d;
struct pa_classify_stream_def *prev;
pa_proplist *proplist = NULL;
char method_def[256];
pa_assert(defs);
pa_assert(group);
proplist = pa_proplist_new();
if (prop && arg && (method == pa_method_equals)) {
pa_proplist_sets(proplist, prop, arg);
}
if ((d = streams_find(defs, proplist, clnam, sname, uid, exe, &prev)) != NULL) {
pa_log_info("redefinition of stream");
pa_xfree(d->group);
}
else {
d = pa_xnew0(struct pa_classify_stream_def, 1);
snprintf(method_def, sizeof(method_def), "<no-property-check>");
if (prop && arg && method > pa_method_min && method < pa_method_max) {
d->prop = pa_xstrdup(prop);
switch (method) {
case pa_method_equals:
snprintf(method_def, sizeof(method_def),
"%s equals:%s", prop, arg);
d->method = pa_classify_method_equals;
d->arg.string = pa_xstrdup(arg);
break;
case pa_method_startswith:
snprintf(method_def, sizeof(method_def),
"%s startswith:%s",prop, arg);
d->method = pa_classify_method_startswith;
d->arg.string = pa_xstrdup(arg);
break;
case pa_method_matches:
snprintf(method_def, sizeof(method_def),
"%s matches:%s",prop, arg);
d->method = pa_classify_method_matches;
if (regcomp(&d->arg.rexp, arg, 0) != 0) {
pa_log("%s: invalid regexp definition '%s'",
__FUNCTION__, arg);
pa_assert_se(0);
}
break;
case pa_method_true:
snprintf(method_def, sizeof(method_def), "%s true", prop);
d->method = pa_classify_method_true;
memset(&d->arg, 0, sizeof(d->arg));
break;
default:
/* never supposed to get here. just keep the compiler happy */
pa_assert_se(0);
break;
}
}
d->uid = uid;
d->exe = exe ? pa_xstrdup(exe) : NULL;
d->clnam = clnam ? pa_xstrdup(clnam) : NULL;
d->sname = sname ? pa_xstrdup(sname) : NULL;
d->sact = sname ? 0 : -1;
prev->next = d;
pa_log_debug("stream added (%d|%s|%s|%s|%d)", uid, exe?exe:"<null>",
clnam?clnam:"<null>", method_def, d->sact);
}
d->group = pa_xstrdup(group);
d->flags = flags;
pa_proplist_free(proplist);
}
开发者ID:jusa,项目名称:pulseaudio-policy-enforcement,代码行数:88,代码来源:classify.c
示例8: thread_func
static void thread_func(void *userdata) {
struct userdata *u = userdata;
int read_type = 0;
pa_assert(u);
pa_log_debug("Thread starting up");
pa_thread_mq_install(&u->thread_mq);
for (;;) {
int ret;
struct pollfd *pollfd;
pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL);
/* Try to read some data and pass it on to the source driver */
if (u->source->thread_info.state == PA_SOURCE_RUNNING && pollfd->revents) {
ssize_t l;
void *p;
if (!u->memchunk.memblock) {
u->memchunk.memblock = pa_memblock_new(u->core->mempool, pa_pipe_buf(u->fd));
u->memchunk.index = u->memchunk.length = 0;
}
pa_assert(pa_memblock_get_length(u->memchunk.memblock) > u->memchunk.index);
p = pa_memblock_acquire(u->memchunk.memblock);
l = pa_read(u->fd, (uint8_t*) p + u->memchunk.index, pa_memblock_get_length(u->memchunk.memblock) - u->memchunk.index, &read_type);
pa_memblock_release(u->memchunk.memblock);
pa_assert(l != 0); /* EOF cannot happen, since we opened the fifo for both reading and writing */
if (l < 0) {
if (errno == EINTR)
continue;
else if (errno != EAGAIN) {
pa_log("Failed to read data from FIFO: %s", pa_cstrerror(errno));
goto fail;
}
} else {
u->memchunk.length = (size_t) l;
pa_source_post(u->source, &u->memchunk);
u->memchunk.index += (size_t) l;
if (u->memchunk.index >= pa_memblock_get_length(u->memchunk.memblock)) {
pa_memblock_unref(u->memchunk.memblock);
pa_memchunk_reset(&u->memchunk);
}
pollfd->revents = 0;
}
}
/* Hmm, nothing to do. Let's sleep */
pollfd->events = (short) (u->source->thread_info.state == PA_SOURCE_RUNNING ? POLLIN : 0);
if ((ret = pa_rtpoll_run(u->rtpoll)) < 0)
goto fail;
if (ret == 0)
goto finish;
pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL);
if (pollfd->revents & ~POLLIN) {
pa_log("FIFO shutdown.");
goto fail;
}
}
fail:
/* If this was no regular exit from the loop we have to continue
* processing messages until we received PA_MESSAGE_SHUTDOWN */
pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL);
pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
finish:
pa_log_debug("Thread shutting down");
}
开发者ID:plbossart,项目名称:pulseaudio,代码行数:84,代码来源:module-pipe-source.c
示例9: line_callback
static void line_callback(pa_ioline *line, const char *s, void *userdata) {
char *delimpos;
char *s2, *s2p;
pa_rtsp_client *c = userdata;
pa_assert(line);
pa_assert(c);
pa_assert(c->callback);
if (!s) {
/* Keep the ioline/iochannel open as they will be freed automatically */
c->ioline = NULL;
c->callback(c, STATE_DISCONNECTED, NULL, c->userdata);
return;
}
s2 = pa_xstrdup(s);
/* Trim trailing carriage returns */
s2p = s2 + strlen(s2) - 1;
while (s2p >= s2 && '\r' == *s2p) {
*s2p = '\0';
s2p -= 1;
}
if (c->waiting && 0 == strcmp("RTSP/1.0 200 OK", s2)) {
c->waiting = 0;
if (c->response_headers)
pa_headerlist_free(c->response_headers);
c->response_headers = pa_headerlist_new();
goto exit;
}
if (c->waiting) {
pa_log_warn("Unexpected response: %s", s2);
goto exit;;
}
if (!strlen(s2)) {
/* End of headers */
/* We will have a header left from our looping iteration, so add it in :) */
if (c->last_header) {
char *tmp = pa_strbuf_tostring_free(c->header_buffer);
/* This is not a continuation header so let's dump it into our proplist */
pa_headerlist_puts(c->response_headers, c->last_header, tmp);
pa_xfree(tmp);
pa_xfree(c->last_header);
c->last_header = NULL;
c->header_buffer = NULL;
}
pa_log_debug("Full response received. Dispatching");
headers_read(c);
c->waiting = 1;
goto exit;
}
/* Read and parse a header (we know it's not empty) */
/* TODO: Move header reading into the headerlist. */
/* If the first character is a space, it's a continuation header */
if (c->last_header && ' ' == s2[0]) {
pa_assert(c->header_buffer);
/* Add this line to the buffer (sans the space. */
pa_strbuf_puts(c->header_buffer, &(s2[1]));
goto exit;
}
if (c->last_header) {
char *tmp = pa_strbuf_tostring_free(c->header_buffer);
/* This is not a continuation header so let's dump the full
header/value into our proplist */
pa_headerlist_puts(c->response_headers, c->last_header, tmp);
pa_xfree(tmp);
pa_xfree(c->last_header);
c->last_header = NULL;
c->header_buffer = NULL;
}
delimpos = strstr(s2, ":");
if (!delimpos) {
pa_log_warn("Unexpected response when expecting header: %s", s);
goto exit;
}
pa_assert(!c->header_buffer);
pa_assert(!c->last_header);
c->header_buffer = pa_strbuf_new();
if (strlen(delimpos) > 1) {
/* Cut our line off so we can copy the header name out */
*delimpos++ = '\0';
/* Trim the front of any spaces */
while (' ' == *delimpos)
++delimpos;
pa_strbuf_puts(c->header_buffer, delimpos);
} else {
/* Cut our line off so we can copy the header name out */
*delimpos = '\0';
}
//.........这里部分代码省略.........
开发者ID:almosthappy4u,项目名称:PulseAudio-UCM,代码行数:101,代码来源:rtsp_client.c
示例10: trigger
static int trigger(struct userdata *u, pa_bool_t quick) {
int enable_bits = 0, zero = 0;
pa_assert(u);
if (u->fd < 0)
return 0;
pa_log_debug("trigger");
if (u->source && PA_SOURCE_IS_OPENED(u->source->thread_info.state))
enable_bits |= PCM_ENABLE_INPUT;
if (u->sink && PA_SINK_IS_OPENED(u->sink->thread_info.state))
enable_bits |= PCM_ENABLE_OUTPUT;
pa_log_debug("trigger: %i", enable_bits);
if (u->use_mmap) {
if (!quick)
ioctl(u->fd, SNDCTL_DSP_SETTRIGGER, &zero);
#ifdef SNDCTL_DSP_HALT
if (enable_bits == 0)
if (ioctl(u->fd, SNDCTL_DSP_HALT, NULL) < 0)
pa_log_warn("SNDCTL_DSP_HALT: %s", pa_cstrerror(errno));
#endif
if (ioctl(u->fd, SNDCTL_DSP_SETTRIGGER, &enable_bits) < 0)
pa_log_warn("SNDCTL_DSP_SETTRIGGER: %s", pa_cstrerror(errno));
if (u->sink && !(enable_bits & PCM_ENABLE_OUTPUT)) {
pa_log_debug("clearing playback buffer");
pa_silence_memory(u->out_mmap, u->out_hwbuf_size, &u->sink->sample_spec);
}
} else {
if (enable_bits)
if (ioctl(u->fd, SNDCTL_DSP_POST, NULL) < 0)
pa_log_warn("SNDCTL_DSP_POST: %s", pa_cstrerror(errno));
if (!quick) {
/*
* Some crappy drivers do not start the recording until we
* read something. Without this snippet, poll will never
* register the fd as ready.
*/
if (u->source && PA_SOURCE_IS_OPENED(u->source->thread_info.state)) {
uint8_t *buf = pa_xnew(uint8_t, u->in_fragment_size);
if (pa_read(u->fd, buf, u->in_fragment_size, NULL) < 0) {
pa_log("pa_read() failed: %s", pa_cstrerror(errno));
pa_xfree(buf);
return -1;
}
pa_xfree(buf);
}
}
}
return 0;
}
开发者ID:Thread974,项目名称:pa,代码行数:67,代码来源:module-oss.c
示例11: sink_input_process_msg_cb
/* Called from output thread context */
static int sink_input_process_msg_cb(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) {
struct userdata *u = PA_SINK_INPUT(obj)->userdata;
switch (code) {
case PA_SINK_INPUT_MESSAGE_GET_LATENCY: {
pa_usec_t *r = data;
pa_sink_input_assert_io_context(u->sink_input);
*r = pa_bytes_to_usec(pa_memblockq_get_length(u->memblockq), &u->sink_input->sample_spec);
/* Fall through, the default handler will add in the extra
* latency added by the resampler */
break;
}
case SINK_INPUT_MESSAGE_POST:
pa_sink_input_assert_io_context(u->sink_input);
if (PA_SINK_IS_OPENED(u->sink_input->sink->thread_info.state))
pa_memblockq_push_align(u->memblockq, chunk);
else
pa_memblockq_flush_write(u->memblockq, TRUE);
update_min_memblockq_length(u);
/* Is this the end of an underrun? Then let's start things
* right-away */
if (!u->in_pop &&
u->sink_input->thread_info.underrun_for > 0 &&
pa_memblockq_is_readable(u->memblockq)) {
pa_log_debug("Requesting rewind due to end of underrun.");
pa_sink_input_request_rewind(u->sink_input,
(size_t) (u->sink_input->thread_info.underrun_for == (size_t) -1 ? 0 : u->sink_input->thread_info.underrun_for),
FALSE, TRUE, FALSE);
}
u->recv_counter += (int64_t) chunk->length;
return 0;
case SINK_INPUT_MESSAGE_REWIND:
pa_sink_input_assert_io_context(u->sink_input);
if (PA_SINK_IS_OPENED(u->sink_input->sink->thread_info.state))
pa_memblockq_seek(u->memblockq, -offset, PA_SEEK_RELATIVE, TRUE);
else
pa_memblockq_flush_write(u->memblockq, TRUE);
u->recv_counter -= offset;
update_min_memblockq_length(u);
return 0;
case SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT: {
size_t length;
update_min_memblockq_length(u);
length = pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq);
u->latency_snapshot.recv_counter = u->recv_counter;
u->latency_snapshot.sink_input_buffer =
pa_memblockq_get_length(u->memblockq) +
(u->sink_input->thread_info.resampler ? pa_resampler_request(u->sink_input->thread_info.resampler, length) : length);
u->latency_snapshot.sink_latency = pa_sink_get_latency_within_thread(u->sink_input->sink);
u->latency_snapshot.max_request = pa_sink_input_get_max_request(u->sink_input);
u->latency_snapshot.min_memblockq_length = u->min_memblockq_length;
u->min_memblockq_length = (size_t) -1;
return 0;
}
case SINK_INPUT_MESSAGE_MAX_REQUEST_CHANGED: {
/* This message is sent from the IO thread to the main
* thread! So don't be confused. All the user cases above
* are executed in thread context, but this one is not! */
pa_assert_ctl_context();
if (u->time_event)
adjust_rates(u);
return 0;
}
}
return pa_sink_input_process_msg(obj, code, data, offset, chunk);
}
开发者ID:freedesktop-unofficial-mirror,项目名称:pulseaudio__pulseaudio.git.backup,代码行数:96,代码来源:module-loopback.c
示例12: pa_context_connect
int pa_context_connect(
pa_context *c,
const char *server,
pa_context_flags_t flags,
const pa_spawn_api *api) {
int r = -1;
pa_assert(c);
pa_assert(PA_REFCNT_VALUE(c) >= 1);
PA_CHECK_VALIDITY(c, !pa_detect_fork(), PA_ERR_FORKED);
PA_CHECK_VALIDITY(c, c->state == PA_CONTEXT_UNCONNECTED, PA_ERR_BADSTATE);
PA_CHECK_VALIDITY(c, !(flags & ~(PA_CONTEXT_NOAUTOSPAWN|PA_CONTEXT_NOFAIL)), PA_ERR_INVALID);
PA_CHECK_VALIDITY(c, !server || *server, PA_ERR_INVALID);
if (server)
c->conf->autospawn = FALSE;
else
server = c->conf->default_server;
pa_context_ref(c);
c->no_fail = !!(flags & PA_CONTEXT_NOFAIL);
c->server_specified = !!server;
pa_assert(!c->server_list);
if (server) {
if (!(c->server_list = pa_strlist_parse(server))) {
pa_context_fail(c, PA_ERR_INVALIDSERVER);
goto finish;
}
} else {
char *d;
/* Prepend in reverse order */
/* Follow the X display */
if (c->conf->auto_connect_display) {
if ((d = getenv("DISPLAY"))) {
d = pa_xstrndup(d, strcspn(d, ":"));
if (*d)
c->server_list = pa_strlist_prepend(c->server_list, d);
pa_xfree(d);
}
}
/* Add TCP/IP on the localhost */
if (c->conf->auto_connect_localhost) {
c->server_list = pa_strlist_prepend(c->server_list, "tcp6:[::1]");
c->server_list = pa_strlist_prepend(c->server_list, "tcp4:127.0.0.1");
}
/* The system wide instance via PF_LOCAL */
c->server_list = pa_strlist_prepend(c->server_list, PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_NATIVE_DEFAULT_UNIX_SOCKET);
/* The user instance via PF_LOCAL */
c->server_list = prepend_per_user(c->server_list);
}
/* Set up autospawning */
if (!(flags & PA_CONTEXT_NOAUTOSPAWN) && c->conf->autospawn) {
#ifdef HAVE_GETUID
if (getuid() == 0)
pa_log_debug("Not doing autospawn since we are root.");
else {
c->do_autospawn = TRUE;
if (api)
c->spawn_api = *api;
}
#endif
}
pa_context_set_state(c, PA_CONTEXT_CONNECTING);
r = try_next_connection(c);
finish:
pa_context_unref(c);
return r;
}
开发者ID:felfert,项目名称:pulseaudio,代码行数:86,代码来源:context.c
示例13: sink_input_neew
static pa_hook_result_t sink_input_neew(void *hook_data, void *call_data,
void *slot_data)
{
static uint32_t route_flags = PA_POLICY_GROUP_FLAG_SET_SINK |
PA_POLICY_GROUP_FLAG_ROUTE_AUDIO;
static pa_volume_t max_volume = PA_VOLUME_NORM;
struct pa_sink_input_new_data
*data = (struct pa_sink_input_new_data *)call_data;
struct userdata *u = (struct userdata *)slot_data;
uint32_t flags;
const char *group_name;
const char *sinp_name;
const char *sink_name;
int local_route;
int local_volume;
struct pa_policy_group *group;
pa_assert(u);
pa_assert(data);
if ((group_name = pa_classify_sink_input_by_data(u,data,&flags)) != NULL &&
(group = pa_policy_group_find(u, group_name) ) != NULL ){
/* Let's just set the policy group property here already so that we
* don't have to classify again when the sink input is put, because we
* can just retrieve the group from the proplist. Also, this prevents
* the classification from breaking later because of the proplist
* overwriting done below. */
pa_proplist_sets(data->proplist, PA_PROP_POLICY_GROUP, group_name);
/* Proplist overwriting can also mess up the retrieval of
* stream-specific flags later on, so we need to store those to the
* proplist as well (ugly hack). We could probably cope without this
* one though, since the stream-specific flags don't really seem to be
* used. */
pa_proplist_set(data->proplist, PA_PROP_POLICY_STREAM_FLAGS,
(void*)&flags, sizeof(flags));
if (group->properties != NULL) {
pa_proplist_update(data->proplist, PA_UPDATE_REPLACE, group->properties);
pa_log_debug("new sink input inserted into %s. "
"force the following properties:", group_name);
}
if (group->sink != NULL) {
sinp_name = pa_proplist_gets(data->proplist, PA_PROP_MEDIA_NAME);
if (!sinp_name)
sinp_name = "<unknown>";
local_route = flags & PA_POLICY_LOCAL_ROUTE;
local_volume = flags & PA_POLICY_LOCAL_VOLMAX;
if (group->mutebyrt && !local_route) {
sink_name = u->nullsink->name;
pa_log_debug("force stream '%s'/'%s' to sink '%s' due to "
"mute-by-route", group_name,sinp_name, sink_name);
#ifdef HAVE_OLD_LIBPULSE
data->sink = u->nullsink->sink;
#else
pa_sink_input_new_data_set_sink(data, u->nullsink->sink, false);
#endif
}
else if (group->flags & route_flags) {
sink_name = pa_sink_ext_get_name(group->sink);
pa_log_debug("force stream '%s'/'%s' to sink '%s'",
group_name, sinp_name, sink_name);
#ifdef HAVE_OLD_LIBPULSE
data->sink = group->sink;
#else
pa_sink_input_new_data_set_sink(data, group->sink, false);
#endif
}
if (local_volume) {
pa_log_debug("force stream '%s'/'%s' volume to %d",
group_name, sinp_name,
(max_volume * 100) / PA_VOLUME_NORM);
pa_cvolume_set(&data->volume, data->channel_map.channels,
max_volume);
data->volume_is_set = TRUE;
data->save_volume = FALSE;
}
}
}
return PA_HOOK_OK;
}
开发者ID:jusa,项目名称:pulseaudio-policy-enforcement,代码行数:98,代码来源:sink-input-ext.c
示例14: pa_sink_input_ext_set_volume_limit
int pa_sink_input_ext_set_volume_limit(struct pa_sink_input *sinp,
pa_volume_t limit)
{
pa_sink *sink;
int retval;
uint64_t limit64;
pa_volume_t value;
pa_cvolume *factor;
pa_cvolume *real;
int changed;
int i;
pa_assert(sinp);
pa_assert_se((sink = sinp->sink));
retval = 0;
if (limit == 0)
pa_sink_input_set_mute(sinp, TRUE, TRUE);
else {
pa_sink_input_set_mute(sinp, FALSE, TRUE);
if (limit > PA_VOLUME_NORM)
limit = PA_VOLUME_NORM;
factor = &sinp->volume_factor;
real = &sinp->real_ratio;
limit64 = (uint64_t)limit * (uint64_t)PA_VOLUME_NORM;
changed = FALSE;
if (real->channels != factor->channels) {
pa_log_debug("channel number mismatch");
retval = -1;
}
else {
for (i = 0; i < factor->channels; i++) {
if (limit < real->values[i])
value = limit64 / (uint64_t)real->values[i];
else
value = PA_VOLUME_NORM;
if (value != factor->values[i]) {
changed = 1;
factor->values[i] = value;
}
}
if (changed) {
if (pa_sink_flat_volume_enabled(sink))
retval = 1;
else {
pa_sw_cvolume_multiply(&sinp->soft_volume, real, factor);
pa_asyncmsgq_send(sink->asyncmsgq, PA_MSGOBJECT(sinp),
PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME,
NULL, 0, NULL);
}
}
}
}
return retval;
}
开发者ID:jusa,项目名称:pulseaudio-policy-enforcement,代码行数:62,代码来源:sink-input-ext.c
示例15: main
//.........这里部分代码省略.........
b.format = pa_parse_sample_format(optarg);
all_formats = false;
break;
case ARG_TO_SAMPLERATE:
b.rate = (uint32_t) atoi(optarg);
break;
case ARG_SECONDS:
seconds = atoi(optarg);
break;
case ARG_RESAMPLE_METHOD:
if (*optarg == '\0' || pa_streq(optarg, "help")) {
dump_resample_methods();
ret = 0;
goto quit;
}
method = pa_parse_resample_method(optarg);
break;
default:
goto quit;
}
}
ret = 0;
pa_assert_se(pool = pa_mempool_new(false, 0));
if (!all_formats) {
pa_resampler *resampler;
pa_memchunk i, j;
pa_usec_t ts;
pa_log_debug("Compilation CFLAGS: %s", PA_CFLAGS);
pa_log_debug("=== %d seconds: %d Hz %d ch (%s) -> %d Hz %d ch (%s)", seconds,
a.rate, a.channels, pa_sample_format_to_string(a.format),
b.rate, b.channels, pa_sample_format_to_string(b.format));
ts = pa_rtclock_now();
pa_assert_se(resampler = pa_resampler_new(pool, &a, NULL, &b, NULL, crossover_freq, method, 0));
pa_log_info("init: %llu", (long long unsigned)(pa_rtclock_now() - ts));
i.memblock = pa_memblock_new(pool, pa_usec_to_bytes(1*PA_USEC_PER_SEC, &a));
ts = pa_rtclock_now();
i.length = pa_memblock_get_length(i.memblock);
i.index = 0;
while (seconds--) {
pa_resampler_run(resampler, &i, &j);
if (j.memblock)
pa_memblock_unref(j.memblock);
}
pa_log_info("resampling: %llu", (long long unsigned)(pa_rtclock_now() - ts));
pa_memblock_unref(i.memblock);
pa_resampler_free(resampler);
goto quit;
}
for (a.format = 0; a.format < PA_SAMPLE_MAX; a.format ++) {
for (b.format = 0; b.format < PA_SAMPLE_MAX; b.format ++) {
pa_resampler *forth, *back;
pa_memchunk i, j, k;
pa_log_debug("=== %s -> %s -> %s -> /2",
pa_sample_format_to_string(a.format),
pa_sample_format_to_string(b.format),
pa_sample_format_to_string(a.format));
pa_assert_se(forth = pa_resampler_new(pool, &a, NULL, &b, NULL, crossover_freq, method, 0));
pa_assert_se(back = pa_resampler_new(pool, &b, NULL, &a, NULL, crossover_freq, method, 0));
i.memblock = generate_block(pool, &a);
i.length = pa_memblock_get_length(i.memblock);
i.index = 0;
pa_resampler_run(forth, &i, &j);
pa_resampler_run(back, &j, &k);
dump_block("before", &a, &i);
dump_block("after", &b, &j);
dump_block("reverse", &a, &k);
pa_memblock_unref(i.memblock);
pa_memblock_unref(j.memblock);
pa_memblock_unref(k.memblock);
pa_resampler_free(forth);
pa_resampler_free(back);
}
}
quit:
if (pool)
pa_mempool_free(pool);
return ret;
}
开发者ID:fourtrax,项目名称:pulseaudio,代码行数:101,代码来源:resampler-test.c
示例16: context_autospawn
static int context_autospawn(pa_context *c) {
pid_t pid;
int status, r;
struct sigaction sa;
pa_context_ref(c);
if (sigaction(SIGCHLD, NULL, &sa) < 0) {
pa_log_debug("sigaction() failed: %s", pa_cstrerror(errno));
pa_context_fail(c, PA_ERR_INTERNAL);
goto fail;
}
if ((sa.sa_flags & SA_NOCLDWAIT) || sa.sa_handler == SIG_IGN) {
pa_log_debug("Process disabled waitpid(), cannot autospawn.");
pa_context_fail(c, PA_ERR_CONNECTIONREFUSED);
goto fail;
}
pa_log_debug("Trying to autospawn...");
if (c->spawn_api.prefork)
c->spawn_api.prefork();
if ((pid = fork()) < 0) {
pa_log_error(_("fork(): %s"), pa_cstrerror(errno));
pa_context_fail(c, PA_ERR_INTERNAL);
if (c->spawn_api.postfork)
c->spawn_api.postfork();
goto fail;
} else if (!pid) {
/* Child */
const char *state = NULL;
const char * argv[32];
unsigned n = 0;
if (c->spawn_api.atfork)
c->spawn_api.atfork();
/* We leave most of the cleaning up of the process environment
* to the executable. We only clean up the file descriptors to
* make sure the executable can actually be loaded
* correctly. */
pa_close_all(-1);
/* Setup argv */
argv[n++] = c->conf->daemon_binary;
argv[n++] = "--start";
while (n < PA_ELEMENTSOF(argv)-1) {
char *a;
if (!(a = pa_split_spaces(c->conf->extra_arguments, &state)))
break;
argv[n++] = a;
}
argv[n++] = NULL;
pa_assert(n <= PA_ELEMENTSOF(argv));
execv(argv[0], (char * const *) argv);
_exit(1);
}
/* Parent */
if (c->spawn_api.postfork)
c->spawn_api.postfork();
do {
r = waitpid(pid, &status, 0);
} while (r < 0 && errno == EINTR);
if (r < 0) {
if (errno != ESRCH) {
pa_log(_("waitpid(): %s"), pa_cstrerror(errno));
pa_context_fail(c, PA_ERR_INTERNAL);
goto fail;
}
/* hmm, something already reaped our child, so we assume
* startup worked, even if we cannot know */
} else if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
pa_context_fail(c, PA_ERR_CONNECTIONREFUSED);
goto fail;
}
pa_context_unref(c);
return 0;
fail:
pa_context_unref(c);
//.........这里部分代码省略.........
开发者ID:felfert,项目名称:pulseaudio,代码行数:101,代码来源:context.c
示例17: try_next_connection
static int try_next_connection(pa_context *c) {
char *u = NULL;
int r = -1;
pa_assert(c);
pa_assert(!c->client);
for (;;) {
pa_xfree(u);
u = NULL;
c->server_list = pa_strlist_pop(c->server_list, &u);
if (!u) {
#ifndef OS_IS_WIN32
if (c->do_autospawn) {
if ((r = context_autospawn(c)) < 0)
goto finish;
/* Autospawn only once */
c->do_autospawn = FALSE;
/* Connect only to per-user sockets this time */
c->server_list = prepend_per_user(c->server_list);
/* Retry connection */
continue;
}
#endif
#ifdef HAVE_DBUS
if (c->no_fail && !c->server_specified) {
if (!c->session_bus)
track_pulseaudio_on_dbus(c, DBUS_BUS_SESSION, &c->session_bus);
if (!c->system_bus)
track_pulseaudio_on_dbus(c, DBUS_BUS_SYSTEM, &c->system_bus);
} else
#endif
pa_context_fail(c, PA_ERR_CONNECTIONREFUSED);
goto finish;
}
pa_log_debug("Trying to connect to %s...", u);
pa_xfree(c->server);
c->server = pa_xstrdup(u);
if (!(c->client = pa_socket_client_new_string(c->mainloop, c->use_rtclock, u, PA_NATIVE_DEFAULT_PORT)))
continue;
c->is_local = !!pa_socket_client_is_local(c->client);
pa_socket_client_set_callback(c->client, on_connection, c);
break;
}
r = 0;
finish:
pa_xfree(u);
return r;
}
开发者ID:felfert,项目名称:pulseaudio,代码行数:65,代码来源:context.c
示例18: pa__init
int pa__init(pa_module *m)
{
pa_modargs *ma;
const char *master_sink_name;
const char *master_source_name;
const char *max_hw_frag_size_str;
const char *aep_runtime;
pa_source *master_source;
struct userdata *u;
pa_proplist *p;
pa_sink *master_sink;
const char *raw_sink_name;
const char *raw_source_name;
const char *voice_sink_name;
const char *voice_source_name;
const char *dbus_type;
int max_hw_frag_size = 3840;
pa_assert(m);
if (!(ma = pa_modargs_new(m->argument, valid_modargs)))
{
pa_log_error("Failed to parse module arguments");
goto fail;
}
voice_turn_sidetone_down();
master_sink_name = pa_modargs_get_value(ma, "master_sink", NULL);
master_source_name = pa_modargs_get_value(ma, "master_source", NULL);
raw_sink_name = pa_modargs_get_value(ma, "raw_sink_name", "sink.voice.raw");
raw_source_name = pa_modargs_get_value(ma, "raw_source_name",
"source.voice.raw");
voice_sink_name = pa_modargs_get_value(ma, "voice_sink_name", "sink.voice");
voice_source_name = pa_modargs_get_value(ma, "voice_source_name",
"source.voice");
dbus_type = pa_modargs_get_value(ma, "dbus_type", "session");
max_hw_frag_size_str = pa_modargs_get_value(ma, "max_hw_frag_size", "3840");
aep_runtime = pa_modargs_get_value(ma, "aep_runtime",
"bbaid1n-wr0-h9a22b--dbxpb--");
voice_set_aep_runtime_switch(aep_runtime);
pa_log_debug("Got arguments: master_sink=\"%s\" master_source=\"%s\" raw_sink_name=\"%s\"
|
请发表评论