]> code.delx.au - pulseaudio/blobdiff - src/pulsecore/sink.c
Fix a few "it's -> its" typos
[pulseaudio] / src / pulsecore / sink.c
index 902a537179a4b1e172bafacdeef29e9439a08aff..47ee0aa48b385c3e7b205e6d8d2eaa1d3e4c2ac9 100644 (file)
@@ -82,7 +82,7 @@ pa_sink_new_data* pa_sink_new_data_init(pa_sink_new_data *data) {
 
     pa_zero(*data);
     data->proplist = pa_proplist_new();
-    data->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+    data->ports = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) pa_device_port_unref);
 
     return data;
 }
@@ -142,7 +142,7 @@ void pa_sink_new_data_done(pa_sink_new_data *data) {
     pa_proplist_free(data->proplist);
 
     if (data->ports)
-        pa_hashmap_free(data->ports, (pa_free_cb_t) pa_device_port_unref);
+        pa_hashmap_free(data->ports);
 
     pa_xfree(data->name);
     pa_xfree(data->active_port);
@@ -304,9 +304,18 @@ pa_sink* pa_sink_new(
         void *state;
         pa_device_port *p;
 
-        PA_HASHMAP_FOREACH(p, s->ports, state)
+        PA_HASHMAP_FOREACH(p, s->ports, state) {
+            if (p->available == PA_AVAILABLE_NO)
+                continue;
+
             if (!s->active_port || p->priority > s->active_port->priority)
                 s->active_port = p;
+        }
+        if (!s->active_port) {
+            PA_HASHMAP_FOREACH(p, s->ports, state)
+                if (!s->active_port || p->priority > s->active_port->priority)
+                    s->active_port = p;
+        }
     }
 
     if (s->active_port)
@@ -325,7 +334,8 @@ pa_sink* pa_sink_new(
             0);
 
     s->thread_info.rtpoll = NULL;
-    s->thread_info.inputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    s->thread_info.inputs = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL,
+                                                (pa_free_cb_t) pa_sink_input_unref);
     s->thread_info.soft_volume =  s->soft_volume;
     s->thread_info.soft_muted = s->muted;
     s->thread_info.state = s->state;
@@ -730,7 +740,7 @@ static void sink_free(pa_object *o) {
     }
 
     pa_idxset_free(s->inputs, NULL);
-    pa_hashmap_free(s->thread_info.inputs, (pa_free_cb_t) pa_sink_input_unref);
+    pa_hashmap_free(s->thread_info.inputs);
 
     if (s->silence.memblock)
         pa_memblock_unref(s->silence.memblock);
@@ -742,7 +752,7 @@ static void sink_free(pa_object *o) {
         pa_proplist_free(s->proplist);
 
     if (s->ports)
-        pa_hashmap_free(s->ports, (pa_free_cb_t) pa_device_port_unref);
+        pa_hashmap_free(s->ports);
 
     pa_xfree(s);
 }
@@ -1106,9 +1116,10 @@ static void inputs_drop(pa_sink *s, pa_mix_info *info, unsigned n, pa_memchunk *
         }
 
         if (m) {
-            if (m->chunk.memblock)
+            if (m->chunk.memblock) {
                 pa_memblock_unref(m->chunk.memblock);
                 pa_memchunk_reset(&m->chunk);
+            }
 
             pa_sink_input_unref(m->userdata);
             m->userdata = NULL;
@@ -1376,88 +1387,89 @@ void pa_sink_render_full(pa_sink *s, size_t length, pa_memchunk *result) {
 }
 
 /* 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;
+    uint32_t idx;
+    pa_sink_input *i;
+    bool use_alternate = false;
 
-    if (s->update_rate) {
-        uint32_t desired_rate = rate;
-        uint32_t default_rate = s->default_sample_rate;
-        uint32_t alternate_rate = s->alternate_sample_rate;
-        uint32_t idx;
-        pa_sink_input *i;
-        bool use_alternate = false;
+    if (rate == s->sample_spec.rate)
+        return 0;
 
-        if (PA_UNLIKELY(default_rate == alternate_rate)) {
-            pa_log_warn("Default and alternate sample rates are the same.");
-            return false;
-        }
+    if (!s->update_rate)
+        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;
-        }
+    if (PA_UNLIKELY(default_rate == alternate_rate && !passthrough)) {
+        pa_log_debug("Default and alternate sample rates are the same.");
+        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;
-            }
+    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 -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 -1;
         }
+    }
 
-        if (PA_UNLIKELY (desired_rate < 8000 ||
-                         desired_rate > PA_RATE_MAX))
-            return false;
-
-        if (!passthrough) {
-            pa_assert(default_rate % 4000 || default_rate % 11025);
-            pa_assert(alternate_rate % 4000 || alternate_rate % 11025);
-
-            if (default_rate % 4000) {
-                /* default is a 11025 multiple */
-                if ((alternate_rate % 4000 == 0) && (desired_rate % 4000 == 0))
-                    use_alternate=true;
-            } else {
-                /* default is 4000 multiple */
-                if ((alternate_rate % 11025 == 0) && (desired_rate % 11025 == 0))
-                    use_alternate=true;
-            }
+    if (PA_UNLIKELY(!pa_sample_rate_valid(desired_rate)))
+        return -1;
 
