mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-12-17 08:56:42 -05:00
More spelling fixes
This commit is contained in:
parent
231645d4fc
commit
c5dca7cf2b
81 changed files with 165 additions and 167 deletions
|
|
@ -71,7 +71,7 @@ enum {
|
||||||
ARG_START
|
ARG_START
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Tabel for getopt_long() */
|
/* Table for getopt_long() */
|
||||||
static const struct option long_options[] = {
|
static const struct option long_options[] = {
|
||||||
{"help", 0, 0, ARG_HELP},
|
{"help", 0, 0, ARG_HELP},
|
||||||
{"version", 0, 0, ARG_VERSION},
|
{"version", 0, 0, ARG_VERSION},
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
#include "daemon-conf.h"
|
#include "daemon-conf.h"
|
||||||
|
|
||||||
/* Parese the command line and store its data in *c. Return the index
|
/* Parse the command line and store its data in *c. Return the index
|
||||||
* of the first unparsed argument in *d. */
|
* of the first unparsed argument in *d. */
|
||||||
int pa_cmdline_parse(pa_daemon_conf*c, int argc, char *const argv [], int *d);
|
int pa_cmdline_parse(pa_daemon_conf*c, int argc, char *const argv [], int *d);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@
|
||||||
relocations on any libraries that are already loaded into our
|
relocations on any libraries that are already loaded into our
|
||||||
process, i.e. because the pulseaudio binary links directly to
|
process, i.e. because the pulseaudio binary links directly to
|
||||||
them. To disable lazy relocations for those libraries it is possible
|
them. To disable lazy relocations for those libraries it is possible
|
||||||
to set $LT_BIND_NOW before starting the pulsaudio binary.
|
to set $LT_BIND_NOW before starting the pulseaudio binary.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static lt_module bind_now_open(lt_user_data d, const char *fname, lt_dladvise advise) {
|
static lt_module bind_now_open(lt_user_data d, const char *fname, lt_dladvise advise) {
|
||||||
|
|
|
||||||
|
|
@ -3826,7 +3826,7 @@ static int profile_verify(pa_alsa_profile *p) {
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!(m = pa_hashmap_get(p->profile_set->mappings, *name)) || m->direction == PA_ALSA_DIRECTION_INPUT) {
|
if (!(m = pa_hashmap_get(p->profile_set->mappings, *name)) || m->direction == PA_ALSA_DIRECTION_INPUT) {
|
||||||
pa_log("Profile '%s' refers to unexistant mapping '%s'.", p->name, *name);
|
pa_log("Profile '%s' refers to nonexistent mapping '%s'.", p->name, *name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3862,7 +3862,7 @@ static int profile_verify(pa_alsa_profile *p) {
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!(m = pa_hashmap_get(p->profile_set->mappings, *name)) || m->direction == PA_ALSA_DIRECTION_OUTPUT) {
|
if (!(m = pa_hashmap_get(p->profile_set->mappings, *name)) || m->direction == PA_ALSA_DIRECTION_OUTPUT) {
|
||||||
pa_log("Profile '%s' refers to unexistant mapping '%s'.", p->name, *name);
|
pa_log("Profile '%s' refers to nonexistent mapping '%s'.", p->name, *name);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -277,7 +277,7 @@ struct pa_alsa_decibel_fix {
|
||||||
long max_step;
|
long max_step;
|
||||||
|
|
||||||
/* An array that maps alsa volume element steps to decibels. The steps can
|
/* An array that maps alsa volume element steps to decibels. The steps can
|
||||||
* be used as indices to this array, after substracting min_step from the
|
* be used as indices to this array, after subtracting min_step from the
|
||||||
* real value.
|
* real value.
|
||||||
*
|
*
|
||||||
* The values are actually stored as integers representing millibels,
|
* The values are actually stored as integers representing millibels,
|
||||||
|
|
|
||||||
|
|
@ -69,10 +69,10 @@
|
||||||
#define TSCHED_WATERMARK_INC_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms -- On underrun, increase watermark by this */
|
#define TSCHED_WATERMARK_INC_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms -- On underrun, increase watermark by this */
|
||||||
#define TSCHED_WATERMARK_DEC_STEP_USEC (5*PA_USEC_PER_MSEC) /* 5ms -- When everything's great, decrease watermark by this */
|
#define TSCHED_WATERMARK_DEC_STEP_USEC (5*PA_USEC_PER_MSEC) /* 5ms -- When everything's great, decrease watermark by this */
|
||||||
#define TSCHED_WATERMARK_VERIFY_AFTER_USEC (20*PA_USEC_PER_SEC) /* 20s -- How long after a drop out recheck if things are good now */
|
#define TSCHED_WATERMARK_VERIFY_AFTER_USEC (20*PA_USEC_PER_SEC) /* 20s -- How long after a drop out recheck if things are good now */
|
||||||
#define TSCHED_WATERMARK_INC_THRESHOLD_USEC (0*PA_USEC_PER_MSEC) /* 0ms -- If the buffer level ever below this theshold, increase the watermark */
|
#define TSCHED_WATERMARK_INC_THRESHOLD_USEC (0*PA_USEC_PER_MSEC) /* 0ms -- If the buffer level ever below this threshold, increase the watermark */
|
||||||
#define TSCHED_WATERMARK_DEC_THRESHOLD_USEC (100*PA_USEC_PER_MSEC) /* 100ms -- If the buffer level didn't drop below this theshold in the verification time, decrease the watermark */
|
#define TSCHED_WATERMARK_DEC_THRESHOLD_USEC (100*PA_USEC_PER_MSEC) /* 100ms -- If the buffer level didn't drop below this threshold in the verification time, decrease the watermark */
|
||||||
|
|
||||||
/* Note that TSCHED_WATERMARK_INC_THRESHOLD_USEC == 0 means tht we
|
/* Note that TSCHED_WATERMARK_INC_THRESHOLD_USEC == 0 means that we
|
||||||
* will increase the watermark only if we hit a real underrun. */
|
* will increase the watermark only if we hit a real underrun. */
|
||||||
|
|
||||||
#define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms -- Sleep at least 10ms on each iteration */
|
#define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms -- Sleep at least 10ms on each iteration */
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@
|
||||||
#include "module-echo-cancel-symdef.h"
|
#include "module-echo-cancel-symdef.h"
|
||||||
|
|
||||||
PA_MODULE_AUTHOR("Wim Taymans");
|
PA_MODULE_AUTHOR("Wim Taymans");
|
||||||
PA_MODULE_DESCRIPTION("Echo Cancelation");
|
PA_MODULE_DESCRIPTION("Echo Cancellation");
|
||||||
PA_MODULE_VERSION(PACKAGE_VERSION);
|
PA_MODULE_VERSION(PACKAGE_VERSION);
|
||||||
PA_MODULE_LOAD_ONCE(FALSE);
|
PA_MODULE_LOAD_ONCE(FALSE);
|
||||||
PA_MODULE_USAGE(
|
PA_MODULE_USAGE(
|
||||||
|
|
@ -132,10 +132,10 @@ static const pa_echo_canceller ec_table[] = {
|
||||||
*
|
*
|
||||||
* Alignment is performed in two steps:
|
* Alignment is performed in two steps:
|
||||||
*
|
*
|
||||||
* 1) when something happens that requires quick adjustement of the alignment of
|
* 1) when something happens that requires quick adjustment of the alignment of
|
||||||
* capture and playback samples, we perform a resync. This adjusts the
|
* capture and playback samples, we perform a resync. This adjusts the
|
||||||
* position in the playback memblock to the requested sample. Quick
|
* position in the playback memblock to the requested sample. Quick
|
||||||
* adjustements include moving the playback samples before the capture
|
* adjustments include moving the playback samples before the capture
|
||||||
* samples (because else the echo canceler does not work) or when the
|
* samples (because else the echo canceler does not work) or when the
|
||||||
* playback pointer drifts too far away.
|
* playback pointer drifts too far away.
|
||||||
*
|
*
|
||||||
|
|
@ -250,7 +250,7 @@ static int64_t calc_diff(struct userdata *u, struct snapshot *snapshot) {
|
||||||
|
|
||||||
buffer += snapshot->source_delay + snapshot->sink_delay;
|
buffer += snapshot->source_delay + snapshot->sink_delay;
|
||||||
|
|
||||||
/* add the amount of samples not yet transfered to the source context */
|
/* add the amount of samples not yet transferred to the source context */
|
||||||
if (snapshot->recv_counter <= snapshot->send_counter)
|
if (snapshot->recv_counter <= snapshot->send_counter)
|
||||||
buffer += (int64_t) (snapshot->send_counter - snapshot->recv_counter);
|
buffer += (int64_t) (snapshot->send_counter - snapshot->recv_counter);
|
||||||
else
|
else
|
||||||
|
|
@ -322,7 +322,7 @@ static void time_callback(pa_mainloop_api *a, pa_time_event *e, const struct tim
|
||||||
new_rate = base_rate;
|
new_rate = base_rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make sure we don't make too big adjustements because that sounds horrible */
|
/* make sure we don't make too big adjustments because that sounds horrible */
|
||||||
if (new_rate > base_rate * 1.1 || new_rate < base_rate * 0.9)
|
if (new_rate > base_rate * 1.1 || new_rate < base_rate * 0.9)
|
||||||
new_rate = base_rate;
|
new_rate = base_rate;
|
||||||
|
|
||||||
|
|
@ -724,7 +724,7 @@ static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk)
|
||||||
fwrite(pdata, 1, u->blocksize, u->played_file);
|
fwrite(pdata, 1, u->blocksize, u->played_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* perform echo cancelation */
|
/* perform echo cancellation */
|
||||||
u->ec->run(u->ec, rdata, pdata, cdata);
|
u->ec->run(u->ec, rdata, pdata, cdata);
|
||||||
|
|
||||||
/* preprecessor is run after AEC. This is not a mistake! */
|
/* preprecessor is run after AEC. This is not a mistake! */
|
||||||
|
|
@ -1441,7 +1441,7 @@ int pa__init(pa_module*m) {
|
||||||
|
|
||||||
u->ec->echo_suppress_attenuation_active = DEFAULT_ECHO_SUPPRESS_ATTENUATION;
|
u->ec->echo_suppress_attenuation_active = DEFAULT_ECHO_SUPPRESS_ATTENUATION;
|
||||||
if (pa_modargs_get_value_s32(ma, "echo_suppress_attenuation_active", &u->ec->echo_suppress_attenuation_active) < 0) {
|
if (pa_modargs_get_value_s32(ma, "echo_suppress_attenuation_active", &u->ec->echo_suppress_attenuation_active) < 0) {
|
||||||
pa_log("Failed to parse echo_supress_attenuation_active value");
|
pa_log("Failed to parse echo_suppress_attenuation_active value");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
if (u->ec->echo_suppress_attenuation_active > 0) {
|
if (u->ec->echo_suppress_attenuation_active > 0) {
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@
|
||||||
|
|
||||||
/* General overview:
|
/* General overview:
|
||||||
*
|
*
|
||||||
* Because JACK has a very unflexible event loop management which
|
* Because JACK has a very inflexible event loop management which
|
||||||
* doesn't allow us to add our own event sources to the event thread
|
* doesn't allow us to add our own event sources to the event thread
|
||||||
* we cannot use the JACK real-time thread for dispatching our PA
|
* we cannot use the JACK real-time thread for dispatching our PA
|
||||||
* work. Instead, we run an additional RT thread which does most of
|
* work. Instead, we run an additional RT thread which does most of
|
||||||
|
|
|
||||||
|
|
@ -102,7 +102,7 @@ struct output {
|
||||||
/* For communication of the stream latencies to the main thread */
|
/* For communication of the stream latencies to the main thread */
|
||||||
pa_usec_t total_latency;
|
pa_usec_t total_latency;
|
||||||
|
|
||||||
/* For coomunication of the stream parameters to the sink thread */
|
/* For communication of the stream parameters to the sink thread */
|
||||||
pa_atomic_t max_request;
|
pa_atomic_t max_request;
|
||||||
pa_atomic_t requested_latency;
|
pa_atomic_t requested_latency;
|
||||||
|
|
||||||
|
|
@ -991,7 +991,7 @@ static void output_disable(struct output *o) {
|
||||||
* pass any further data to this output */
|
* pass any further data to this output */
|
||||||
pa_asyncmsgq_send(o->userdata->sink->asyncmsgq, PA_MSGOBJECT(o->userdata->sink), SINK_MESSAGE_REMOVE_OUTPUT, o, 0, NULL);
|
pa_asyncmsgq_send(o->userdata->sink->asyncmsgq, PA_MSGOBJECT(o->userdata->sink), SINK_MESSAGE_REMOVE_OUTPUT, o, 0, NULL);
|
||||||
|
|
||||||
/* Now dellocate the stream */
|
/* Now deallocate the stream */
|
||||||
pa_sink_input_unref(o->sink_input);
|
pa_sink_input_unref(o->sink_input);
|
||||||
o->sink_input = NULL;
|
o->sink_input = NULL;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ static void load(struct userdata *u) {
|
||||||
pa_namereg_set_default_sink(u->core, s);
|
pa_namereg_set_default_sink(u->core, s);
|
||||||
pa_log_info("Restored default sink '%s'.", ln);
|
pa_log_info("Restored default sink '%s'.", ln);
|
||||||
} else
|
} else
|
||||||
pa_log_info("Saved default sink '%s' not existant, not restoring default sink setting.", ln);
|
pa_log_info("Saved default sink '%s' not existent, not restoring default sink setting.", ln);
|
||||||
|
|
||||||
} else if (errno != ENOENT)
|
} else if (errno != ENOENT)
|
||||||
pa_log("Failed to load default sink: %s", pa_cstrerror(errno));
|
pa_log("Failed to load default sink: %s", pa_cstrerror(errno));
|
||||||
|
|
@ -95,7 +95,7 @@ static void load(struct userdata *u) {
|
||||||
pa_namereg_set_default_source(u->core, s);
|
pa_namereg_set_default_source(u->core, s);
|
||||||
pa_log_info("Restored default source '%s'.", ln);
|
pa_log_info("Restored default source '%s'.", ln);
|
||||||
} else
|
} else
|
||||||
pa_log_info("Saved default source '%s' not existant, not restoring default source setting.", ln);
|
pa_log_info("Saved default source '%s' not existent, not restoring default source setting.", ln);
|
||||||
|
|
||||||
} else if (errno != ENOENT)
|
} else if (errno != ENOENT)
|
||||||
pa_log("Failed to load default sink: %s", pa_cstrerror(errno));
|
pa_log("Failed to load default sink: %s", pa_cstrerror(errno));
|
||||||
|
|
|
||||||
|
|
@ -1334,7 +1334,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add the device to our hashmap. If it's alredy in it, free it now and carry on */
|
/* Add the device to our hashmap. If it's already in it, free it now and carry on */
|
||||||
device = pa_xnew(struct device_t, 1);
|
device = pa_xnew(struct device_t, 1);
|
||||||
device->device = pa_xstrdup(s);
|
device->device = pa_xstrdup(s);
|
||||||
if (pa_hashmap_put(h, device->device, device) == 0) {
|
if (pa_hashmap_put(h, device->device, device) == 0) {
|
||||||
|
|
@ -1352,7 +1352,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
/* Now cycle through our list and add all the devices.
|
/* Now cycle through our list and add all the devices.
|
||||||
This has the effect of addign in any in our DB,
|
This has the effect of adding in any in our DB,
|
||||||
not specified in the device list (and thus will be
|
not specified in the device list (and thus will be
|
||||||
tacked on at the end) */
|
tacked on at the end) */
|
||||||
offset = idx;
|
offset = idx;
|
||||||
|
|
@ -1368,10 +1368,10 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
|
||||||
if ((sink_mode && 0 == strncmp("sink:", device->device, 5))
|
if ((sink_mode && 0 == strncmp("sink:", device->device, 5))
|
||||||
|| (!sink_mode && 0 == strncmp("source:", device->device, 7))) {
|
|| (!sink_mode && 0 == strncmp("source:", device->device, 7))) {
|
||||||
|
|
||||||
/* Add the device to our hashmap. If it's alredy in it, free it now and carry on */
|
/* Add the device to our hashmap. If it's already in it, free it now and carry on */
|
||||||
if (pa_hashmap_put(h, device->device, device) == 0
|
if (pa_hashmap_put(h, device->device, device) == 0
|
||||||
&& (e = entry_read(u, device->device))) {
|
&& (e = entry_read(u, device->device))) {
|
||||||
/* We add offset on to the existing priorirty so that when we order, the
|
/* We add offset on to the existing priority so that when we order, the
|
||||||
existing entries are always lower priority than the new ones. */
|
existing entries are always lower priority than the new ones. */
|
||||||
device->prio = (offset + e->priority[role_index]);
|
device->prio = (offset + e->priority[role_index]);
|
||||||
pa_xfree(e);
|
pa_xfree(e);
|
||||||
|
|
|
||||||
|
|
@ -99,7 +99,7 @@ struct userdata {
|
||||||
pa_bool_t restore_formats:1;
|
pa_bool_t restore_formats:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Protocol extention commands */
|
/* Protocol extension commands */
|
||||||
enum {
|
enum {
|
||||||
SUBCOMMAND_TEST,
|
SUBCOMMAND_TEST,
|
||||||
SUBCOMMAND_SUBSCRIBE,
|
SUBCOMMAND_SUBSCRIBE,
|
||||||
|
|
|
||||||
|
|
@ -114,7 +114,7 @@ struct userdata {
|
||||||
//size_t samplings;
|
//size_t samplings;
|
||||||
|
|
||||||
float **Xs;
|
float **Xs;
|
||||||
float ***Hs;//thread updatable copies of the freq response filters (magintude based)
|
float ***Hs;//thread updatable copies of the freq response filters (magnitude based)
|
||||||
pa_aupdate **a_H;
|
pa_aupdate **a_H;
|
||||||
pa_memblockq *input_q;
|
pa_memblockq *input_q;
|
||||||
char *output_buffer;
|
char *output_buffer;
|
||||||
|
|
@ -356,10 +356,10 @@ static void dsp_logic(
|
||||||
*automatically cycled in routine
|
*automatically cycled in routine
|
||||||
*/
|
*/
|
||||||
float * restrict overlap,
|
float * restrict overlap,
|
||||||
const float X,//multipliar
|
const float X,//multiplier
|
||||||
const float * restrict H,//The freq. magnitude scalers filter
|
const float * restrict H,//The freq. magnitude scalers filter
|
||||||
const float * restrict W,//The windowing function
|
const float * restrict W,//The windowing function
|
||||||
fftwf_complex * restrict output_window,//The transformed window'd src
|
fftwf_complex * restrict output_window,//The transformed windowed src
|
||||||
struct userdata *u){
|
struct userdata *u){
|
||||||
|
|
||||||
//use a linear-phase sliding STFT and overlap-add method (for each channel)
|
//use a linear-phase sliding STFT and overlap-add method (for each channel)
|
||||||
|
|
@ -367,7 +367,7 @@ static void dsp_logic(
|
||||||
for(size_t j = 0; j < u->window_size; ++j){
|
for(size_t j = 0; j < u->window_size; ++j){
|
||||||
dst[j] = X * W[j] * src[j];
|
dst[j] = X * W[j] * src[j];
|
||||||
}
|
}
|
||||||
//zero padd the the remaining fft window
|
//zero pad the the remaining fft window
|
||||||
memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
|
memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
|
||||||
//Processing is done here!
|
//Processing is done here!
|
||||||
//do fft
|
//do fft
|
||||||
|
|
@ -379,7 +379,7 @@ static void dsp_logic(
|
||||||
}
|
}
|
||||||
//inverse fft
|
//inverse fft
|
||||||
fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
|
fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
|
||||||
////debug: tests overlaping add
|
////debug: tests overlapping add
|
||||||
////and negates ALL PREVIOUS processing
|
////and negates ALL PREVIOUS processing
|
||||||
////yields a perfect reconstruction if COLA is held
|
////yields a perfect reconstruction if COLA is held
|
||||||
//for(size_t j = 0; j < u->window_size; ++j){
|
//for(size_t j = 0; j < u->window_size; ++j){
|
||||||
|
|
@ -397,7 +397,7 @@ static void dsp_logic(
|
||||||
// u->work_buffer[j] = u->input[c][j];
|
// u->work_buffer[j] = u->input[c][j];
|
||||||
//}
|
//}
|
||||||
|
|
||||||
//preseve the needed input for the next window's overlap
|
//preserve the needed input for the next window's overlap
|
||||||
memmove(src, src + u->R,
|
memmove(src, src + u->R,
|
||||||
(u->samples_gathered - u->R) * sizeof(float)
|
(u->samples_gathered - u->R) * sizeof(float)
|
||||||
);
|
);
|
||||||
|
|
@ -418,10 +418,10 @@ static void dsp_logic(
|
||||||
*automatically cycled in routine
|
*automatically cycled in routine
|
||||||
*/
|
*/
|
||||||
float * restrict overlap,//The size of the overlap
|
float * restrict overlap,//The size of the overlap
|
||||||
const float X,//multipliar
|
const float X,//multiplier
|
||||||
const float * restrict H,//The freq. magnitude scalers filter
|
const float * restrict H,//The freq. magnitude scalers filter
|
||||||
const float * restrict W,//The windowing function
|
const float * restrict W,//The windowing function
|
||||||
fftwf_complex * restrict output_window,//The transformed window'd src
|
fftwf_complex * restrict output_window,//The transformed windowed src
|
||||||
struct userdata *u){//Collection of constants
|
struct userdata *u){//Collection of constants
|
||||||
const size_t overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
|
const size_t overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
|
||||||
float_vector_t x;
|
float_vector_t x;
|
||||||
|
|
@ -439,7 +439,7 @@ static void dsp_logic(
|
||||||
// d->v = x->v * w->v * s->v;
|
// d->v = x->v * w->v * s->v;
|
||||||
//#endif
|
//#endif
|
||||||
}
|
}
|
||||||
//zero padd the the remaining fft window
|
//zero pad the the remaining fft window
|
||||||
memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
|
memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
|
||||||
|
|
||||||
//Processing is done here!
|
//Processing is done here!
|
||||||
|
|
@ -463,7 +463,7 @@ static void dsp_logic(
|
||||||
//inverse fft
|
//inverse fft
|
||||||
fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
|
fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
|
||||||
|
|
||||||
////debug: tests overlaping add
|
////debug: tests overlapping add
|
||||||
////and negates ALL PREVIOUS processing
|
////and negates ALL PREVIOUS processing
|
||||||
////yields a perfect reconstruction if COLA is held
|
////yields a perfect reconstruction if COLA is held
|
||||||
//for(size_t j = 0; j < u->window_size; ++j){
|
//for(size_t j = 0; j < u->window_size; ++j){
|
||||||
|
|
@ -494,7 +494,7 @@ static void dsp_logic(
|
||||||
// dst[j] = src[j];
|
// dst[j] = src[j];
|
||||||
//}
|
//}
|
||||||
|
|
||||||
//preseve the needed input for the next window's overlap
|
//preserve the needed input for the next window's overlap
|
||||||
memmove(src, src + u->R,
|
memmove(src, src + u->R,
|
||||||
(u->samples_gathered - u->R) * sizeof(float)
|
(u->samples_gathered - u->R) * sizeof(float)
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -206,7 +206,7 @@ static int hal_device_load_alsa(struct userdata *u, const char *udi, struct devi
|
||||||
|
|
||||||
/* For each ALSA card that appears the control device will be the
|
/* For each ALSA card that appears the control device will be the
|
||||||
* last one to be created, this is considered part of the ALSA
|
* last one to be created, this is considered part of the ALSA
|
||||||
* usperspace API. We rely on this and load our modules only when
|
* userspace API. We rely on this and load our modules only when
|
||||||
* the control device is available assuming that *all* device
|
* the control device is available assuming that *all* device
|
||||||
* nodes have been properly created and assigned the right ACLs at
|
* nodes have been properly created and assigned the right ACLs at
|
||||||
* that time. Also see:
|
* that time. Also see:
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ PA_MODULE_USAGE(
|
||||||
"channel_map=<input channel map> "
|
"channel_map=<input channel map> "
|
||||||
"plugin=<ladspa plugin name> "
|
"plugin=<ladspa plugin name> "
|
||||||
"label=<ladspa plugin label> "
|
"label=<ladspa plugin label> "
|
||||||
"control=<comma seperated list of input control values> "
|
"control=<comma separated list of input control values> "
|
||||||
"input_ladspaport_map=<comma separated list of input LADSPA port names> "
|
"input_ladspaport_map=<comma separated list of input LADSPA port names> "
|
||||||
"output_ladspaport_map=<comma separated list of output LADSPA port names> "));
|
"output_ladspaport_map=<comma separated list of output LADSPA port names> "));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,7 @@ static pa_hook_result_t sink_input_fixate_hook_callback(pa_core *core, pa_sink_i
|
||||||
if ((id = pa_proplist_gets(data->proplist, PA_PROP_EVENT_ID))) {
|
if ((id = pa_proplist_gets(data->proplist, PA_PROP_EVENT_ID))) {
|
||||||
|
|
||||||
/* The test sounds should never be positioned in space, since
|
/* The test sounds should never be positioned in space, since
|
||||||
* they might be trigered themselves to configure the speakers
|
* they might be triggered themselves to configure the speakers
|
||||||
* in space, which we don't want to mess up. */
|
* in space, which we don't want to mess up. */
|
||||||
|
|
||||||
if (pa_startswith(id, "audio-channel-"))
|
if (pa_startswith(id, "audio-channel-"))
|
||||||
|
|
|
||||||
|
|
@ -133,7 +133,7 @@
|
||||||
PA_MODULE_DESCRIPTION("Native protocol "SOCKET_DESCRIPTION);
|
PA_MODULE_DESCRIPTION("Native protocol "SOCKET_DESCRIPTION);
|
||||||
PA_MODULE_USAGE("auth-anonymous=<don't check for cookies?> "
|
PA_MODULE_USAGE("auth-anonymous=<don't check for cookies?> "
|
||||||
"auth-cookie=<path to cookie file> "
|
"auth-cookie=<path to cookie file> "
|
||||||
"auth-cookie-enabled=<enable cookie authentification?> "
|
"auth-cookie-enabled=<enable cookie authentication?> "
|
||||||
AUTH_USAGE
|
AUTH_USAGE
|
||||||
SOCKET_USAGE);
|
SOCKET_USAGE);
|
||||||
#elif defined(USE_PROTOCOL_ESOUND)
|
#elif defined(USE_PROTOCOL_ESOUND)
|
||||||
|
|
@ -162,7 +162,7 @@
|
||||||
"source=<source to connect to> "
|
"source=<source to connect to> "
|
||||||
"auth-anonymous=<don't verify cookies?> "
|
"auth-anonymous=<don't verify cookies?> "
|
||||||
"auth-cookie=<path to cookie file> "
|
"auth-cookie=<path to cookie file> "
|
||||||
"auth-cookie-enabled=<enable cookie authentification?> "
|
"auth-cookie-enabled=<enable cookie authentication?> "
|
||||||
AUTH_USAGE
|
AUTH_USAGE
|
||||||
SOCKET_USAGE);
|
SOCKET_USAGE);
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
|
|
@ -485,7 +485,7 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
|
||||||
case PA_SINK_MESSAGE_SET_STATE: {
|
case PA_SINK_MESSAGE_SET_STATE: {
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
/* First, change the state, because otherwide pa_sink_render() would fail */
|
/* First, change the state, because otherwise pa_sink_render() would fail */
|
||||||
if ((r = pa_sink_process_msg(o, code, data, offset, chunk)) >= 0) {
|
if ((r = pa_sink_process_msg(o, code, data, offset, chunk)) >= 0) {
|
||||||
|
|
||||||
stream_cork_within_thread(u, u->sink->state == PA_SINK_SUSPENDED);
|
stream_cork_within_thread(u, u->sink->state == PA_SINK_SUSPENDED);
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ PA_MODULE_LOAD_ONCE(TRUE);
|
||||||
PA_MODULE_USAGE(
|
PA_MODULE_USAGE(
|
||||||
"tsched=<enable system timer based scheduling mode?> "
|
"tsched=<enable system timer based scheduling mode?> "
|
||||||
"ignore_dB=<ignore dB information from the device?> "
|
"ignore_dB=<ignore dB information from the device?> "
|
||||||
"sync_volume=<syncronize sw and hw voluchanges in IO-thread?>");
|
"sync_volume=<syncronize sw and hw volume changes in IO-thread?>");
|
||||||
|
|
||||||
struct device {
|
struct device {
|
||||||
char *path;
|
char *path;
|
||||||
|
|
@ -318,7 +318,7 @@ static void verify_access(struct userdata *u, struct device *d) {
|
||||||
* A clean fix would be if we would be able to ignore
|
* A clean fix would be if we would be able to ignore
|
||||||
* our own inotify close events. However, inotify
|
* our own inotify close events. However, inotify
|
||||||
* lacks such functionality. Also, during probing of
|
* lacks such functionality. Also, during probing of
|
||||||
* the device we cannot really distuingish between
|
* the device we cannot really distinguish between
|
||||||
* other processes causing EBUSY or ourselves, which
|
* other processes causing EBUSY or ourselves, which
|
||||||
* means we have no way to figure out if the probing
|
* means we have no way to figure out if the probing
|
||||||
* during opening was canceled by a "try again"
|
* during opening was canceled by a "try again"
|
||||||
|
|
@ -721,7 +721,7 @@ int pa__init(pa_module *m) {
|
||||||
pa_log("Failed to enable monitor: %s", pa_cstrerror(errno));
|
pa_log("Failed to enable monitor: %s", pa_cstrerror(errno));
|
||||||
if (errno == EPERM)
|
if (errno == EPERM)
|
||||||
pa_log_info("Most likely your kernel is simply too old and "
|
pa_log_info("Most likely your kernel is simply too old and "
|
||||||
"allows only priviliged processes to listen to device events. "
|
"allows only privileged processes to listen to device events. "
|
||||||
"Please upgrade your kernel to at least 2.6.30.");
|
"Please upgrade your kernel to at least 2.6.30.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
* We make no difference between IDLE and RUNNING in our handling.
|
* We make no difference between IDLE and RUNNING in our handling.
|
||||||
*
|
*
|
||||||
* As long as we are in RUNNING/IDLE state we will *always* write data to
|
* As long as we are in RUNNING/IDLE state we will *always* write data to
|
||||||
* the device. If none is avilable from the inputs, we write silence
|
* the device. If none is available from the inputs, we write silence
|
||||||
* instead.
|
* instead.
|
||||||
*
|
*
|
||||||
* If power should be saved on IDLE module-suspend-on-idle should be used.
|
* If power should be saved on IDLE module-suspend-on-idle should be used.
|
||||||
|
|
|
||||||
|
|
@ -248,7 +248,7 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
|
||||||
pa_rtpoll_item_free(u->rtpoll_item);
|
pa_rtpoll_item_free(u->rtpoll_item);
|
||||||
u->rtpoll_item = NULL;
|
u->rtpoll_item = NULL;
|
||||||
} else {
|
} else {
|
||||||
/* Quesiton: is this valid here: or should we do some sort of:
|
/* Question: is this valid here: or should we do some sort of:
|
||||||
return pa_sink_process_msg(PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL);
|
return pa_sink_process_msg(PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL);
|
||||||
?? */
|
?? */
|
||||||
pa_module_unload_request(u->module, TRUE);
|
pa_module_unload_request(u->module, TRUE);
|
||||||
|
|
@ -287,7 +287,7 @@ static void sink_set_volume_cb(pa_sink *s) {
|
||||||
pa_log_debug("Got hardware volume: %s", pa_cvolume_snprint(t, sizeof(t), &hw));
|
pa_log_debug("Got hardware volume: %s", pa_cvolume_snprint(t, sizeof(t), &hw));
|
||||||
pa_log_debug("Calculated software volume: %s", pa_cvolume_snprint(t, sizeof(t), &s->soft_volume));
|
pa_log_debug("Calculated software volume: %s", pa_cvolume_snprint(t, sizeof(t), &s->soft_volume));
|
||||||
|
|
||||||
/* Any necessary software volume manipulateion is done so set
|
/* Any necessary software volume manipulation is done so set
|
||||||
our hw volume (or v as a single value) on the device */
|
our hw volume (or v as a single value) on the device */
|
||||||
pa_raop_client_set_volume(u->raop, v);
|
pa_raop_client_set_volume(u->raop, v);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ static inline void bit_writer(uint8_t **buffer, uint8_t *bit_pos, int *size, uin
|
||||||
if (!data_bit_len)
|
if (!data_bit_len)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* If bit pos is zero, we will definatly use at least one bit from the current byte so size increments. */
|
/* If bit pos is zero, we will definately use at least one bit from the current byte so size increments. */
|
||||||
if (!*bit_pos)
|
if (!*bit_pos)
|
||||||
*size += 1;
|
*size += 1;
|
||||||
|
|
||||||
|
|
@ -128,7 +128,7 @@ static inline void bit_writer(uint8_t **buffer, uint8_t *bit_pos, int *size, uin
|
||||||
**buffer = bit_data;
|
**buffer = bit_data;
|
||||||
/* If our data fits exactly into the current byte, we need to increment our pointer */
|
/* If our data fits exactly into the current byte, we need to increment our pointer */
|
||||||
if (0 == bit_overflow) {
|
if (0 == bit_overflow) {
|
||||||
/* Do not increment size as it will be incremeneted on next call as bit_pos is zero */
|
/* Do not increment size as it will be incremented on next call as bit_pos is zero */
|
||||||
*buffer += 1;
|
*buffer += 1;
|
||||||
*bit_pos = 0;
|
*bit_pos = 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -523,7 +523,7 @@ int pa_raop_client_encode_sample(pa_raop_client* c, pa_memchunk* raw, pa_memchun
|
||||||
pa_memblock_release(raw->memblock);
|
pa_memblock_release(raw->memblock);
|
||||||
encoded->length = header_size + size;
|
encoded->length = header_size + size;
|
||||||
|
|
||||||
/* store the lenght (endian swapped: make this better) */
|
/* store the length (endian swapped: make this better) */
|
||||||
len = size + header_size - 4;
|
len = size + header_size - 4;
|
||||||
*(b + 2) = len >> 8;
|
*(b + 2) = len >> 8;
|
||||||
*(b + 3) = len & 0xff;
|
*(b + 3) = len & 0xff;
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ typedef void (*rm_change_cb_t)(rm_monitor *m);
|
||||||
* DBus error might be set as well if the error was caused D-Bus. */
|
* DBus error might be set as well if the error was caused D-Bus. */
|
||||||
int rm_watch(
|
int rm_watch(
|
||||||
rm_monitor **m, /* On success a pointer to the newly allocated rm_device object will be filled in here */
|
rm_monitor **m, /* On success a pointer to the newly allocated rm_device object will be filled in here */
|
||||||
DBusConnection *connection, /* Session bus (when D-Bus learns about user busses we should switchg to user busses) */
|
DBusConnection *connection, /* Session bus (when D-Bus learns about user busses we should switch to user busses) */
|
||||||
const char *device_name, /* The device to monitor, e.g. "Audio0" */
|
const char *device_name, /* The device to monitor, e.g. "Audio0" */
|
||||||
rm_change_cb_t change_cb, /* Will be called whenever the lock status changes. May be NULL */
|
rm_change_cb_t change_cb, /* Will be called whenever the lock status changes. May be NULL */
|
||||||
DBusError *error); /* If we fail due to a D-Bus related issue the error will be filled in here. May be NULL. */
|
DBusError *error); /* If we fail due to a D-Bus related issue the error will be filled in here. May be NULL. */
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ typedef int (*rd_request_cb_t)(
|
||||||
* the error was caused D-Bus. */
|
* the error was caused D-Bus. */
|
||||||
int rd_acquire(
|
int rd_acquire(
|
||||||
rd_device **d, /* On success a pointer to the newly allocated rd_device object will be filled in here */
|
rd_device **d, /* On success a pointer to the newly allocated rd_device object will be filled in here */
|
||||||
DBusConnection *connection, /* Session bus (when D-Bus learns about user busses we should switchg to user busses) */
|
DBusConnection *connection, /* Session bus (when D-Bus learns about user busses we should switch to user busses) */
|
||||||
const char *device_name, /* The device to lock, e.g. "Audio0" */
|
const char *device_name, /* The device to lock, e.g. "Audio0" */
|
||||||
const char *application_name, /* A human readable name of the application, e.g. "PulseAudio Sound Server" */
|
const char *application_name, /* A human readable name of the application, e.g. "PulseAudio Sound Server" */
|
||||||
int32_t priority, /* The priority for this application. If unsure use 0 */
|
int32_t priority, /* The priority for this application. If unsure use 0 */
|
||||||
|
|
|
||||||
|
|
@ -244,7 +244,7 @@ int pa_udev_get_info(int card_idx, pa_proplist *p) {
|
||||||
if ((v = udev_device_get_property_value(card, "SOUND_FORM_FACTOR")) && *v)
|
if ((v = udev_device_get_property_value(card, "SOUND_FORM_FACTOR")) && *v)
|
||||||
pa_proplist_sets(p, PA_PROP_DEVICE_FORM_FACTOR, v);
|
pa_proplist_sets(p, PA_PROP_DEVICE_FORM_FACTOR, v);
|
||||||
|
|
||||||
/* This is normaly not set by the udev rules but may be useful to
|
/* This is normally not set by the udev rules but may be useful to
|
||||||
* allow administrators to overwrite the device description.*/
|
* allow administrators to overwrite the device description.*/
|
||||||
if (!pa_proplist_contains(p, PA_PROP_DEVICE_DESCRIPTION))
|
if (!pa_proplist_contains(p, PA_PROP_DEVICE_DESCRIPTION))
|
||||||
if ((v = udev_device_get_property_value(card, "SOUND_DESCRIPTION")) && *v)
|
if ((v = udev_device_get_property_value(card, "SOUND_DESCRIPTION")) && *v)
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "ext-device-restore.h"
|
#include "ext-device-restore.h"
|
||||||
|
|
||||||
/* Protocol extention commands */
|
/* Protocol extension commands */
|
||||||
enum {
|
enum {
|
||||||
SUBCOMMAND_TEST,
|
SUBCOMMAND_TEST,
|
||||||
SUBCOMMAND_SUBSCRIBE,
|
SUBCOMMAND_SUBSCRIBE,
|
||||||
|
|
|
||||||
|
|
@ -245,7 +245,7 @@ static void stream_unlink(pa_stream *s) {
|
||||||
|
|
||||||
/* Detach from context */
|
/* Detach from context */
|
||||||
|
|
||||||
/* Unref all operatio object that point to us */
|
/* Unref all operation object that point to us */
|
||||||
for (o = s->context->operations; o; o = n) {
|
for (o = s->context->operations; o; o = n) {
|
||||||
n = o->next;
|
n = o->next;
|
||||||
|
|
||||||
|
|
@ -1206,7 +1206,7 @@ static int create_stream(
|
||||||
PA_CHECK_VALIDITY(s->context, s->context->version >= 12 || !(flags & PA_STREAM_VARIABLE_RATE), PA_ERR_NOTSUPPORTED);
|
PA_CHECK_VALIDITY(s->context, s->context->version >= 12 || !(flags & PA_STREAM_VARIABLE_RATE), PA_ERR_NOTSUPPORTED);
|
||||||
PA_CHECK_VALIDITY(s->context, s->context->version >= 13 || !(flags & PA_STREAM_PEAK_DETECT), PA_ERR_NOTSUPPORTED);
|
PA_CHECK_VALIDITY(s->context, s->context->version >= 13 || !(flags & PA_STREAM_PEAK_DETECT), PA_ERR_NOTSUPPORTED);
|
||||||
PA_CHECK_VALIDITY(s->context, s->context->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
PA_CHECK_VALIDITY(s->context, s->context->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||||
/* Althought some of the other flags are not supported on older
|
/* Although some of the other flags are not supported on older
|
||||||
* version, we don't check for them here, because it doesn't hurt
|
* version, we don't check for them here, because it doesn't hurt
|
||||||
* when they are passed but actually not supported. This makes
|
* when they are passed but actually not supported. This makes
|
||||||
* client development easier */
|
* client development easier */
|
||||||
|
|
@ -1804,7 +1804,7 @@ static void stream_get_timing_info_callback(pa_pdispatch *pd, uint32_t command,
|
||||||
|
|
||||||
pa_gettimeofday(&now);
|
pa_gettimeofday(&now);
|
||||||
|
|
||||||
/* Calculcate timestamps */
|
/* Calculate timestamps */
|
||||||
if (pa_timeval_cmp(&local, &remote) <= 0 && pa_timeval_cmp(&remote, &now) <= 0) {
|
if (pa_timeval_cmp(&local, &remote) <= 0 && pa_timeval_cmp(&remote, &now) <= 0) {
|
||||||
/* local and remote seem to have synchronized clocks */
|
/* local and remote seem to have synchronized clocks */
|
||||||
|
|
||||||
|
|
@ -2660,7 +2660,7 @@ pa_operation* pa_stream_set_buffer_attr(pa_stream *s, const pa_buffer_attr *attr
|
||||||
pa_pstream_send_tagstruct(s->context->pstream, t);
|
pa_pstream_send_tagstruct(s->context->pstream, t);
|
||||||
pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, stream_set_buffer_attr_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
|
pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, stream_set_buffer_attr_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
|
||||||
|
|
||||||
/* This might cause changes in the read/write indexex, hence let's
|
/* This might cause changes in the read/write index, hence let's
|
||||||
* request a timing update */
|
* request a timing update */
|
||||||
request_auto_timing_update(s, TRUE);
|
request_auto_timing_update(s, TRUE);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ pa_usec_t pa_timeval_diff(const struct timeval *a, const struct timeval *b) {
|
||||||
pa_assert(a);
|
pa_assert(a);
|
||||||
pa_assert(b);
|
pa_assert(b);
|
||||||
|
|
||||||
/* Check which whan is the earlier time and swap the two arguments if required. */
|
/* Check which is the earlier time and swap the two arguments if required. */
|
||||||
if (PA_UNLIKELY(pa_timeval_cmp(a, b) < 0)) {
|
if (PA_UNLIKELY(pa_timeval_cmp(a, b) < 0)) {
|
||||||
const struct timeval *c;
|
const struct timeval *c;
|
||||||
c = a;
|
c = a;
|
||||||
|
|
|
||||||
|
|
@ -288,7 +288,7 @@ static inline int pa_atomic_ptr_cmpxchg(pa_atomic_ptr_t *a, void *old_p, void* n
|
||||||
|
|
||||||
#warn "The native atomic operations implementation for AMD64 has not been tested thoroughly. libatomic_ops is known to not work properly on AMD64 and your gcc version is too old for the gcc-builtin atomic ops support. You have three options now: test the native atomic operations implementation for AMD64, fix libatomic_ops, or upgrade your GCC."
|
#warn "The native atomic operations implementation for AMD64 has not been tested thoroughly. libatomic_ops is known to not work properly on AMD64 and your gcc version is too old for the gcc-builtin atomic ops support. You have three options now: test the native atomic operations implementation for AMD64, fix libatomic_ops, or upgrade your GCC."
|
||||||
|
|
||||||
/* Addapted from glibc */
|
/* Adapted from glibc */
|
||||||
|
|
||||||
typedef struct pa_atomic {
|
typedef struct pa_atomic {
|
||||||
volatile int value;
|
volatile int value;
|
||||||
|
|
@ -491,7 +491,7 @@ static inline pa_bool_t pa_atomic_ptr_cmpxchg(pa_atomic_ptr_t *a, void *old_p, v
|
||||||
/* See file arch/arm/kernel/entry-armv.S in your kernel sources for more
|
/* See file arch/arm/kernel/entry-armv.S in your kernel sources for more
|
||||||
information about these functions. The arm kernel helper functions first
|
information about these functions. The arm kernel helper functions first
|
||||||
appeared in 2.6.16.
|
appeared in 2.6.16.
|
||||||
Apply --disable-atomic-arm-linux-helpers flag to confugure if you prefere
|
Apply --disable-atomic-arm-linux-helpers flag to configure if you prefer
|
||||||
inline asm implementation or you have an obsolete Linux kernel.
|
inline asm implementation or you have an obsolete Linux kernel.
|
||||||
*/
|
*/
|
||||||
/* Memory barrier */
|
/* Memory barrier */
|
||||||
|
|
|
||||||
|
|
@ -47,10 +47,10 @@ unsigned pa_aupdate_write_swap(pa_aupdate *a);
|
||||||
/*
|
/*
|
||||||
* This infrastructure allows lock-free updates of arbitrary data
|
* This infrastructure allows lock-free updates of arbitrary data
|
||||||
* structures in an rcu'ish way: two copies of the data structure
|
* structures in an rcu'ish way: two copies of the data structure
|
||||||
* should be exisiting. One side ('the reader') has read access to one
|
* should be existing. One side ('the reader') has read access to one
|
||||||
* of the two data structure at a time. It does not have to lock it,
|
* of the two data structure at a time. It does not have to lock it,
|
||||||
* however it needs to signal that it is using it/stopped using
|
* however it needs to signal that it is using it/stopped using
|
||||||
* it. The other side ('the writer') modifes the second data structure,
|
* it. The other side ('the writer') modifies the second data structure,
|
||||||
* and then atomically swaps the two data structures, followed by a
|
* and then atomically swaps the two data structures, followed by a
|
||||||
* modification of the other one.
|
* modification of the other one.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ static int generate(int fd, void *ret_data, size_t length) {
|
||||||
#define O_BINARY 0
|
#define O_BINARY 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Load an euthorization cookie from file fn and store it in data. If
|
/* Load an authorization cookie from file fn and store it in data. If
|
||||||
* the cookie file doesn't exist, create it */
|
* the cookie file doesn't exist, create it */
|
||||||
static int load(const char *fn, void *data, size_t length) {
|
static int load(const char *fn, void *data, size_t length) {
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
|
|
||||||
|
|
@ -1784,7 +1784,7 @@ int pa_cli_command_execute_line_stateful(pa_core *c, const char *s, pa_strbuf *b
|
||||||
if (filename[0] == PA_PATH_SEP_CHAR) {
|
if (filename[0] == PA_PATH_SEP_CHAR) {
|
||||||
|
|
||||||
*ifstate = access(filename, F_OK) == 0 ? IFSTATE_TRUE : IFSTATE_FALSE;
|
*ifstate = access(filename, F_OK) == 0 ? IFSTATE_TRUE : IFSTATE_FALSE;
|
||||||
pa_log_debug("Checking for existance of '%s': %s", filename, *ifstate == IFSTATE_TRUE ? "success" : "failure");
|
pa_log_debug("Checking for existence of '%s': %s", filename, *ifstate == IFSTATE_TRUE ? "success" : "failure");
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
const char *paths, *state = NULL;
|
const char *paths, *state = NULL;
|
||||||
|
|
@ -1800,7 +1800,7 @@ int pa_cli_command_execute_line_stateful(pa_core *c, const char *s, pa_strbuf *b
|
||||||
pa_xfree(p);
|
pa_xfree(p);
|
||||||
|
|
||||||
*ifstate = access(pathname, F_OK) == 0 ? IFSTATE_TRUE : IFSTATE_FALSE;
|
*ifstate = access(pathname, F_OK) == 0 ? IFSTATE_TRUE : IFSTATE_FALSE;
|
||||||
pa_log_debug("Checking for existance of '%s': %s", pathname, *ifstate == IFSTATE_TRUE ? "success" : "failure");
|
pa_log_debug("Checking for existence of '%s': %s", pathname, *ifstate == IFSTATE_TRUE ? "success" : "failure");
|
||||||
|
|
||||||
pa_xfree(pathname);
|
pa_xfree(pathname);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@ static void dump_event(const char * prefix, pa_subscription_event*e) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Deferred callback for dispatching subscirption events */
|
/* Deferred callback for dispatching subscription events */
|
||||||
static void defer_cb(pa_mainloop_api *m, pa_defer_event *de, void *userdata) {
|
static void defer_cb(pa_mainloop_api *m, pa_defer_event *de, void *userdata) {
|
||||||
pa_core *c = userdata;
|
pa_core *c = userdata;
|
||||||
pa_subscription *s;
|
pa_subscription *s;
|
||||||
|
|
|
||||||
|
|
@ -891,7 +891,7 @@ int pa_match(const char *expr, const char *v) {
|
||||||
int pa_parse_boolean(const char *v) {
|
int pa_parse_boolean(const char *v) {
|
||||||
pa_assert(v);
|
pa_assert(v);
|
||||||
|
|
||||||
/* First we check language independant */
|
/* First we check language independent */
|
||||||
if (!strcmp(v, "1") || v[0] == 'y' || v[0] == 'Y' || v[0] == 't' || v[0] == 'T' || !strcasecmp(v, "on"))
|
if (!strcmp(v, "1") || v[0] == 'y' || v[0] == 'Y' || v[0] == 't' || v[0] == 'T' || !strcasecmp(v, "on"))
|
||||||
return 1;
|
return 1;
|
||||||
else if (!strcmp(v, "0") || v[0] == 'n' || v[0] == 'N' || v[0] == 'f' || v[0] == 'F' || !strcasecmp(v, "off"))
|
else if (!strcmp(v, "0") || v[0] == 'n' || v[0] == 'N' || v[0] == 'f' || v[0] == 'F' || !strcasecmp(v, "off"))
|
||||||
|
|
@ -900,7 +900,7 @@ int pa_parse_boolean(const char *v) {
|
||||||
#ifdef HAVE_LANGINFO_H
|
#ifdef HAVE_LANGINFO_H
|
||||||
{
|
{
|
||||||
const char *expr;
|
const char *expr;
|
||||||
/* And then we check language dependant */
|
/* And then we check language dependent */
|
||||||
if ((expr = nl_langinfo(YESEXPR)))
|
if ((expr = nl_langinfo(YESEXPR)))
|
||||||
if (expr[0])
|
if (expr[0])
|
||||||
if (pa_match(expr, v) > 0)
|
if (pa_match(expr, v) > 0)
|
||||||
|
|
@ -920,7 +920,7 @@ int pa_parse_boolean(const char *v) {
|
||||||
/* Split the specified string wherever one of the strings in delimiter
|
/* Split the specified string wherever one of the strings in delimiter
|
||||||
* occurs. Each time it is called returns a newly allocated string
|
* occurs. Each time it is called returns a newly allocated string
|
||||||
* with pa_xmalloc(). The variable state points to, should be
|
* with pa_xmalloc(). The variable state points to, should be
|
||||||
* initiallized to NULL before the first call. */
|
* initialized to NULL before the first call. */
|
||||||
char *pa_split(const char *c, const char *delimiter, const char**state) {
|
char *pa_split(const char *c, const char *delimiter, const char**state) {
|
||||||
const char *current = *state ? *state : c;
|
const char *current = *state ? *state : c;
|
||||||
size_t l;
|
size_t l;
|
||||||
|
|
@ -1150,7 +1150,7 @@ finish:
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check whether the specifc user id is a member of the specified group */
|
/* Check whether the specific user id is a member of the specified group */
|
||||||
int pa_uid_in_group(uid_t uid, const char *name) {
|
int pa_uid_in_group(uid_t uid, const char *name) {
|
||||||
struct group *group = NULL;
|
struct group *group = NULL;
|
||||||
char **i;
|
char **i;
|
||||||
|
|
@ -1186,7 +1186,7 @@ finish:
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the GID of a gfiven group, return (gid_t) -1 on failure. */
|
/* Get the GID of a given group, return (gid_t) -1 on failure. */
|
||||||
gid_t pa_get_gid_of_group(const char *name) {
|
gid_t pa_get_gid_of_group(const char *name) {
|
||||||
gid_t ret = (gid_t) -1;
|
gid_t ret = (gid_t) -1;
|
||||||
struct group *gr = NULL;
|
struct group *gr = NULL;
|
||||||
|
|
@ -1260,7 +1260,7 @@ int pa_lock_fd(int fd, int b) {
|
||||||
if (fcntl(fd, F_SETLKW, &f_lock) >= 0)
|
if (fcntl(fd, F_SETLKW, &f_lock) >= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Perhaps the file descriptor qas opened for read only, than try again with a read lock. */
|
/* Perhaps the file descriptor was opened for read only, than try again with a read lock. */
|
||||||
if (b && errno == EBADF) {
|
if (b && errno == EBADF) {
|
||||||
f_lock.l_type = F_RDLCK;
|
f_lock.l_type = F_RDLCK;
|
||||||
if (fcntl(fd, F_SETLKW, &f_lock) >= 0)
|
if (fcntl(fd, F_SETLKW, &f_lock) >= 0)
|
||||||
|
|
@ -1371,7 +1371,7 @@ fail:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unlock a temporary lcok file */
|
/* Unlock a temporary lock file */
|
||||||
int pa_unlock_lockfile(const char *fn, int fd) {
|
int pa_unlock_lockfile(const char *fn, int fd) {
|
||||||
int r = 0;
|
int r = 0;
|
||||||
pa_assert(fd >= 0);
|
pa_assert(fd >= 0);
|
||||||
|
|
@ -1569,7 +1569,7 @@ char *pa_get_runtime_dir(void) {
|
||||||
mode_t m;
|
mode_t m;
|
||||||
|
|
||||||
/* The runtime directory shall contain dynamic data that needs NOT
|
/* The runtime directory shall contain dynamic data that needs NOT
|
||||||
* to be kept accross reboots and is usuallly private to the user,
|
* to be kept across reboots and is usually private to the user,
|
||||||
* except in system mode, where it might be accessible by other
|
* except in system mode, where it might be accessible by other
|
||||||
* users, too. Since we need POSIX locking and UNIX sockets in
|
* users, too. Since we need POSIX locking and UNIX sockets in
|
||||||
* this directory, we link it to a random subdir in /tmp, if it
|
* this directory, we link it to a random subdir in /tmp, if it
|
||||||
|
|
@ -1606,8 +1606,7 @@ char *pa_get_runtime_dir(void) {
|
||||||
pa_xfree(mid);
|
pa_xfree(mid);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
/* OK, first let's check if the "runtime" symlink is already
|
/* OK, first let's check if the "runtime" symlink already exists */
|
||||||
* existant */
|
|
||||||
|
|
||||||
if (!(p = pa_readlink(k))) {
|
if (!(p = pa_readlink(k))) {
|
||||||
|
|
||||||
|
|
@ -1691,7 +1690,7 @@ char *pa_get_runtime_dir(void) {
|
||||||
pa_xfree(t);
|
pa_xfree(t);
|
||||||
t = NULL;
|
t = NULL;
|
||||||
|
|
||||||
/* Hmm, someone lese was quicker then us. Let's give
|
/* Hmm, someone else was quicker then us. Let's give
|
||||||
* him some time to finish, and retry. */
|
* him some time to finish, and retry. */
|
||||||
pa_msleep(10);
|
pa_msleep(10);
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -2873,7 +2872,7 @@ char *pa_realpath(const char *path) {
|
||||||
char *t;
|
char *t;
|
||||||
pa_assert(path);
|
pa_assert(path);
|
||||||
|
|
||||||
/* We want only abolsute paths */
|
/* We want only absolute paths */
|
||||||
if (path[0] != '/') {
|
if (path[0] != '/') {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
||||||
|
|
@ -228,7 +228,7 @@ unsigned pa_ncpus(void);
|
||||||
char *pa_replace(const char*s, const char*a, const char *b);
|
char *pa_replace(const char*s, const char*a, const char *b);
|
||||||
|
|
||||||
/* Escapes p by inserting backslashes in front of backslashes. chars is a
|
/* Escapes p by inserting backslashes in front of backslashes. chars is a
|
||||||
* regular (ie. NULL-terminated) string containing additional characters that
|
* regular (i.e. NULL-terminated) string containing additional characters that
|
||||||
* should be escaped. chars can be NULL. The caller has to free the returned
|
* should be escaped. chars can be NULL. The caller has to free the returned
|
||||||
* string. */
|
* string. */
|
||||||
char *pa_escape(const char *p, const char *chars);
|
char *pa_escape(const char *p, const char *chars);
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ pa_database* pa_database_open(const char *fn, pa_bool_t for_write) {
|
||||||
pa_assert(fn);
|
pa_assert(fn);
|
||||||
|
|
||||||
/* We include the host identifier in the file name because gdbm
|
/* We include the host identifier in the file name because gdbm
|
||||||
* files are CPU dependant, and we don't want things to go wrong
|
* files are CPU dependent, and we don't want things to go wrong
|
||||||
* if we are on a multiarch system. */
|
* if we are on a multiarch system. */
|
||||||
path = pa_sprintf_malloc("%s."CANONICAL_HOST".gdbm", fn);
|
path = pa_sprintf_malloc("%s."CANONICAL_HOST".gdbm", fn);
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
|
||||||
|
|
@ -311,7 +311,7 @@ int pa_database_set(pa_database *database, const pa_datum *key, const pa_datum*
|
||||||
r = pa_hashmap_remove(db->map, key);
|
r = pa_hashmap_remove(db->map, key);
|
||||||
pa_hashmap_put(db->map, &e->key, e);
|
pa_hashmap_put(db->map, &e->key, e);
|
||||||
} else {
|
} else {
|
||||||
/* wont't overwrite, so clean new entry */
|
/* won't overwrite, so clean new entry */
|
||||||
r = e;
|
r = e;
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
/* A little abstraction over simple databases, such as gdbm, tdb, and
|
/* A little abstraction over simple databases, such as gdbm, tdb, and
|
||||||
* so on. We only make minimal assumptions about the supported
|
* so on. We only make minimal assumptions about the supported
|
||||||
* backend: it does not need to support locking, it does not have to
|
* backend: it does not need to support locking, it does not have to
|
||||||
* be arch independant. */
|
* be arch independent. */
|
||||||
|
|
||||||
typedef struct pa_database pa_database;
|
typedef struct pa_database pa_database;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@
|
||||||
/*************************************/
|
/*************************************/
|
||||||
/* what can we do to/with the EsounD */
|
/* what can we do to/with the EsounD */
|
||||||
enum esd_proto {
|
enum esd_proto {
|
||||||
ESD_PROTO_CONNECT, /* implied on inital client connection */
|
ESD_PROTO_CONNECT, /* implied on initial client connection */
|
||||||
|
|
||||||
/* pseudo "security" functionality */
|
/* pseudo "security" functionality */
|
||||||
ESD_PROTO_LOCK, /* disable "foreign" client connections */
|
ESD_PROTO_LOCK, /* disable "foreign" client connections */
|
||||||
|
|
@ -72,7 +72,7 @@ enum esd_proto {
|
||||||
ESD_PROTO_SAMPLE_PLAY, /* play a cached sample */
|
ESD_PROTO_SAMPLE_PLAY, /* play a cached sample */
|
||||||
ESD_PROTO_SAMPLE_LOOP, /* loop a cached sample, til eoloop */
|
ESD_PROTO_SAMPLE_LOOP, /* loop a cached sample, til eoloop */
|
||||||
ESD_PROTO_SAMPLE_STOP, /* stop a looping sample when done */
|
ESD_PROTO_SAMPLE_STOP, /* stop a looping sample when done */
|
||||||
ESD_PROTO_SAMPLE_KILL, /* stop the looping sample immed. */
|
ESD_PROTO_SAMPLE_KILL, /* stop the looping sample immediately */
|
||||||
|
|
||||||
/* free and reclaim /dev/dsp functionality */
|
/* free and reclaim /dev/dsp functionality */
|
||||||
ESD_PROTO_STANDBY, /* release /dev/dsp and ignore all data */
|
ESD_PROTO_STANDBY, /* release /dev/dsp and ignore all data */
|
||||||
|
|
@ -194,7 +194,7 @@ typedef int esd_standby_mode_t;
|
||||||
enum esd_client_state {
|
enum esd_client_state {
|
||||||
ESD_STREAMING_DATA, /* data from here on is streamed data */
|
ESD_STREAMING_DATA, /* data from here on is streamed data */
|
||||||
ESD_CACHING_SAMPLE, /* midway through caching a sample */
|
ESD_CACHING_SAMPLE, /* midway through caching a sample */
|
||||||
ESD_NEEDS_REQDATA, /* more data needed to complere request */
|
ESD_NEEDS_REQDATA, /* more data needed to complete request */
|
||||||
ESD_NEXT_REQUEST, /* proceed to next request */
|
ESD_NEXT_REQUEST, /* proceed to next request */
|
||||||
ESD_CLIENT_STATE_MAX /* place holder */
|
ESD_CLIENT_STATE_MAX /* place holder */
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ void pa_flist_free(pa_flist *l, pa_free_cb_t free_cb);
|
||||||
int pa_flist_push(pa_flist*l, void *p);
|
int pa_flist_push(pa_flist*l, void *p);
|
||||||
void* pa_flist_pop(pa_flist*l);
|
void* pa_flist_pop(pa_flist*l);
|
||||||
|
|
||||||
/* Please not that the destructor stuff is not really necesary, we do
|
/* Please note that the destructor stuff is not really necessary, we do
|
||||||
* this just to make valgrind output more useful. */
|
* this just to make valgrind output more useful. */
|
||||||
|
|
||||||
#define PA_STATIC_FLIST_DECLARE(name, size, free_cb) \
|
#define PA_STATIC_FLIST_DECLARE(name, size, free_cb) \
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ pa_bool_t pa_iochannel_is_readable(pa_iochannel*io);
|
||||||
pa_bool_t pa_iochannel_is_writable(pa_iochannel*io);
|
pa_bool_t pa_iochannel_is_writable(pa_iochannel*io);
|
||||||
pa_bool_t pa_iochannel_is_hungup(pa_iochannel*io);
|
pa_bool_t pa_iochannel_is_hungup(pa_iochannel*io);
|
||||||
|
|
||||||
/* Don't close the file descirptors when the io channel is freed. By
|
/* Don't close the file descriptors when the io channel is freed. By
|
||||||
* default the file descriptors are closed. */
|
* default the file descriptors are closed. */
|
||||||
void pa_iochannel_set_noclose(pa_iochannel*io, pa_bool_t b);
|
void pa_iochannel_set_noclose(pa_iochannel*io, pa_bool_t b);
|
||||||
|
|
||||||
|
|
@ -74,7 +74,7 @@ void pa_iochannel_set_callback(pa_iochannel*io, pa_iochannel_cb_t callback, void
|
||||||
/* In case the file descriptor is a socket, return a pretty-printed string in *s which describes the peer connected */
|
/* In case the file descriptor is a socket, return a pretty-printed string in *s which describes the peer connected */
|
||||||
void pa_iochannel_socket_peer_to_string(pa_iochannel*io, char*s, size_t l);
|
void pa_iochannel_socket_peer_to_string(pa_iochannel*io, char*s, size_t l);
|
||||||
|
|
||||||
/* Use setsockopt() to tune the recieve and send buffers of TCP sockets */
|
/* Use setsockopt() to tune the receive and send buffers of TCP sockets */
|
||||||
int pa_iochannel_socket_set_rcvbuf(pa_iochannel*io, size_t l);
|
int pa_iochannel_socket_set_rcvbuf(pa_iochannel*io, size_t l);
|
||||||
int pa_iochannel_socket_set_sndbuf(pa_iochannel*io, size_t l);
|
int pa_iochannel_socket_set_sndbuf(pa_iochannel*io, size_t l);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
#include <pulsecore/iochannel.h>
|
#include <pulsecore/iochannel.h>
|
||||||
|
|
||||||
/* An ioline wraps an iochannel for line based communication. A
|
/* An ioline wraps an iochannel for line based communication. A
|
||||||
* callback function is called whenever a new line has been recieved
|
* callback function is called whenever a new line has been received
|
||||||
* from the client */
|
* from the client */
|
||||||
|
|
||||||
typedef struct pa_ioline pa_ioline;
|
typedef struct pa_ioline pa_ioline;
|
||||||
|
|
@ -46,7 +46,7 @@ void pa_ioline_puts(pa_ioline *s, const char *c);
|
||||||
/* Write a string to the channel */
|
/* Write a string to the channel */
|
||||||
void pa_ioline_printf(pa_ioline *s, const char *format, ...) PA_GCC_PRINTF_ATTR(2,3);
|
void pa_ioline_printf(pa_ioline *s, const char *format, ...) PA_GCC_PRINTF_ATTR(2,3);
|
||||||
|
|
||||||
/* Set the callback function that is called for every recieved line */
|
/* Set the callback function that is called for every received line */
|
||||||
void pa_ioline_set_callback(pa_ioline*io, pa_ioline_cb_t callback, void *userdata);
|
void pa_ioline_set_callback(pa_ioline*io, pa_ioline_cb_t callback, void *userdata);
|
||||||
|
|
||||||
/* Set the callback function that is called when everything has been written */
|
/* Set the callback function that is called when everything has been written */
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ typedef enum pa_log_flags {
|
||||||
PA_LOG_COLORS = 0x01, /* Show colorful output */
|
PA_LOG_COLORS = 0x01, /* Show colorful output */
|
||||||
PA_LOG_PRINT_TIME = 0x02, /* Show time */
|
PA_LOG_PRINT_TIME = 0x02, /* Show time */
|
||||||
PA_LOG_PRINT_FILE = 0x04, /* Show source file */
|
PA_LOG_PRINT_FILE = 0x04, /* Show source file */
|
||||||
PA_LOG_PRINT_META = 0x08, /* Show extended locaton information */
|
PA_LOG_PRINT_META = 0x08, /* Show extended location information */
|
||||||
PA_LOG_PRINT_LEVEL = 0x10, /* Show log level prefix */
|
PA_LOG_PRINT_LEVEL = 0x10, /* Show log level prefix */
|
||||||
} pa_log_flags_t;
|
} pa_log_flags_t;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,7 @@ int pa_mcalign_pop(pa_mcalign *m, pa_memchunk *c) {
|
||||||
if (m->current.length == 0)
|
if (m->current.length == 0)
|
||||||
pa_memblock_unref(m->current.memblock);
|
pa_memblock_unref(m->current.memblock);
|
||||||
else {
|
else {
|
||||||
/* Move the raimainder to leftover */
|
/* Move the remainder to leftover */
|
||||||
pa_assert(m->current.length < m->base && !m->leftover.memblock);
|
pa_assert(m->current.length < m->base && !m->leftover.memblock);
|
||||||
|
|
||||||
m->leftover = m->current;
|
m->leftover = m->current;
|
||||||
|
|
|
||||||
|
|
@ -873,7 +873,7 @@ pa_bool_t pa_mempool_is_shared(pa_mempool *p) {
|
||||||
return !!p->memory.shared;
|
return !!p->memory.shared;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For recieving blocks from other nodes */
|
/* For receiving blocks from other nodes */
|
||||||
pa_memimport* pa_memimport_new(pa_mempool *p, pa_memimport_release_cb_t cb, void *userdata) {
|
pa_memimport* pa_memimport_new(pa_mempool *p, pa_memimport_release_cb_t cb, void *userdata) {
|
||||||
pa_memimport *i;
|
pa_memimport *i;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -123,7 +123,7 @@ int pa_mempool_get_shm_id(pa_mempool *p, uint32_t *id);
|
||||||
pa_bool_t pa_mempool_is_shared(pa_mempool *p);
|
pa_bool_t pa_mempool_is_shared(pa_mempool *p);
|
||||||
size_t pa_mempool_block_size_max(pa_mempool *p);
|
size_t pa_mempool_block_size_max(pa_mempool *p);
|
||||||
|
|
||||||
/* For recieving blocks from other nodes */
|
/* For receiving blocks from other nodes */
|
||||||
pa_memimport* pa_memimport_new(pa_mempool *p, pa_memimport_release_cb_t cb, void *userdata);
|
pa_memimport* pa_memimport_new(pa_mempool *p, pa_memimport_release_cb_t cb, void *userdata);
|
||||||
void pa_memimport_free(pa_memimport *i);
|
void pa_memimport_free(pa_memimport *i);
|
||||||
pa_memblock* pa_memimport_get(pa_memimport *i, uint32_t block_id, uint32_t shm_id, size_t offset, size_t size);
|
pa_memblock* pa_memimport_get(pa_memimport *i, uint32_t block_id, uint32_t shm_id, size_t offset, size_t size);
|
||||||
|
|
|
||||||
|
|
@ -336,7 +336,7 @@ int pa_memblockq_push(pa_memblockq* bq, const pa_memchunk *uchunk) {
|
||||||
struct list_item *p;
|
struct list_item *p;
|
||||||
size_t d;
|
size_t d;
|
||||||
|
|
||||||
/* Create a new list entry for the end of thie memchunk */
|
/* Create a new list entry for the end of the memchunk */
|
||||||
if (!(p = pa_flist_pop(PA_STATIC_FLIST_GET(list_items))))
|
if (!(p = pa_flist_pop(PA_STATIC_FLIST_GET(list_items))))
|
||||||
p = pa_xnew(struct list_item, 1);
|
p = pa_xnew(struct list_item, 1);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ typedef struct pa_memblockq pa_memblockq;
|
||||||
|
|
||||||
- maxrewind: how many bytes of history to keep in the queue
|
- maxrewind: how many bytes of history to keep in the queue
|
||||||
|
|
||||||
- silence: return this memchunk when reading unitialized data
|
- silence: return this memchunk when reading uninitialized data
|
||||||
*/
|
*/
|
||||||
pa_memblockq* pa_memblockq_new(
|
pa_memblockq* pa_memblockq_new(
|
||||||
int64_t idx,
|
int64_t idx,
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ typedef struct pa_memchunk {
|
||||||
* specified size, i.e. is enlarged if necessary. */
|
* specified size, i.e. is enlarged if necessary. */
|
||||||
pa_memchunk* pa_memchunk_make_writable(pa_memchunk *c, size_t min);
|
pa_memchunk* pa_memchunk_make_writable(pa_memchunk *c, size_t min);
|
||||||
|
|
||||||
/* Invalidate a memchunk. This does not free the cotaining memblock,
|
/* Invalidate a memchunk. This does not free the containing memblock,
|
||||||
* but sets all members to zero. */
|
* but sets all members to zero. */
|
||||||
pa_memchunk* pa_memchunk_reset(pa_memchunk *c);
|
pa_memchunk* pa_memchunk_reset(pa_memchunk *c);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ int pa_modargs_get_proplist(pa_modargs *ma, const char *name, pa_proplist *p, pa
|
||||||
* state variable of type void* and initialize it with NULL. A pointer
|
* state variable of type void* and initialize it with NULL. A pointer
|
||||||
* to this variable should then be passed to pa_modargs_iterate()
|
* to this variable should then be passed to pa_modargs_iterate()
|
||||||
* which should be called in a loop until it returns NULL which
|
* which should be called in a loop until it returns NULL which
|
||||||
* signifies EOL. On each invication this function will return the
|
* signifies EOL. On each invocation this function will return the
|
||||||
* key string for the next entry. The keys in the argument list do not
|
* key string for the next entry. The keys in the argument list do not
|
||||||
* have any particular order. */
|
* have any particular order. */
|
||||||
const char *pa_modargs_iterate(pa_modargs *ma, void **state);
|
const char *pa_modargs_iterate(pa_modargs *ma, void **state);
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@
|
||||||
typedef struct pa_mutex pa_mutex;
|
typedef struct pa_mutex pa_mutex;
|
||||||
|
|
||||||
/* Please think twice before enabling priority inheritance. This is no
|
/* Please think twice before enabling priority inheritance. This is no
|
||||||
* magic wand! Use it only when the potentially priorized threads are
|
* magic wand! Use it only when the potentially prioritized threads are
|
||||||
* good candidates for it. Don't use this blindly! Also, note that
|
* good candidates for it. Don't use this blindly! Also, note that
|
||||||
* only very few operating systems actually implement this, hence this
|
* only very few operating systems actually implement this, hence this
|
||||||
* is merely a hint. */
|
* is merely a hint. */
|
||||||
|
|
|
||||||
|
|
@ -320,7 +320,7 @@ fail:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check whether the daemon is currently running, i.e. if a PID file
|
/* Check whether the daemon is currently running, i.e. if a PID file
|
||||||
* exists and the PID therein too. Returns 0 on succcess, -1
|
* exists and the PID therein too. Returns 0 on success, -1
|
||||||
* otherwise. If pid is non-NULL and a running daemon was found,
|
* otherwise. If pid is non-NULL and a running daemon was found,
|
||||||
* return its PID therein */
|
* return its PID therein */
|
||||||
int pa_pid_file_check_running(pid_t *pid, const char *procname) {
|
int pa_pid_file_check_running(pid_t *pid, const char *procname) {
|
||||||
|
|
|
||||||
|
|
@ -44,10 +44,10 @@ pa_prioq_item* pa_prioq_put(pa_prioq *q, void* data);
|
||||||
/* Get the item on the top of the queue, but don't remove it from the queue*/
|
/* Get the item on the top of the queue, but don't remove it from the queue*/
|
||||||
void* pa_prioq_peek(pa_prioq*q);
|
void* pa_prioq_peek(pa_prioq*q);
|
||||||
|
|
||||||
/* Get the item on the top of the queue, and remove it from thq queue */
|
/* Get the item on the top of the queue, and remove it from the queue */
|
||||||
void* pa_prioq_pop(pa_prioq*q);
|
void* pa_prioq_pop(pa_prioq*q);
|
||||||
|
|
||||||
/* Remove an arbitrary from theq prioq, returning it's data */
|
/* Remove an arbitrary from the prioq, returning it's data */
|
||||||
void* pa_prioq_remove(pa_prioq*q, pa_prioq_item *i);
|
void* pa_prioq_remove(pa_prioq*q, pa_prioq_item *i);
|
||||||
|
|
||||||
/* The priority of an item was modified. Adjust the queue to that */
|
/* The priority of an item was modified. Adjust the queue to that */
|
||||||
|
|
|
||||||
|
|
@ -291,7 +291,7 @@ enum find_result_t {
|
||||||
* mode doesn't match the call. */
|
* mode doesn't match the call. */
|
||||||
PROPERTY_ACCESS_DENIED,
|
PROPERTY_ACCESS_DENIED,
|
||||||
|
|
||||||
/* The new value signature of a .Set call didn't match the expexted
|
/* The new value signature of a .Set call didn't match the expected
|
||||||
* signature. */
|
* signature. */
|
||||||
INVALID_PROPERTY_SIG,
|
INVALID_PROPERTY_SIG,
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1019,7 +1019,7 @@ static int do_read(connection *c) {
|
||||||
c->request = PA_MAYBE_INT32_SWAP(c->swap_byte_order, c->request);
|
c->request = PA_MAYBE_INT32_SWAP(c->swap_byte_order, c->request);
|
||||||
|
|
||||||
if (c->request < ESD_PROTO_CONNECT || c->request >= ESD_PROTO_MAX) {
|
if (c->request < ESD_PROTO_CONNECT || c->request >= ESD_PROTO_MAX) {
|
||||||
pa_log("recieved invalid request.");
|
pa_log("received invalid request.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1028,7 +1028,7 @@ static int do_read(connection *c) {
|
||||||
/* pa_log("executing request #%u", c->request); */
|
/* pa_log("executing request #%u", c->request); */
|
||||||
|
|
||||||
if (!handler->proc) {
|
if (!handler->proc) {
|
||||||
pa_log("recieved unimplemented request #%u.", c->request);
|
pa_log("received unimplemented request #%u.", c->request);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -953,9 +953,9 @@ static void fix_playback_buffer_attr(playback_stream *s) {
|
||||||
* half the latency will be spent on the hw buffer, the other
|
* half the latency will be spent on the hw buffer, the other
|
||||||
* half of it in the async buffer queue we maintain for each
|
* half of it in the async buffer queue we maintain for each
|
||||||
* client. In between we'll have a safety space of size
|
* client. In between we'll have a safety space of size
|
||||||
* 2*minreq. Why the 2*minreq? When the hw buffer is completey
|
* 2*minreq. Why the 2*minreq? When the hw buffer is completely
|
||||||
* empty and needs to be filled, then our buffer must have
|
* empty and needs to be filled, then our buffer must have
|
||||||
* enough data to fulfill this request immediatly and thus
|
* enough data to fulfill this request immediately and thus
|
||||||
* have at least the same tlength as the size of the hw
|
* have at least the same tlength as the size of the hw
|
||||||
* buffer. It additionally needs space for 2 times minreq
|
* buffer. It additionally needs space for 2 times minreq
|
||||||
* because if the buffer ran empty and a partial fillup
|
* because if the buffer ran empty and a partial fillup
|
||||||
|
|
@ -1110,7 +1110,7 @@ static playback_stream* playback_stream_new(
|
||||||
pa_sink_input_new_data_set_channel_map(&data, map);
|
pa_sink_input_new_data_set_channel_map(&data, map);
|
||||||
if (formats) {
|
if (formats) {
|
||||||
pa_sink_input_new_data_set_formats(&data, formats);
|
pa_sink_input_new_data_set_formats(&data, formats);
|
||||||
/* Ownership transferred to new_data, so we don't free it ourseleves */
|
/* Ownership transferred to new_data, so we don't free it ourselves */
|
||||||
formats = NULL;
|
formats = NULL;
|
||||||
}
|
}
|
||||||
if (volume) {
|
if (volume) {
|
||||||
|
|
@ -1385,7 +1385,7 @@ static void handle_seek(playback_stream *s, int64_t indexw) {
|
||||||
|
|
||||||
if (indexw < indexr) {
|
if (indexw < indexr) {
|
||||||
/* OK, the sink already asked for this data, so
|
/* OK, the sink already asked for this data, so
|
||||||
* let's have it usk us again */
|
* let's have it ask us again */
|
||||||
|
|
||||||
pa_log_debug("Requesting rewind due to rewrite.");
|
pa_log_debug("Requesting rewind due to rewrite.");
|
||||||
pa_sink_input_request_rewind(s->sink_input, (size_t) (indexr - indexw), TRUE, FALSE, FALSE);
|
pa_sink_input_request_rewind(s->sink_input, (size_t) (indexr - indexw), TRUE, FALSE, FALSE);
|
||||||
|
|
@ -2099,7 +2099,7 @@ static void command_create_playback_stream(pa_pdispatch *pd, uint32_t command, u
|
||||||
(fail_on_suspend ? PA_SINK_INPUT_NO_CREATE_ON_SUSPEND|PA_SINK_INPUT_KILL_ON_SUSPEND : 0) |
|
(fail_on_suspend ? PA_SINK_INPUT_NO_CREATE_ON_SUSPEND|PA_SINK_INPUT_KILL_ON_SUSPEND : 0) |
|
||||||
(passthrough ? PA_SINK_INPUT_PASSTHROUGH : 0);
|
(passthrough ? PA_SINK_INPUT_PASSTHROUGH : 0);
|
||||||
|
|
||||||
/* Only since protocol version 15 there's a seperate muted_set
|
/* Only since protocol version 15 there's a separate muted_set
|
||||||
* flag. For older versions we synthesize it here */
|
* flag. For older versions we synthesize it here */
|
||||||
muted_set = muted_set || muted;
|
muted_set = muted_set || muted;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ enum {
|
||||||
enum {
|
enum {
|
||||||
CONNECTION_MESSAGE_REQUEST_DATA, /* data requested from sink input from the main loop */
|
CONNECTION_MESSAGE_REQUEST_DATA, /* data requested from sink input from the main loop */
|
||||||
CONNECTION_MESSAGE_POST_DATA, /* data from source output to main loop */
|
CONNECTION_MESSAGE_POST_DATA, /* data from source output to main loop */
|
||||||
CONNECTION_MESSAGE_UNLINK_CONNECTION /* Please drop a aconnection now */
|
CONNECTION_MESSAGE_UNLINK_CONNECTION /* Please drop the connection now */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define PLAYBACK_BUFFER_SECONDS (.5)
|
#define PLAYBACK_BUFFER_SECONDS (.5)
|
||||||
|
|
|
||||||
|
|
@ -645,7 +645,7 @@ static void calc_map_table(pa_resampler *r) {
|
||||||
* volume will not match, and the two channels will be a
|
* volume will not match, and the two channels will be a
|
||||||
* linear combination of both.
|
* linear combination of both.
|
||||||
*
|
*
|
||||||
* This is losely based on random suggestions found on the
|
* This is loosely based on random suggestions found on the
|
||||||
* Internet, such as this:
|
* Internet, such as this:
|
||||||
* http://www.halfgaar.net/surround-sound-in-linux and the
|
* http://www.halfgaar.net/surround-sound-in-linux and the
|
||||||
* alsa upmix plugin.
|
* alsa upmix plugin.
|
||||||
|
|
@ -840,7 +840,7 @@ static void calc_map_table(pa_resampler *r) {
|
||||||
/* OK, so there are unconnected input channels on the
|
/* OK, so there are unconnected input channels on the
|
||||||
* left. Let's multiply all already connected channels on
|
* left. Let's multiply all already connected channels on
|
||||||
* the left side by .9 and add in our averaged unconnected
|
* the left side by .9 and add in our averaged unconnected
|
||||||
* channels multplied by .1 */
|
* channels multiplied by .1 */
|
||||||
|
|
||||||
for (oc = 0; oc < n_oc; oc++) {
|
for (oc = 0; oc < n_oc; oc++) {
|
||||||
|
|
||||||
|
|
@ -865,7 +865,7 @@ static void calc_map_table(pa_resampler *r) {
|
||||||
/* OK, so there are unconnected input channels on the
|
/* OK, so there are unconnected input channels on the
|
||||||
* right. Let's multiply all already connected channels on
|
* right. Let's multiply all already connected channels on
|
||||||
* the right side by .9 and add in our averaged unconnected
|
* the right side by .9 and add in our averaged unconnected
|
||||||
* channels multplied by .1 */
|
* channels multiplied by .1 */
|
||||||
|
|
||||||
for (oc = 0; oc < n_oc; oc++) {
|
for (oc = 0; oc < n_oc; oc++) {
|
||||||
|
|
||||||
|
|
@ -891,7 +891,7 @@ static void calc_map_table(pa_resampler *r) {
|
||||||
/* OK, so there are unconnected input channels on the
|
/* OK, so there are unconnected input channels on the
|
||||||
* center. Let's multiply all already connected channels on
|
* center. Let's multiply all already connected channels on
|
||||||
* the center side by .9 and add in our averaged unconnected
|
* the center side by .9 and add in our averaged unconnected
|
||||||
* channels multplied by .1 */
|
* channels multiplied by .1 */
|
||||||
|
|
||||||
for (oc = 0; oc < n_oc; oc++) {
|
for (oc = 0; oc < n_oc; oc++) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ typedef struct pa_rtpoll pa_rtpoll;
|
||||||
typedef struct pa_rtpoll_item pa_rtpoll_item;
|
typedef struct pa_rtpoll_item pa_rtpoll_item;
|
||||||
|
|
||||||
typedef enum pa_rtpoll_priority {
|
typedef enum pa_rtpoll_priority {
|
||||||
PA_RTPOLL_EARLY = -100, /* For veeery important stuff, like handling control messages */
|
PA_RTPOLL_EARLY = -100, /* For very important stuff, like handling control messages */
|
||||||
PA_RTPOLL_NORMAL = 0, /* For normal stuff */
|
PA_RTPOLL_NORMAL = 0, /* For normal stuff */
|
||||||
PA_RTPOLL_LATE = +100, /* For housekeeping */
|
PA_RTPOLL_LATE = +100, /* For housekeeping */
|
||||||
PA_RTPOLL_NEVER = INT_MAX, /* For stuff that doesn't register any callbacks, but only fds to listen on */
|
PA_RTPOLL_NEVER = INT_MAX, /* For stuff that doesn't register any callbacks, but only fds to listen on */
|
||||||
|
|
@ -88,13 +88,12 @@ struct pollfd *pa_rtpoll_item_get_pollfd(pa_rtpoll_item *i, unsigned *n_fds);
|
||||||
|
|
||||||
/* Set the callback that shall be called when there's time to do some work: If the
|
/* Set the callback that shall be called when there's time to do some work: If the
|
||||||
* callback returns a value > 0, the poll is skipped and the next
|
* callback returns a value > 0, the poll is skipped and the next
|
||||||
* iteraton of the loop will start immediately. */
|
* iteration of the loop will start immediately. */
|
||||||
void pa_rtpoll_item_set_work_callback(pa_rtpoll_item *i, int (*work_cb)(pa_rtpoll_item *i));
|
void pa_rtpoll_item_set_work_callback(pa_rtpoll_item *i, int (*work_cb)(pa_rtpoll_item *i));
|
||||||
|
|
||||||
/* Set the callback that shall be called immediately before entering
|
/* Set the callback that shall be called immediately before entering
|
||||||
* the sleeping poll: If the callback returns a value > 0, the poll is
|
* the sleeping poll: If the callback returns a value > 0, the poll is
|
||||||
* skipped and the next iteraton of the loop will start
|
* skipped and the next iteration of the loop will start immediately. */
|
||||||
* immediately.. */
|
|
||||||
void pa_rtpoll_item_set_before_callback(pa_rtpoll_item *i, int (*before_cb)(pa_rtpoll_item *i));
|
void pa_rtpoll_item_set_before_callback(pa_rtpoll_item *i, int (*before_cb)(pa_rtpoll_item *i));
|
||||||
|
|
||||||
/* Set the callback that shall be called immediately after having
|
/* Set the callback that shall be called immediately after having
|
||||||
|
|
|
||||||
|
|
@ -231,7 +231,7 @@ size_t pa_mix(
|
||||||
/* Multiplying the 32bit volume factor with the
|
/* Multiplying the 32bit volume factor with the
|
||||||
* 16bit sample might result in an 48bit value. We
|
* 16bit sample might result in an 48bit value. We
|
||||||
* want to do without 64 bit integers and hence do
|
* want to do without 64 bit integers and hence do
|
||||||
* the multiplication independantly for the HI and
|
* the multiplication independently for the HI and
|
||||||
* LO part of the volume. */
|
* LO part of the volume. */
|
||||||
|
|
||||||
hi = cv >> 16;
|
hi = cv >> 16;
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@
|
||||||
/* We now put this SHM marker at the end of each segment. It's
|
/* We now put this SHM marker at the end of each segment. It's
|
||||||
* optional, to not require a reboot when upgrading, though. Note that
|
* optional, to not require a reboot when upgrading, though. Note that
|
||||||
* on multiarch systems 32bit and 64bit processes might access this
|
* on multiarch systems 32bit and 64bit processes might access this
|
||||||
* region simultaneously. The header fields need to be independant
|
* region simultaneously. The header fields need to be independent
|
||||||
* from the process' word with */
|
* from the process' word with */
|
||||||
struct shm_marker {
|
struct shm_marker {
|
||||||
pa_atomic_t marker; /* 0xbeefcafe */
|
pa_atomic_t marker; /* 0xbeefcafe */
|
||||||
|
|
|
||||||
|
|
@ -144,11 +144,11 @@ struct pa_sink_input {
|
||||||
* changes. Called from IO context. */
|
* changes. Called from IO context. */
|
||||||
void (*update_sink_requested_latency) (pa_sink_input *i); /* may be NULL */
|
void (*update_sink_requested_latency) (pa_sink_input *i); /* may be NULL */
|
||||||
|
|
||||||
/* Called whenver the latency range of the sink changes. Called
|
/* Called whenever the latency range of the sink changes. Called
|
||||||
* from IO context. */
|
* from IO context. */
|
||||||
void (*update_sink_latency_range) (pa_sink_input *i); /* may be NULL */
|
void (*update_sink_latency_range) (pa_sink_input *i); /* may be NULL */
|
||||||
|
|
||||||
/* Called whenver the fixed latency of the sink changes, if there
|
/* Called whenever the fixed latency of the sink changes, if there
|
||||||
* is one. Called from IO context. */
|
* is one. Called from IO context. */
|
||||||
void (*update_sink_fixed_latency) (pa_sink_input *i); /* may be NULL */
|
void (*update_sink_fixed_latency) (pa_sink_input *i); /* may be NULL */
|
||||||
|
|
||||||
|
|
@ -183,7 +183,7 @@ struct pa_sink_input {
|
||||||
* context. */
|
* context. */
|
||||||
void (*kill) (pa_sink_input *i); /* may NOT be NULL */
|
void (*kill) (pa_sink_input *i); /* may NOT be NULL */
|
||||||
|
|
||||||
/* Return the current latency (i.e. length of bufferd audio) of
|
/* Return the current latency (i.e. length of buffered audio) of
|
||||||
this stream. Called from main context. This is added to what the
|
this stream. Called from main context. This is added to what the
|
||||||
PA_SINK_INPUT_MESSAGE_GET_LATENCY message sent to the IO thread
|
PA_SINK_INPUT_MESSAGE_GET_LATENCY message sent to the IO thread
|
||||||
returns */
|
returns */
|
||||||
|
|
@ -368,7 +368,7 @@ int pa_sink_input_move_to(pa_sink_input *i, pa_sink *dest, pa_bool_t save);
|
||||||
pa_bool_t pa_sink_input_may_move(pa_sink_input *i); /* may this sink input move at all? */
|
pa_bool_t pa_sink_input_may_move(pa_sink_input *i); /* may this sink input move at all? */
|
||||||
pa_bool_t pa_sink_input_may_move_to(pa_sink_input *i, pa_sink *dest); /* may this sink input move to this sink? */
|
pa_bool_t pa_sink_input_may_move_to(pa_sink_input *i, pa_sink *dest); /* may this sink input move to this sink? */
|
||||||
|
|
||||||
/* The same as pa_sink_input_move_to() but in two seperate steps,
|
/* The same as pa_sink_input_move_to() but in two separate steps,
|
||||||
* first the detaching from the old sink, then the attaching to the
|
* first the detaching from the old sink, then the attaching to the
|
||||||
* new sink */
|
* new sink */
|
||||||
int pa_sink_input_start_move(pa_sink_input *i);
|
int pa_sink_input_start_move(pa_sink_input *i);
|
||||||
|
|
|
||||||
|
|
@ -427,7 +427,7 @@ static int sink_set_state(pa_sink *s, pa_sink_state_t state) {
|
||||||
|
|
||||||
s->state = state;
|
s->state = state;
|
||||||
|
|
||||||
if (state != PA_SINK_UNLINKED) { /* if we enter UNLINKED state pa_sink_unlink() will fire the apropriate events */
|
if (state != PA_SINK_UNLINKED) { /* if we enter UNLINKED state pa_sink_unlink() will fire the appropriate events */
|
||||||
pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_STATE_CHANGED], s);
|
pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SINK_STATE_CHANGED], s);
|
||||||
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SINK | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
||||||
}
|
}
|
||||||
|
|
@ -1782,7 +1782,7 @@ static pa_bool_t update_reference_volume(pa_sink *s, const pa_cvolume *v, const
|
||||||
* due to rounding errors. If that happens, we still want to propagate
|
* due to rounding errors. If that happens, we still want to propagate
|
||||||
* the changed root sink volume to the sinks connected to the
|
* the changed root sink volume to the sinks connected to the
|
||||||
* intermediate sink that didn't change its volume. This theoretical
|
* intermediate sink that didn't change its volume. This theoretical
|
||||||
* possiblity is the reason why we have that !(s->flags &
|
* possibility is the reason why we have that !(s->flags &
|
||||||
* PA_SINK_SHARE_VOLUME_WITH_MASTER) condition. Probably nobody would
|
* PA_SINK_SHARE_VOLUME_WITH_MASTER) condition. Probably nobody would
|
||||||
* notice even if we returned here FALSE always if
|
* notice even if we returned here FALSE always if
|
||||||
* reference_volume_changed is FALSE. */
|
* reference_volume_changed is FALSE. */
|
||||||
|
|
@ -2155,7 +2155,7 @@ unsigned pa_sink_linked_by(pa_sink *s) {
|
||||||
ret = pa_idxset_size(s->inputs);
|
ret = pa_idxset_size(s->inputs);
|
||||||
|
|
||||||
/* We add in the number of streams connected to us here. Please
|
/* We add in the number of streams connected to us here. Please
|
||||||
* note the asymmmetry to pa_sink_used_by()! */
|
* note the asymmetry to pa_sink_used_by()! */
|
||||||
|
|
||||||
if (s->monitor_source)
|
if (s->monitor_source)
|
||||||
ret += pa_source_linked_by(s->monitor_source);
|
ret += pa_source_linked_by(s->monitor_source);
|
||||||
|
|
@ -2202,7 +2202,7 @@ unsigned pa_sink_check_suspend(pa_sink *s) {
|
||||||
/* We do not assert here. It is perfectly valid for a sink input to
|
/* We do not assert here. It is perfectly valid for a sink input to
|
||||||
* be in the INIT state (i.e. created, marked done but not yet put)
|
* be in the INIT state (i.e. created, marked done but not yet put)
|
||||||
* and we should not care if it's unlinked as it won't contribute
|
* and we should not care if it's unlinked as it won't contribute
|
||||||
* towarards our busy status.
|
* towards our busy status.
|
||||||
*/
|
*/
|
||||||
if (!PA_SINK_INPUT_IS_LINKED(st))
|
if (!PA_SINK_INPUT_IS_LINKED(st))
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@ int pa_sndfile_read_channel_map(SNDFILE *sf, pa_channel_map *cm) {
|
||||||
|
|
||||||
static const pa_channel_position_t table[] = {
|
static const pa_channel_position_t table[] = {
|
||||||
[SF_CHANNEL_MAP_MONO] = PA_CHANNEL_POSITION_MONO,
|
[SF_CHANNEL_MAP_MONO] = PA_CHANNEL_POSITION_MONO,
|
||||||
[SF_CHANNEL_MAP_LEFT] = PA_CHANNEL_POSITION_FRONT_LEFT, /* libsndfile distuingishes left und front-left, which we don't */
|
[SF_CHANNEL_MAP_LEFT] = PA_CHANNEL_POSITION_FRONT_LEFT, /* libsndfile distinguishes left and front-left, which we don't */
|
||||||
[SF_CHANNEL_MAP_RIGHT] = PA_CHANNEL_POSITION_FRONT_RIGHT,
|
[SF_CHANNEL_MAP_RIGHT] = PA_CHANNEL_POSITION_FRONT_RIGHT,
|
||||||
[SF_CHANNEL_MAP_CENTER] = PA_CHANNEL_POSITION_FRONT_CENTER,
|
[SF_CHANNEL_MAP_CENTER] = PA_CHANNEL_POSITION_FRONT_CENTER,
|
||||||
[SF_CHANNEL_MAP_FRONT_LEFT] = PA_CHANNEL_POSITION_FRONT_LEFT,
|
[SF_CHANNEL_MAP_FRONT_LEFT] = PA_CHANNEL_POSITION_FRONT_LEFT,
|
||||||
|
|
|
||||||
|
|
@ -124,11 +124,11 @@ struct pa_source_output {
|
||||||
* changes. Called from IO context. */
|
* changes. Called from IO context. */
|
||||||
void (*update_source_requested_latency) (pa_source_output *o); /* may be NULL */
|
void (*update_source_requested_latency) (pa_source_output *o); /* may be NULL */
|
||||||
|
|
||||||
/* Called whenver the latency range of the source changes. Called
|
/* Called whenever the latency range of the source changes. Called
|
||||||
* from IO context. */
|
* from IO context. */
|
||||||
void (*update_source_latency_range) (pa_source_output *o); /* may be NULL */
|
void (*update_source_latency_range) (pa_source_output *o); /* may be NULL */
|
||||||
|
|
||||||
/* Called whenver the fixed latency of the source changes, if there
|
/* Called whenever the fixed latency of the source changes, if there
|
||||||
* is one. Called from IO context. */
|
* is one. Called from IO context. */
|
||||||
void (*update_source_fixed_latency) (pa_source_output *i); /* may be NULL */
|
void (*update_source_fixed_latency) (pa_source_output *i); /* may be NULL */
|
||||||
|
|
||||||
|
|
@ -163,7 +163,7 @@ struct pa_source_output {
|
||||||
* context. */
|
* context. */
|
||||||
void (*kill)(pa_source_output* o); /* may NOT be NULL */
|
void (*kill)(pa_source_output* o); /* may NOT be NULL */
|
||||||
|
|
||||||
/* Return the current latency (i.e. length of bufferd audio) of
|
/* Return the current latency (i.e. length of buffered audio) of
|
||||||
this stream. Called from main context. This is added to what the
|
this stream. Called from main context. This is added to what the
|
||||||
PA_SOURCE_OUTPUT_MESSAGE_GET_LATENCY message sent to the IO thread
|
PA_SOURCE_OUTPUT_MESSAGE_GET_LATENCY message sent to the IO thread
|
||||||
returns */
|
returns */
|
||||||
|
|
@ -306,7 +306,7 @@ size_t pa_source_output_get_max_rewind(pa_source_output *o);
|
||||||
|
|
||||||
/* Callable by everyone */
|
/* Callable by everyone */
|
||||||
|
|
||||||
/* External code may request disconnection with this funcion */
|
/* External code may request disconnection with this function */
|
||||||
void pa_source_output_kill(pa_source_output*o);
|
void pa_source_output_kill(pa_source_output*o);
|
||||||
|
|
||||||
pa_usec_t pa_source_output_get_latency(pa_source_output *o, pa_usec_t *source_latency);
|
pa_usec_t pa_source_output_get_latency(pa_source_output *o, pa_usec_t *source_latency);
|
||||||
|
|
@ -329,7 +329,7 @@ pa_bool_t pa_source_output_may_move(pa_source_output *o);
|
||||||
pa_bool_t pa_source_output_may_move_to(pa_source_output *o, pa_source *dest);
|
pa_bool_t pa_source_output_may_move_to(pa_source_output *o, pa_source *dest);
|
||||||
int pa_source_output_move_to(pa_source_output *o, pa_source *dest, pa_bool_t save);
|
int pa_source_output_move_to(pa_source_output *o, pa_source *dest, pa_bool_t save);
|
||||||
|
|
||||||
/* The same as pa_source_output_move_to() but in two seperate steps,
|
/* The same as pa_source_output_move_to() but in two separate steps,
|
||||||
* first the detaching from the old source, then the attaching to the
|
* first the detaching from the old source, then the attaching to the
|
||||||
* new source */
|
* new source */
|
||||||
int pa_source_output_start_move(pa_source_output *o);
|
int pa_source_output_start_move(pa_source_output *o);
|
||||||
|
|
|
||||||
|
|
@ -361,7 +361,7 @@ static int source_set_state(pa_source *s, pa_source_state_t state) {
|
||||||
|
|
||||||
s->state = state;
|
s->state = state;
|
||||||
|
|
||||||
if (state != PA_SOURCE_UNLINKED) { /* if we enter UNLINKED state pa_source_unlink() will fire the apropriate events */
|
if (state != PA_SOURCE_UNLINKED) { /* if we enter UNLINKED state pa_source_unlink() will fire the appropriate events */
|
||||||
pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_STATE_CHANGED], s);
|
pa_hook_fire(&s->core->hooks[PA_CORE_HOOK_SOURCE_STATE_CHANGED], s);
|
||||||
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
pa_subscription_post(s->core, PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_CHANGE, s->index);
|
||||||
}
|
}
|
||||||
|
|
@ -1181,7 +1181,7 @@ static void get_maximum_output_volume(pa_source *s, pa_cvolume *max_volume, cons
|
||||||
|
|
||||||
/* Ignore this output. The origin source uses volume sharing, so this
|
/* Ignore this output. The origin source uses volume sharing, so this
|
||||||
* output's volume will be set to be equal to the root source's real
|
* output's volume will be set to be equal to the root source's real
|
||||||
* volume. Obviously this outputs's current volume must not then
|
* volume. Obviously this output's current volume must not then
|
||||||
* affect what the root source's real volume will be. */
|
* affect what the root source's real volume will be. */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -1358,7 +1358,7 @@ static pa_bool_t update_reference_volume(pa_source *s, const pa_cvolume *v, cons
|
||||||
* due to rounding errors. If that happens, we still want to propagate
|
* due to rounding errors. If that happens, we still want to propagate
|
||||||
* the changed root source volume to the sources connected to the
|
* the changed root source volume to the sources connected to the
|
||||||
* intermediate source that didn't change its volume. This theoretical
|
* intermediate source that didn't change its volume. This theoretical
|
||||||
* possiblity is the reason why we have that !(s->flags &
|
* possibility is the reason why we have that !(s->flags &
|
||||||
* PA_SOURCE_SHARE_VOLUME_WITH_MASTER) condition. Probably nobody would
|
* PA_SOURCE_SHARE_VOLUME_WITH_MASTER) condition. Probably nobody would
|
||||||
* notice even if we returned here FALSE always if
|
* notice even if we returned here FALSE always if
|
||||||
* reference_volume_changed is FALSE. */
|
* reference_volume_changed is FALSE. */
|
||||||
|
|
@ -1757,7 +1757,7 @@ unsigned pa_source_check_suspend(pa_source *s) {
|
||||||
/* We do not assert here. It is perfectly valid for a source output to
|
/* We do not assert here. It is perfectly valid for a source output to
|
||||||
* be in the INIT state (i.e. created, marked done but not yet put)
|
* be in the INIT state (i.e. created, marked done but not yet put)
|
||||||
* and we should not care if it's unlinked as it won't contribute
|
* and we should not care if it's unlinked as it won't contribute
|
||||||
* towarards our busy status.
|
* towards our busy status.
|
||||||
*/
|
*/
|
||||||
if (!PA_SOURCE_OUTPUT_IS_LINKED(st))
|
if (!PA_SOURCE_OUTPUT_IS_LINKED(st))
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@ struct pa_source {
|
||||||
* inhibited */
|
* inhibited */
|
||||||
int (*set_state)(pa_source*source, pa_source_state_t state); /* may be NULL */
|
int (*set_state)(pa_source*source, pa_source_state_t state); /* may be NULL */
|
||||||
|
|
||||||
/* Callled when the volume is queried. Called from main loop
|
/* Called when the volume is queried. Called from main loop
|
||||||
* context. If this is NULL a PA_SOURCE_MESSAGE_GET_VOLUME message
|
* context. If this is NULL a PA_SOURCE_MESSAGE_GET_VOLUME message
|
||||||
* will be sent to the IO thread instead. If refresh_volume is
|
* will be sent to the IO thread instead. If refresh_volume is
|
||||||
* FALSE neither this function is called nor a message is sent.
|
* FALSE neither this function is called nor a message is sent.
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ pa_strlist* pa_strlist_prepend(pa_strlist *l, const char *s);
|
||||||
/* Remove the specified string from the list, return the new linked list head */
|
/* Remove the specified string from the list, return the new linked list head */
|
||||||
pa_strlist* pa_strlist_remove(pa_strlist *l, const char *s);
|
pa_strlist* pa_strlist_remove(pa_strlist *l, const char *s);
|
||||||
|
|
||||||
/* Make a whitespace separated string of all server stringes. Returned memory has to be freed with pa_xfree() */
|
/* Make a whitespace separated string of all server strings. Returned memory has to be freed with pa_xfree() */
|
||||||
char *pa_strlist_tostring(pa_strlist *l);
|
char *pa_strlist_tostring(pa_strlist *l);
|
||||||
|
|
||||||
/* Free the entire list */
|
/* Free the entire list */
|
||||||
|
|
|
||||||
|
|
@ -99,7 +99,7 @@ static void pa_volume_s16ne_c(int16_t *samples, int32_t *volumes, unsigned chann
|
||||||
/* Multiplying the 32bit volume factor with the 16bit
|
/* Multiplying the 32bit volume factor with the 16bit
|
||||||
* sample might result in an 48bit value. We want to
|
* sample might result in an 48bit value. We want to
|
||||||
* do without 64 bit integers and hence do the
|
* do without 64 bit integers and hence do the
|
||||||
* multiplication independantly for the HI and LO part
|
* multiplication independently for the HI and LO part
|
||||||
* of the volume. */
|
* of the volume. */
|
||||||
|
|
||||||
hi = volumes[channel] >> 16;
|
hi = volumes[channel] >> 16;
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
* out s: contains scaled and clamped int16_t samples.
|
* out s: contains scaled and clamped int16_t samples.
|
||||||
*
|
*
|
||||||
* We calculate the high 32 bits of a 32x16 multiply which we then
|
* We calculate the high 32 bits of a 32x16 multiply which we then
|
||||||
* clamp to 16 bits. The calulcation is:
|
* clamp to 16 bits. The calculation is:
|
||||||
*
|
*
|
||||||
* vl = (v & 0xffff)
|
* vl = (v & 0xffff)
|
||||||
* vh = (v >> 16)
|
* vh = (v >> 16)
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
* Implementation of a time smoothing algorithm to synchronize remote
|
* Implementation of a time smoothing algorithm to synchronize remote
|
||||||
* clocks to a local one. Evens out noise, adjusts to clock skew and
|
* clocks to a local one. Evens out noise, adjusts to clock skew and
|
||||||
* allows cheap estimations of the remote time while clock updates may
|
* allows cheap estimations of the remote time while clock updates may
|
||||||
* be seldom and recieved in non-equidistant intervals.
|
* be seldom and received in non-equidistant intervals.
|
||||||
*
|
*
|
||||||
* Basically, we estimate the gradient of received clock samples in a
|
* Basically, we estimate the gradient of received clock samples in a
|
||||||
* certain history window (of size 'history_time') with linear
|
* certain history window (of size 'history_time') with linear
|
||||||
|
|
@ -48,7 +48,7 @@
|
||||||
* towards that point with a 3rd order polynomial interpolation with
|
* towards that point with a 3rd order polynomial interpolation with
|
||||||
* fitting derivatives. (more or less a b-spline)
|
* fitting derivatives. (more or less a b-spline)
|
||||||
*
|
*
|
||||||
* The larger 'history_time' is chosen the better we will surpress
|
* The larger 'history_time' is chosen the better we will suppress
|
||||||
* noise -- but we'll adjust to clock skew slower..
|
* noise -- but we'll adjust to clock skew slower..
|
||||||
*
|
*
|
||||||
* The larger 'adjust_time' is chosen the smoother our estimation
|
* The larger 'adjust_time' is chosen the smoother our estimation
|
||||||
|
|
@ -83,7 +83,7 @@ struct pa_smoother {
|
||||||
|
|
||||||
pa_bool_t monotonic:1;
|
pa_bool_t monotonic:1;
|
||||||
pa_bool_t paused:1;
|
pa_bool_t paused:1;
|
||||||
pa_bool_t smoothing:1; /* If FALSE we skip the polonyomial interpolation step */
|
pa_bool_t smoothing:1; /* If FALSE we skip the polynomial interpolation step */
|
||||||
|
|
||||||
pa_usec_t pause_time;
|
pa_usec_t pause_time;
|
||||||
|
|
||||||
|
|
@ -264,7 +264,7 @@ static void calc_abc(pa_smoother *s) {
|
||||||
|
|
||||||
pa_assert(ex < px);
|
pa_assert(ex < px);
|
||||||
|
|
||||||
/* To increase the dynamic range and symplify calculation, we
|
/* To increase the dynamic range and simplify calculation, we
|
||||||
* move these values to the origin */
|
* move these values to the origin */
|
||||||
kx = (int64_t) px - (int64_t) ex;
|
kx = (int64_t) px - (int64_t) ex;
|
||||||
ky = (int64_t) py - (int64_t) ey;
|
ky = (int64_t) py - (int64_t) ey;
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
* int16_t, int32_t, float. The vector type is a union. The fields .i,
|
* int16_t, int32_t, float. The vector type is a union. The fields .i,
|
||||||
* .u, .f are arrays for accessing the separate elements of a
|
* .u, .f are arrays for accessing the separate elements of a
|
||||||
* vector. .v is a gcc vector type of the right format. .m is the
|
* vector. .v is a gcc vector type of the right format. .m is the
|
||||||
* vector in the type the SIMD extenstion specific intrinsics API
|
* vector in the type the SIMD extension specific intrinsic API
|
||||||
* expects. PA_xxx_VECTOR_SIZE is the size of the
|
* expects. PA_xxx_VECTOR_SIZE is the size of the
|
||||||
* entries. PA_xxxx_VECTOR_MAKE constructs a gcc vector variable with
|
* entries. PA_xxxx_VECTOR_MAKE constructs a gcc vector variable with
|
||||||
* the same value in all elements. */
|
* the same value in all elements. */
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ typedef int (*pa_x11_event_cb_t)(pa_x11_wrapper *w, XEvent *e, void *userdata);
|
||||||
typedef void (*pa_x11_kill_cb_t)(pa_x11_wrapper *w, void *userdata);
|
typedef void (*pa_x11_kill_cb_t)(pa_x11_wrapper *w, void *userdata);
|
||||||
|
|
||||||
/* Return the X11 wrapper for this core. In case no wrapper was
|
/* Return the X11 wrapper for this core. In case no wrapper was
|
||||||
existant before, allocate a new one */
|
existent before, allocate a new one */
|
||||||
pa_x11_wrapper* pa_x11_wrapper_get(pa_core *c, const char *name);
|
pa_x11_wrapper* pa_x11_wrapper_get(pa_core *c, const char *name);
|
||||||
|
|
||||||
/* Increase the wrapper's reference count by one */
|
/* Increase the wrapper's reference count by one */
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ int main(int argc, char *argv[]) {
|
||||||
pa_assert(pa_format_info_is_compatible(f1, f2));
|
pa_assert(pa_format_info_is_compatible(f1, f2));
|
||||||
pa_assert(pa_format_info_is_compatible(f2, f1));
|
pa_assert(pa_format_info_is_compatible(f2, f1));
|
||||||
|
|
||||||
/* 3. Check int array memebership - negative */
|
/* 3. Check int array membership - negative */
|
||||||
REINIT(f2);
|
REINIT(f2);
|
||||||
f2->encoding = PA_ENCODING_AC3_IEC61937;
|
f2->encoding = PA_ENCODING_AC3_IEC61937;
|
||||||
pa_format_info_set_prop_int(f2, PA_PROP_FORMAT_RATE, 96000);
|
pa_format_info_set_prop_int(f2, PA_PROP_FORMAT_RATE, 96000);
|
||||||
|
|
@ -92,7 +92,7 @@ int main(int argc, char *argv[]) {
|
||||||
pa_assert(pa_format_info_is_compatible(f1, f2));
|
pa_assert(pa_format_info_is_compatible(f1, f2));
|
||||||
pa_assert(pa_format_info_is_compatible(f2, f1));
|
pa_assert(pa_format_info_is_compatible(f2, f1));
|
||||||
|
|
||||||
/* 8. Check string array memebership - negative */
|
/* 8. Check string array membership - negative */
|
||||||
REINIT(f2);
|
REINIT(f2);
|
||||||
f2->encoding = PA_ENCODING_AC3_IEC61937;
|
f2->encoding = PA_ENCODING_AC3_IEC61937;
|
||||||
pa_format_info_set_prop_string(f2, "format.test_string", "thing5");
|
pa_format_info_set_prop_string(f2, "format.test_string", "thing5");
|
||||||
|
|
|
||||||
|
|
@ -158,13 +158,13 @@ int main(int argc, char *argv[]) {
|
||||||
pa_memexport_free(export_a);
|
pa_memexport_free(export_a);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("vaccuuming...\n");
|
printf("vacuuming...\n");
|
||||||
|
|
||||||
pa_mempool_vacuum(pool_a);
|
pa_mempool_vacuum(pool_a);
|
||||||
pa_mempool_vacuum(pool_b);
|
pa_mempool_vacuum(pool_b);
|
||||||
pa_mempool_vacuum(pool_c);
|
pa_mempool_vacuum(pool_c);
|
||||||
|
|
||||||
printf("vaccuuming done...\n");
|
printf("vacuuming done...\n");
|
||||||
|
|
||||||
pa_mempool_free(pool_a);
|
pa_mempool_free(pool_a);
|
||||||
pa_mempool_free(pool_b);
|
pa_mempool_free(pool_b);
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ int main(int argc, char *argv[]) {
|
||||||
unsigned mdn = 0;
|
unsigned mdn = 0;
|
||||||
|
|
||||||
printf("Attenuation of sample 1 against 32767: %g dB\n", 20.0*log10(1.0/32767.0));
|
printf("Attenuation of sample 1 against 32767: %g dB\n", 20.0*log10(1.0/32767.0));
|
||||||
printf("Smallest possible attenutation > 0 applied to 32767: %li\n", lrint(32767.0*pa_sw_volume_to_linear(1)));
|
printf("Smallest possible attenuation > 0 applied to 32767: %li\n", lrint(32767.0*pa_sw_volume_to_linear(1)));
|
||||||
|
|
||||||
for (v = PA_VOLUME_MUTED; v <= PA_VOLUME_NORM*2; v += 256) {
|
for (v = PA_VOLUME_MUTED; v <= PA_VOLUME_NORM*2; v += 256) {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -577,7 +577,7 @@ static void stdout_callback(pa_mainloop_api*a, pa_io_event *e, int fd, pa_io_eve
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* UNIX signal to quit recieved */
|
/* UNIX signal to quit received */
|
||||||
static void exit_signal_callback(pa_mainloop_api*m, pa_signal_event *e, int sig, void *userdata) {
|
static void exit_signal_callback(pa_mainloop_api*m, pa_signal_event *e, int sig, void *userdata) {
|
||||||
if (verbose)
|
if (verbose)
|
||||||
pa_log(_("Got signal, exiting."));
|
pa_log(_("Got signal, exiting."));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue