]> code.delx.au - pulseaudio/blobdiff - src/pulsecore/source-output.h
core: Add name to flist struct for more informative log messages
[pulseaudio] / src / pulsecore / source-output.h
index 67cb376180755751fbef49a2d5a9864aae78096a..273b78fc62d668581d95f60f44be24fe625b65b9 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef foopulsesourceoutputhfoo
 #define foopulsesourceoutputhfoo
 
 #ifndef foopulsesourceoutputhfoo
 #define foopulsesourceoutputhfoo
 
-/* $Id$ */
-
 /***
   This file is part of PulseAudio.
 
 /***
   This file is part of PulseAudio.
 
@@ -10,7 +8,7 @@
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
-  by the Free Software Foundation; either version 2 of the License,
+  by the Free Software Foundation; either version 2.1 of the License,
   or (at your option) any later version.
 
   PulseAudio is distributed in the hope that it will be useful, but
   or (at your option) any later version.
 
   PulseAudio is distributed in the hope that it will be useful, but
@@ -34,6 +32,7 @@ typedef struct pa_source_output pa_source_output;
 #include <pulsecore/resampler.h>
 #include <pulsecore/module.h>
 #include <pulsecore/client.h>
 #include <pulsecore/resampler.h>
 #include <pulsecore/module.h>
 #include <pulsecore/client.h>
+#include <pulsecore/sink-input.h>
 
 typedef enum pa_source_output_state {
     PA_SOURCE_OUTPUT_INIT,
 
 typedef enum pa_source_output_state {
     PA_SOURCE_OUTPUT_INIT,
@@ -54,7 +53,10 @@ typedef enum pa_source_output_flags {
     PA_SOURCE_OUTPUT_NO_REMIX = 16,
     PA_SOURCE_OUTPUT_FIX_FORMAT = 32,
     PA_SOURCE_OUTPUT_FIX_RATE = 64,
     PA_SOURCE_OUTPUT_NO_REMIX = 16,
     PA_SOURCE_OUTPUT_FIX_FORMAT = 32,
     PA_SOURCE_OUTPUT_FIX_RATE = 64,
-    PA_SOURCE_OUTPUT_FIX_CHANNELS = 128
+    PA_SOURCE_OUTPUT_FIX_CHANNELS = 128,
+    PA_SOURCE_OUTPUT_DONT_INHIBIT_AUTO_SUSPEND = 256,
+    PA_SOURCE_OUTPUT_NO_CREATE_ON_SUSPEND = 512,
+    PA_SOURCE_OUTPUT_KILL_ON_SUSPEND = 1024
 } pa_source_output_flags_t;
 
 struct pa_source_output {
 } pa_source_output_flags_t;
 
 struct pa_source_output {
@@ -66,30 +68,51 @@ struct pa_source_output {
     pa_source_output_state_t state;
     pa_source_output_flags_t flags;
 
     pa_source_output_state_t state;
     pa_source_output_flags_t flags;
 
-    pa_proplist *proplist;
     char *driver;                         /* may be NULL */
     char *driver;                         /* may be NULL */
+    pa_proplist *proplist;
+
     pa_module *module;                    /* may be NULL */
     pa_client *client;                    /* may be NULL */
 
     pa_module *module;                    /* may be NULL */
     pa_client *client;                    /* may be NULL */
 
-    pa_source *source;
+    pa_source *source; /* NULL while being moved */
+
+    /* A source output can monitor just a single input of a sink, in which case we find it here */
+    pa_sink_input *direct_on_input;       /* may be NULL */
 
     pa_sample_spec sample_spec;
     pa_channel_map channel_map;
 
 
     pa_sample_spec sample_spec;
     pa_channel_map channel_map;
 
-    pa_resample_method_t resample_method;
+    /* if TRUE then the source we are connected to is worth
+     * remembering, i.e. was explicitly chosen by the user and not
+     * automatically. module-stream-restore looks for this.*/
+    pa_bool_t save_source:1;
+
+    pa_resample_method_t requested_resample_method, actual_resample_method;
 
     /* Pushes a new memchunk into the output. Called from IO thread
      * context. */
 
     /* Pushes a new memchunk into the output. Called from IO thread
      * context. */