-            if (use_alternate)
-                desired_rate = alternate_rate;
-            else
-                desired_rate = default_rate;
+    if (!passthrough) {
+        pa_assert((default_rate % 4000 == 0) || (default_rate % 11025 == 0));
+        pa_assert((alternate_rate % 4000 == 0) || (alternate_rate % 11025 == 0));
+
+        if (default_rate % 11025 == 0) {
+            if ((alternate_rate % 4000 == 0) && (desired_rate % 4000 == 0))
+                use_alternate=true;
         } else {
-            desired_rate = rate; /* use stream sampling rate, discard default/alternate settings */
+            /* default is 4000 multiple */
+            if ((alternate_rate % 11025 == 0) && (desired_rate % 11025 == 0))
+                use_alternate=true;
         }
 
-        if (desired_rate == s->sample_spec.rate)
-            return false;
+        if (use_alternate)
+            desired_rate = alternate_rate;
+        else
+            desired_rate = default_rate;
+    } else {
+        desired_rate = rate; /* use stream sampling rate, discard default/alternate settings */
+    }
 
-        if (!passthrough && pa_sink_used_by(s) > 0)
-            return false;
+    if (desired_rate == s->sample_spec.rate)
+        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 (!passthrough && pa_sink_used_by(s) > 0)
+        return -1;
 
-        if (s->update_rate(s, desired_rate) == true) {
-            /* update monitor source as well */
-            if (s->monitor_source && !passthrough)
-                pa_source_update_rate(s->monitor_source, desired_rate, false);
-            pa_log_info("Changed sampling rate successfully");
+    pa_log_debug("Suspending sink %s due to changing the sample rate.", s->name);
+    pa_sink_suspend(s, true, PA_SUSPEND_INTERNAL);
 
-            PA_IDXSET_FOREACH(i, s->inputs, idx) {
-                if (i->state == PA_SINK_INPUT_CORKED)
-                    pa_sink_input_update_rate(i);
-            }
+    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_log_info("Changed sampling rate successfully");
 
-            ret = true;
+        PA_IDXSET_FOREACH(i, s->inputs, idx) {
+            if (i->state == PA_SINK_INPUT_CORKED)
+                pa_sink_input_update_rate(i);
         }
 
-        pa_sink_suspend(s, false, PA_SUSPEND_INTERNAL);
+        ret = 0;
     }
 
-    return ret ;
+    pa_sink_suspend(s, false, PA_SUSPEND_INTERNAL);
+
+    return ret;
 }
 
 /* Called from main thread */
@@ -2044,7 +2056,7 @@ void pa_sink_set_volume(
 
         /* Let's 'push' the reference volume if necessary */
         pa_cvolume_merge(&new_reference_volume, &s->reference_volume, &root_sink->real_volume);
-        /* If the sink and it's root don't have the same number of channels, we need to remap */
+        /* If the sink and its root don't have the same number of channels, we need to remap */
         if (s != root_sink && !pa_channel_map_equal(&s->channel_map, &root_sink->channel_map))
             pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_sink->channel_map);
         update_reference_volume(root_sink, &new_reference_volume, &root_sink->channel_map, save);
@@ -2792,18 +2804,6 @@ int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offse
             return 0;
         }
 
-        case PA_SINK_MESSAGE_DETACH:
-
-            /* Detach all streams */
-            pa_sink_detach_within_thread(s);
-            return 0;
-
-        case PA_SINK_MESSAGE_ATTACH:
-
-            /* Reattach all streams */
-            pa_sink_attach_within_thread(s);
-            return 0;
-
         case PA_SINK_MESSAGE_GET_REQUESTED_LATENCY: {
 
             pa_usec_t *usec = userdata;
@@ -2918,24 +2918,6 @@ int pa_sink_suspend_all(pa_core *c, bool suspend, pa_suspend_cause_t cause) {
     return ret;
 }
 
-/* Called from main thread */
-void pa_sink_detach(pa_sink *s) {
-    pa_sink_assert_ref(s);
-    pa_assert_ctl_context();
-    pa_assert(PA_SINK_IS_LINKED(s->state));
-
-    pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_DETACH, NULL, 0, NULL) == 0);
-}
-
-/* Called from main thread */
-void pa_sink_attach(pa_sink *s) {
-    pa_sink_assert_ref(s);
-    pa_assert_ctl_context();
-    pa_assert(PA_SINK_IS_LINKED(s->state));
-
-    pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_ATTACH, NULL, 0, NULL) == 0);
-}
-
 /* Called from IO thread */
 void pa_sink_detach_within_thread(pa_sink *s) {
     pa_sink_input *i;