]> git.sesse.net Git - vlc/blobdiff - modules/audio_output/pulse.c
Qt: make SeekPoints handle jump to chapter requests
[vlc] / modules / audio_output / pulse.c
index 0f97a36ff836a01707efc478676aa7b0cdb54a37..1e1c0f01273bf683c56c2897d3622c86dfda5de4 100644 (file)
@@ -50,8 +50,8 @@ vlc_module_end ()
 /* NOTE:
  * Be careful what you do when the PulseAudio mainloop is held, which is to say
  * within PulseAudio callbacks, or after pa_threaded_mainloop_lock().
- * In particular, the VLC audio output object variables can be manipulated with
- * the PulseAudio mainloop lock held, but not vice versa! */
+ * In particular, a VLC variable callback cannot be triggered nor deleted with
+ * the PulseAudio mainloop lock held, if the callback acquires the lock. */
 
 struct aout_sys_t
 {
@@ -273,7 +273,7 @@ static void Play(aout_instance_t *aout)
         if (pa_context_errno(sys->context) != PA_ERR_NODATA)
             error(aout, "cannot determine latency", sys->context);
     } else {
-        mtime_t gap = aout_FifoFirstDate(aout, &aout->output.fifo) - mdate()
+        mtime_t gap = aout_FifoFirstDate(&aout->output.fifo) - mdate()
                 - latency;
 
         if (gap > AOUT_PTS_TOLERANCE)
@@ -295,7 +295,7 @@ static void Play(aout_instance_t *aout)
      * If this function is changed to not always dequeue blocks, be sure to
      * limit the queue size to a reasonable limit to avoid huge leaks. */
     for (;;) {
-        block_t *block = aout_FifoPop(aout, &aout->output.fifo);
+        block_t *block = aout_FifoPop(&aout->output.fifo);
         if (block == NULL)
             break;
 
@@ -354,16 +354,19 @@ static int StreamMove(vlc_object_t *obj, const char *varname, vlc_value_t old,
     uint32_t idx = pa_stream_get_index(s);
     uint32_t sink_idx = val.i_int;
 
+    (void) varname; (void) old;
+
+    pa_threaded_mainloop_lock(sys->mainloop);
     op = pa_context_move_sink_input_by_index(sys->context, idx, sink_idx,
                                              NULL, NULL);
-    if (unlikely(op == NULL)) {
+    if (likely(op != NULL)) {
+        pa_operation_unref(op);
+        msg_Dbg(aout, "moving to sink %"PRIu32, sink_idx);
+    } else
         error(aout, "cannot move sink", sys->context);
-        return VLC_EGENERIC;
-    }
-    pa_operation_unref(op);
-    msg_Dbg(aout, "moving to sink %"PRIu32, sink_idx);
-    (void) varname; (void) old;
-    return VLC_SUCCESS;
+    pa_threaded_mainloop_unlock(sys->mainloop);
+
+    return (op != NULL) ? VLC_SUCCESS : VLC_EGENERIC;
 }
 
 
@@ -578,6 +581,7 @@ static int Open(vlc_object_t *obj)
     pa_threaded_mainloop_unlock(mainloop);
 
     aout->output.pf_play = Play;
+    aout->output.pf_pause = NULL;
     aout->output.pf_volume_set = VolumeSet;
     return VLC_SUCCESS;