-    void (*push)(pa_source_output *o, const pa_memchunk *chunk);
+    void (*push)(pa_source_output *o, const pa_memchunk *chunk); /* may NOT be NULL */
 
     /* Only relevant for monitor sources right now: called when the
 
     /* Only relevant for monitor sources right now: called when the
-     * recorded stream is rewound. Called from IO context*/
-    void (*process_rewind)(pa_source_output *o, size_t nbytes);
+     * recorded stream is rewound. Called from IO context */
+    void (*process_rewind)(pa_source_output *o, size_t nbytes); /* may be NULL */
 
     /* Called whenever the maximum rewindable size of the source
      * changes. Called from IO thread context. */
     void (*update_max_rewind) (pa_source_output *o, size_t nbytes); /* may be NULL */
 
 
     /* Called whenever the maximum rewindable size of the source
      * changes. Called from IO thread context. */
     void (*update_max_rewind) (pa_source_output *o, size_t nbytes); /* may be NULL */
 
+    /* Called whenever the configured latency of the source
+     * changes. Called from IO context. */
+    void (*update_source_requested_latency) (pa_source_output *o); /* may be NULL */
+
+    /* Called whenver the latency range of the source changes. Called
+     * from IO context. */
+    void (*update_source_latency_range) (pa_source_output *o); /* may be NULL */
+
+    /* Called whenver the fixed latency of the source changes, if there
+     * is one. Called from IO context. */
+    void (*update_source_fixed_latency) (pa_source_output *i); /* may be NULL */
+
     /* If non-NULL this function is called when the output is first
      * connected to a source. Called from IO thread context */
     void (*attach) (pa_source_output *o);           /* may be NULL */
     /* If non-NULL this function is called when the output is first
      * connected to a source. Called from IO thread context */
     void (*attach) (pa_source_output *o);           /* may be NULL */
@@ -98,32 +121,49 @@ struct pa_source_output {
      * disconnected from its source. Called from IO thread context */
     void (*detach) (pa_source_output *o);           /* may be NULL */
 
      * disconnected from its source. Called from IO thread context */
     void (*detach) (pa_source_output *o);           /* may be NULL */
 
-    /* If non-NULL called whenever the the source this output is attached
+    /* If non-NULL called whenever the source this output is attached
      * to suspends or resumes. Called from main context */
     void (*suspend) (pa_source_output *o, pa_bool_t b);   /* may be NULL */
 
      * to suspends or resumes. Called from main context */
     void (*suspend) (pa_source_output *o, pa_bool_t b);   /* may be NULL */
 
-    /* If non-NULL called whenever the the source this output is attached
-     * to changes. Called from main context */
-    void (*moved) (pa_source_output *o);   /* may be NULL */
+    /* If non-NULL called whenever the source this output is attached
+     * to suspends or resumes. Called from IO context */
+    void (*suspend_within_thread) (pa_source_output *o, pa_bool_t b);   /* may be NULL */
+
+    /* If non-NULL called whenever the source output is moved to a new
+     * source. Called from main context after the stream was detached
+     * from the old source and before it is attached to the new
+     * source. If dest is NULL the move was executed in two
+     * phases and the second one failed; the stream will be destroyed
+     * after this call. */
+    void (*moving) (pa_source_output *o, pa_source *dest);   /* may be NULL */
 
     /* Supposed to unlink and destroy this stream. Called from main
      * context. */
 
     /* Supposed to unlink and destroy this stream. Called from main
      * context. */
-    void (*kill)(pa_source_output* o);              /* may 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 bufferd audio) of
-    this stream. Called from main context. If NULL a
-    PA_SOURCE_OUTPUT_MESSAGE_GET_LATENCY message is sent to the IO
-    thread instead. */
+    this stream. Called from main context. This is added to what the
+    PA_SOURCE_OUTPUT_MESSAGE_GET_LATENCY message sent to the IO thread
+    returns */
     pa_usec_t (*get_latency) (pa_source_output *o); /* may be NULL */
 
     pa_usec_t (*get_latency) (pa_source_output *o); /* may be NULL */
 
-    /* If non_NULL this function is called from thread context if the
+    /* If non-NULL this function is called from thread context if the
      * state changes. The old state is found in thread_info.state.  */
     void (*state_change) (pa_source_output *o, pa_source_output_state_t state); /* may be NULL */
 
      * state changes. The old state is found in thread_info.state.  */
     void (*state_change) (pa_source_output *o, pa_source_output_state_t state); /* may be NULL */
 
+    /* If non-NULL this function is called before this source output
+     * is moved to a source and if it returns FALSE the move
+     * will not be allowed */
+    pa_bool_t (*may_move_to) (pa_source_output *o, pa_source *s); /* may be NULL */
+
+    /* If non-NULL this function is used to dispatch asynchronous
+     * control events. */
+    void (*send_event)(pa_source_output *o, const char *event, pa_proplist* data);
+
     struct {
         pa_source_output_state_t state;
 
     struct {
         pa_source_output_state_t state;
 
-        pa_bool_t attached; /* True only between ->attach() and ->detach() calls */
+        pa_bool_t attached:1; /* True only between ->attach() and ->detach() calls */
 
         pa_sample_spec sample_spec;
 
 
         pa_sample_spec sample_spec;
 
@@ -135,12 +175,14 @@ struct pa_source_output {
 
         /* The requested latency for the source */
         pa_usec_t requested_source_latency;
 
         /* The requested latency for the source */
         pa_usec_t requested_source_latency;
+
+        pa_sink_input *direct_on_input;       /* may be NULL */
     } thread_info;
 
     void *userdata;
 };
 
     } thread_info;
 
     void *userdata;
 };
 
