diff options
Diffstat (limited to 'src/modules/module-combine.c')
| -rw-r--r-- | src/modules/module-combine.c | 33 | 
1 files changed, 17 insertions, 16 deletions
| diff --git a/src/modules/module-combine.c b/src/modules/module-combine.c index e90ef11c..a186c899 100644 --- a/src/modules/module-combine.c +++ b/src/modules/module-combine.c @@ -58,7 +58,7 @@ PA_MODULE_USAGE(          "sink_name=<name for the sink> "          "sink_properties=<properties for the sink> "          "slaves=<slave sinks> " -        "adjust_time=<seconds> " +        "adjust_time=<how often to readjust rates in s> "          "resample_method=<method> "          "format=<sample format> "          "rate=<sample rate> " @@ -69,7 +69,7 @@ PA_MODULE_USAGE(  #define MEMBLOCKQ_MAXLENGTH (1024*1024*16) -#define DEFAULT_ADJUST_TIME 10 +#define DEFAULT_ADJUST_TIME_USEC (10*PA_USEC_PER_SEC)  #define BLOCK_USEC (PA_USEC_PER_MSEC * 200) @@ -91,7 +91,6 @@ struct output {      pa_sink *sink;      pa_sink_input *sink_input; -      pa_bool_t ignore_state_change;      pa_asyncmsgq *inq,    /* Message queue from the sink thread to this sink input */ @@ -121,7 +120,7 @@ struct userdata {      pa_rtpoll *rtpoll;      pa_time_event *time_event; -    uint32_t adjust_time; +    pa_usec_t adjust_time;      pa_bool_t automatic;      pa_bool_t auto_desc; @@ -221,9 +220,9 @@ static void adjust_rates(struct userdata *u) {              continue;          if (o->total_latency < target_latency) -            r -= (uint32_t) ((((double) (target_latency - o->total_latency))/(double)u->adjust_time)*(double)r/PA_USEC_PER_SEC); +            r -= (uint32_t) ((((double) (target_latency - o->total_latency))/(double)u->adjust_time)*(double)r);          else if (o->total_latency > target_latency) -            r += (uint32_t) ((((double) (o->total_latency - target_latency))/(double)u->adjust_time)*(double)r/PA_USEC_PER_SEC); +            r += (uint32_t) ((((double) (o->total_latency - target_latency))/(double)u->adjust_time)*(double)r);          if (r < (uint32_t) (base_rate*0.9) || r > (uint32_t) (base_rate*1.1)) {              pa_log_warn("[%s] sample rates too different, not adjusting (%u vs. %u).", o->sink_input->sink->name, base_rate, r); @@ -246,7 +245,7 @@ static void time_callback(pa_mainloop_api *a, pa_time_event *e, const struct tim      adjust_rates(u); -    pa_core_rttime_restart(u->core, e, pa_rtclock_now() + u->adjust_time * PA_USEC_PER_SEC); +    pa_core_rttime_restart(u->core, e, pa_rtclock_now() + u->adjust_time);  }  static void process_render_null(struct userdata *u, pa_usec_t now) { @@ -845,8 +844,9 @@ static int output_create_sink_input(struct output *o) {      pa_sink_input_new_data_set_channel_map(&data, &o->userdata->sink->channel_map);      data.module = o->userdata->module;      data.resample_method = o->userdata->resample_method; +    data.flags = PA_SINK_INPUT_VARIABLE_RATE|PA_SINK_INPUT_DONT_MOVE|PA_SINK_INPUT_NO_CREATE_ON_SUSPEND; -    pa_sink_input_new(&o->sink_input, o->userdata->core, &data, PA_SINK_INPUT_VARIABLE_RATE|PA_SINK_INPUT_DONT_MOVE|PA_SINK_INPUT_NO_CREATE_ON_SUSPEND); +    pa_sink_input_new(&o->sink_input, o->userdata->core, &data);      pa_sink_input_new_data_done(&data); @@ -1105,6 +1105,7 @@ int pa__init(pa_module*m) {      struct output *o;      uint32_t idx;      pa_sink_new_data data; +    uint32_t adjust_time_sec;      pa_assert(m); @@ -1123,16 +1124,10 @@ int pa__init(pa_module*m) {      m->userdata = u = pa_xnew0(struct userdata, 1);      u->core = m->core;      u->module = m; -    u->adjust_time = DEFAULT_ADJUST_TIME;      u->rtpoll = pa_rtpoll_new();      pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);      u->resample_method = resample_method;      u->outputs = pa_idxset_new(NULL, NULL); -    u->sink_put_slot = u->sink_unlink_slot = u->sink_state_changed_slot = NULL; -    PA_LLIST_HEAD_INIT(struct output, u->thread_info.active_outputs); -    pa_atomic_store(&u->thread_info.running, FALSE); -    u->thread_info.in_null_mode = FALSE; -    u->thread_info.counter = 0;      u->thread_info.smoother = pa_smoother_new(              PA_USEC_PER_SEC,              PA_USEC_PER_SEC*2, @@ -1142,11 +1137,17 @@ int pa__init(pa_module*m) {              0,              FALSE); -    if (pa_modargs_get_value_u32(ma, "adjust_time", &u->adjust_time) < 0) { +    adjust_time_sec = DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC; +    if (pa_modargs_get_value_u32(ma, "adjust_time", &adjust_time_sec) < 0) {          pa_log("Failed to parse adjust_time value");          goto fail;      } +    if (adjust_time_sec != DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC) +        u->adjust_time = adjust_time_sec * PA_USEC_PER_SEC; +    else +        u->adjust_time = DEFAULT_ADJUST_TIME_USEC; +      slaves = pa_modargs_get_value(ma, "slaves", NULL);      u->automatic = !slaves; @@ -1315,7 +1316,7 @@ int pa__init(pa_module*m) {          output_verify(o);      if (u->adjust_time > 0) -        u->time_event = pa_core_rttime_new(m->core, pa_rtclock_now() + u->adjust_time * PA_USEC_PER_SEC, time_callback, u); +        u->time_event = pa_core_rttime_new(m->core, pa_rtclock_now() + u->adjust_time, time_callback, u);      pa_modargs_free(ma); | 
