return true;
}
-static bool sink_update_rate_cb(pa_sink *s, uint32_t rate) {
+static int sink_update_rate_cb(pa_sink *s, uint32_t rate) {
struct userdata *u = s->userdata;
int i;
bool supported = false;
if (!supported) {
pa_log_info("Sink does not support sample rate of %d Hz", rate);
- return false;
+ return -1;
}
if (!PA_SINK_IS_OPENED(s->state)) {
pa_log_info("Updating rate for device %s, new rate is %d",u->device_name, rate);
u->sink->sample_spec.rate = rate;
- return true;
+ return 0;
}
- return false;
+ return -1;
}
static int process_rewind(struct userdata *u) {
update_sw_params(u);
}
-static bool source_update_rate_cb(pa_source *s, uint32_t rate) {
+static int source_update_rate_cb(pa_source *s, uint32_t rate) {
struct userdata *u = s->userdata;
int i;
bool supported = false;
if (!supported) {
pa_log_info("Source does not support sample rate of %d Hz", rate);
- return false;
+ return -1;
}
if (!PA_SOURCE_IS_OPENED(s->state)) {
pa_log_info("Updating rate for device %s, new rate is %d", u->device_name, rate);
u->source->sample_spec.rate = rate;
- return true;
+ return 0;
}
- return false;
+ return -1;
}
static void thread_func(void *userdata) {
module-suspend-on-idle can resume a sink */
pa_log_info("Trying to change sample rate");
- if (pa_sink_update_rate(data->sink, data->sample_spec.rate, pa_sink_input_new_data_is_passthrough(data)) == true)
+ if (pa_sink_update_rate(data->sink, data->sample_spec.rate, pa_sink_input_new_data_is_passthrough(data)) >= 0)
pa_log_info("Rate changed to %u Hz", data->sink->sample_spec.rate);
}
SINK_INPUT_MOVE_FINISH hook */
pa_log_info("Trying to change sample rate");
- if (pa_sink_update_rate(dest, i->sample_spec.rate, pa_sink_input_is_passthrough(i)) == true)
+ if (pa_sink_update_rate(dest, i->sample_spec.rate, pa_sink_input_is_passthrough(i)) >= 0)
pa_log_info("Rate changed to %u Hz", dest->sample_spec.rate);
}
}
/* Called from main thread */
-bool pa_sink_update_rate(pa_sink *s, uint32_t rate, bool passthrough) {
- bool ret = false;
+int pa_sink_update_rate(pa_sink *s, uint32_t rate, bool passthrough) {
+ int ret = -1;
uint32_t desired_rate = rate;
uint32_t default_rate = s->default_sample_rate;
uint32_t alternate_rate = s->alternate_sample_rate;
bool use_alternate = false;
if (rate == s->sample_spec.rate)
- return true;
+ return 0;
if (!s->update_rate)
- return false;
+ return -1;
if (PA_UNLIKELY(default_rate == alternate_rate && !passthrough)) {
pa_log_debug("Default and alternate sample rates are the same.");
- return false;
+ return -1;
}
if (PA_SINK_IS_RUNNING(s->state)) {
pa_log_info("Cannot update rate, SINK_IS_RUNNING, will keep using %u Hz",
s->sample_spec.rate);
- return false;
+ return -1;
}
if (s->monitor_source) {
if (PA_SOURCE_IS_RUNNING(s->monitor_source->state) == true) {
pa_log_info("Cannot update rate, monitor source is RUNNING");
- return false;
+ return -1;
}
}
if (PA_UNLIKELY (desired_rate < 8000 ||
desired_rate > PA_RATE_MAX))
- return false;
+ return -1;
if (!passthrough) {
pa_assert((default_rate % 4000 == 0) || (default_rate % 11025 == 0));
}
if (desired_rate == s->sample_spec.rate)
- return false;
+ return -1;
if (!passthrough && pa_sink_used_by(s) > 0)
- return false;
+ return -1;
pa_log_debug("Suspending sink %s due to changing the sample rate.", s->name);
pa_sink_suspend(s, true, PA_SUSPEND_INTERNAL);
- if (s->update_rate(s, desired_rate) == true) {
+ if (s->update_rate(s, desired_rate) >= 0) {
/* update monitor source as well */
if (s->monitor_source && !passthrough)
pa_source_update_rate(s->monitor_source, desired_rate, false);
pa_sink_input_update_rate(i);
}
- ret = true;
+ ret = 0;
}
pa_sink_suspend(s, false, PA_SUSPEND_INTERNAL);
/* Called whenever the sampling frequency shall be changed. Called from
* main thread. */
- bool (*update_rate)(pa_sink *s, uint32_t rate);
+ int (*update_rate)(pa_sink *s, uint32_t rate);
/* Contains copies of the above data so that the real-time worker
* thread can work without access locking */
/**** May be called by everyone, from main context */
-bool pa_sink_update_rate(pa_sink *s, uint32_t rate, bool passthrough);
+int pa_sink_update_rate(pa_sink *s, uint32_t rate, bool passthrough);
void pa_sink_set_latency_offset(pa_sink *s, int64_t offset);
/* The returned value is supposed to be in the time domain of the sound card! */
module-suspend-on-idle can resume a source */
pa_log_info("Trying to change sample rate");
- if (pa_source_update_rate(data->source, data->sample_spec.rate, pa_source_output_new_data_is_passthrough(data)) == true)
+ if (pa_source_update_rate(data->source, data->sample_spec.rate, pa_source_output_new_data_is_passthrough(data)) >= 0)
pa_log_info("Rate changed to %u Hz", data->source->sample_spec.rate);
}
SOURCE_OUTPUT_MOVE_FINISH hook */
pa_log_info("Trying to change sample rate");
- if (pa_source_update_rate(dest, o->sample_spec.rate, pa_source_output_is_passthrough(o)) == true)
+ if (pa_source_update_rate(dest, o->sample_spec.rate, pa_source_output_is_passthrough(o)) >= 0)
pa_log_info("Rate changed to %u Hz", dest->sample_spec.rate);
}
}
/* Called from main thread */
-bool pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough) {
- bool ret = false;
+int pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough) {
+ int ret;
uint32_t desired_rate = rate;
uint32_t default_rate = s->default_sample_rate;
uint32_t alternate_rate = s->alternate_sample_rate;
bool use_alternate = false;
if (rate == s->sample_spec.rate)
- return true;
+ return 0;
if (!s->update_rate && !s->monitor_of)
- return false;
+ return -1;
if (PA_UNLIKELY(default_rate == alternate_rate && !passthrough)) {
pa_log_debug("Default and alternate sample rates are the same.");
- return false;
+ return -1;
}
if (PA_SOURCE_IS_RUNNING(s->state)) {
pa_log_info("Cannot update rate, SOURCE_IS_RUNNING, will keep using %u Hz",
s->sample_spec.rate);
- return false;
+ return -1;
}
if (s->monitor_of) {
if (PA_SINK_IS_RUNNING(s->monitor_of->state)) {
pa_log_info("Cannot update rate, this is a monitor source and the sink is running.");
- return false;
+ return -1;
}
}
if (PA_UNLIKELY (desired_rate < 8000 ||
desired_rate > PA_RATE_MAX))
- return false;
+ return -1;
if (!passthrough) {
pa_assert((default_rate % 4000 == 0) || (default_rate % 11025 == 0));
}
if (desired_rate == s->sample_spec.rate)
- return false;
+ return -1;
if (!passthrough && pa_source_used_by(s) > 0)
- return false;
+ return -1;
pa_log_debug("Suspending source %s due to changing the sample rate.", s->name);
pa_source_suspend(s, true, PA_SUSPEND_INTERNAL);
s->sample_spec.rate = desired_rate;
ret = pa_sink_update_rate(s->monitor_of, desired_rate, false);
- if (!ret) {
+ if (ret < 0) {
/* Changing the sink rate failed, roll back the old rate for
* the monitor source. Why did we set the source rate before
* calling pa_sink_update_rate(), you may ask. The reason is
s->sample_spec.rate = old_rate;
}
} else
- ret = false;
+ ret = -1;
}
- if (ret) {
+ if (ret >= 0) {
uint32_t idx;
pa_source_output *o;
/* Called whenever the sampling frequency shall be changed. Called from
* main thread. */
- bool (*update_rate)(pa_source *s, uint32_t rate);
+ int (*update_rate)(pa_source *s, uint32_t rate);
/* Contains copies of the above data so that the real-time worker
* thread can work without access locking */
int pa_source_set_port(pa_source *s, const char *name, bool save);
void pa_source_set_mixer_dirty(pa_source *s, bool is_dirty);
-bool pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough);
+int pa_source_update_rate(pa_source *s, uint32_t rate, bool passthrough);
unsigned pa_source_linked_by(pa_source *s); /* Number of connected streams */
unsigned pa_source_used_by(pa_source *s); /* Number of connected streams that are not corked */