-PA_DECLARE_CLASS(pa_source_output);
+PA_DECLARE_PUBLIC_CLASS(pa_source_output);
 #define PA_SOURCE_OUTPUT(o) pa_source_output_cast(o)
 
 enum {
 #define PA_SOURCE_OUTPUT(o) pa_source_output_cast(o)
 
 enum {
@@ -148,11 +190,21 @@ enum {
     PA_SOURCE_OUTPUT_MESSAGE_SET_RATE,
     PA_SOURCE_OUTPUT_MESSAGE_SET_STATE,
     PA_SOURCE_OUTPUT_MESSAGE_SET_REQUESTED_LATENCY,
     PA_SOURCE_OUTPUT_MESSAGE_SET_RATE,
     PA_SOURCE_OUTPUT_MESSAGE_SET_STATE,
     PA_SOURCE_OUTPUT_MESSAGE_SET_REQUESTED_LATENCY,
+    PA_SOURCE_OUTPUT_MESSAGE_GET_REQUESTED_LATENCY,
     PA_SOURCE_OUTPUT_MESSAGE_MAX
 };
 
     PA_SOURCE_OUTPUT_MESSAGE_MAX
 };
 
+typedef struct pa_source_output_send_event_hook_data {
+    pa_source_output *source_output;
+    const char *event;
+    pa_proplist *data;
+} pa_source_output_send_event_hook_data;
+
 typedef struct pa_source_output_new_data {
 typedef struct pa_source_output_new_data {
+    pa_source_output_flags_t flags;
+
     pa_proplist *proplist;
     pa_proplist *proplist;
+    pa_sink_input *direct_on_input;
 
     const char *driver;
     pa_module *module;
 
     const char *driver;
     pa_module *module;
@@ -160,18 +212,16 @@ typedef struct pa_source_output_new_data {
 
     pa_source *source;
 
 
     pa_source *source;
 
+    pa_resample_method_t resample_method;
+
     pa_sample_spec sample_spec;
     pa_sample_spec sample_spec;
-    pa_bool_t sample_spec_is_set;
     pa_channel_map channel_map;
     pa_channel_map channel_map;
-    pa_bool_t channel_map_is_set;
 
 
-    pa_resample_method_t resample_method;
-} pa_source_output_new_data;
+    pa_bool_t sample_spec_is_set:1;
+    pa_bool_t channel_map_is_set:1;
 
 
-typedef struct pa_source_output_move_hook_data {
-    pa_source_output *source_output;
-    pa_source *destination;
-} pa_source_output_move_hook_data;
+    pa_bool_t save_source:1;
+} pa_source_output_new_data;
 
 pa_source_output_new_data* pa_source_output_new_data_init(pa_source_output_new_data *data);
 void pa_source_output_new_data_set_sample_spec(pa_source_output_new_data *data, const pa_sample_spec *spec);
 
 pa_source_output_new_data* pa_source_output_new_data_init(pa_source_output_new_data *data);
 void pa_source_output_new_data_set_sample_spec(pa_source_output_new_data *data, const pa_sample_spec *spec);
@@ -180,45 +230,65 @@ void pa_source_output_new_data_done(pa_source_output_new_data *data);
 
 /* To be called by the implementing module only */
 
 
 /* To be called by the implementing module only */
 
-pa_source_output* pa_source_output_new(
+int pa_source_output_new(
+        pa_source_output**o,
         pa_core *core,
         pa_core *core,
-        pa_source_output_new_data *data,
-        pa_source_output_flags_t flags);
+        pa_source_output_new_data *data);
 
 void pa_source_output_put(pa_source_output *o);
 void pa_source_output_unlink(pa_source_output*o);
 
 
 void pa_source_output_put(pa_source_output *o);
 void pa_source_output_unlink(pa_source_output*o);
 
-void pa_source_output_set_name(pa_source_output *i, const char *name);
+void pa_source_output_set_name(pa_source_output *o, const char *name);
 
 
-pa_usec_t pa_source_output_set_requested_latency(pa_source_output *i, pa_usec_t usec);
+pa_usec_t pa_source_output_set_requested_latency(pa_source_output *o, pa_usec_t usec);
+
+void pa_source_output_cork(pa_source_output *o, pa_bool_t b);
+
+int pa_source_output_set_rate(pa_source_output *o, uint32_t rate);
+
+size_t pa_source_output_get_max_rewind(pa_source_output *o);
 
 /* Callable by everyone */
 
 /* External code may request disconnection with this funcion */
 void pa_source_output_kill(pa_source_output*o);
 
 
 /* Callable by everyone */
 
 /* External code may request disconnection with this funcion */
 void pa_source_output_kill(pa_source_output*o);
 
-pa_usec_t pa_source_output_get_latency(pa_source_output *i);
+pa_usec_t pa_source_output_get_latency(pa_source_output *o, pa_usec_t *source_latency);
 
 
-void pa_source_output_cork(pa_source_output *i, pa_bool_t b);
-
-int pa_source_output_set_rate(pa_source_output *o, uint32_t rate);
+void pa_source_output_update_proplist(pa_source_output *o, pa_update_mode_t mode, pa_proplist *p);
 
 pa_resample_method_t pa_source_output_get_resample_method(pa_source_output *o);
 
 
 pa_resample_method_t pa_source_output_get_resample_method(pa_source_output *o);
 
-int pa_source_output_move_to(pa_source_output *o, pa_source *dest);
+void pa_source_output_send_event(pa_source_output *o, const char *name, pa_proplist *data);
+
+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);
+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,
+ * first the detaching from the old source, then the attaching to the
+ * new source */
+int pa_source_output_start_move(pa_source_output *o);
+int pa_source_output_finish_move(pa_source_output *o, pa_source *dest, pa_bool_t save);
+void pa_source_output_fail_move(pa_source_output *o);
 
 #define pa_source_output_get_state(o) ((o)->state)
 
 
 #define pa_source_output_get_state(o) ((o)->state)
 
+pa_usec_t pa_source_output_get_requested_latency(pa_source_output *o);
+
 /* To be used exclusively by the source driver thread */
 
 void pa_source_output_push(pa_source_output *o, const pa_memchunk *chunk);
 void pa_source_output_process_rewind(pa_source_output *o, size_t nbytes);
 void pa_source_output_update_max_rewind(pa_source_output *o, size_t nbytes);
 
 /* To be used exclusively by the source driver thread */
 
 void pa_source_output_push(pa_source_output *o, const pa_memchunk *chunk);
 void pa_source_output_process_rewind(pa_source_output *o, size_t nbytes);
 void pa_source_output_update_max_rewind(pa_source_output *o, size_t nbytes);
 
-int pa_source_output_process_msg(pa_msgobject *mo, int code, void *userdata, int64_t offset, pa_memchunk *chunk);
-
 void pa_source_output_set_state_within_thread(pa_source_output *o, pa_source_output_state_t state);
 
 void pa_source_output_set_state_within_thread(pa_source_output *o, pa_source_output_state_t state);
 
+int pa_source_output_process_msg(pa_msgobject *mo, int code, void *userdata, int64_t offset, pa_memchunk *chunk);
+
 pa_usec_t pa_source_output_set_requested_latency_within_thread(pa_source_output *o, pa_usec_t usec);
 
 pa_usec_t pa_source_output_set_requested_latency_within_thread(pa_source_output *o, pa_usec_t usec);
 
+#define pa_source_output_assert_io_context(s) \
+    pa_assert(pa_thread_mq_get() || !PA_SOURCE_OUTPUT_IS_LINKED((s)->state))
+
 #endif
 #endif