<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi Lennart,<div><br><div><div>On Jun 21, 2008, at 4:15 PM, Lennart Poettering wrote:</div><blockquote type="cite"><div><br>Is I tried to point out to you your code was heavily racy. I would<br>assume that the weirdness you are experiencing with the put hook is<br>mostly caused by this.</div></blockquote><div><br></div>You are right that the code you offered to look at last week incorrectly used pa_thread in an&nbsp;inappropriate&nbsp;way. &nbsp;</div><div><br></div><div>However that was not the code attached to the end of the email. &nbsp;It has no threads, no ipc.</div><div><br></div><div>The code attached to the email, was a stripped module that attaches hooks to all of the hooks available to a sink input, and in addition installs a subscription event handler.</div><div><br></div><div>The subscription function is called before a file streams, the _put hook, after the file streams. &nbsp;</div><div><blockquote type="cite"><div><blockquote type="cite"><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; "></span></blockquote></div></blockquote><br><div><blockquote type="cite"><span class="Apple-style-span" style="-webkit-text-stroke-width: -1; ">The subscription event is triggered at exactly the same place as the</span></blockquote></div><blockquote type="cite"><div>_PUT hook:<br><br><a href="http://git.0pointer.de/?p=pulseaudio.git;a=blob;f=src/pulsecore/sink-input.c;h=07ddb83af48b3b1ea8e6e90ca339a2cb1b031725;hb=refs/heads/tags/release-0.9.10#l390">http://git.0pointer.de/?p=pulseaudio.git;a=blob;f=src/pulsecore/sink-input.c;h=07ddb83af48b3b1ea8e6e90ca339a2cb1b031725;hb=refs/heads/tags/release-0.9.10#l390</a><br></div></blockquote><div><br></div><div>Agreed. &nbsp;</div><div><br></div><div>The callbacks are marked for calling next to each other in sink-input.c. &nbsp;</div><div><br></div><div>There is a big delay between the two registered routines are called back. &nbsp;</div><div><br></div><div>The delay seems equivalent to the length of a file being streamed.</div><div><br></div><div><blockquote type="cite" class="">
<!--StartFragment--><font face="Verdana, Helvetica, Arial"><span style="font-size:12.0px">E: > pa__init<br>
E: this version compiled - Jun 23 2008 14:25:37<br>
E: &lt; pa__init<br>
E: called at 1214256366.393001<br>
E: &nbsp;&nbsp;&nbsp;delta between last time called is 20237606(m) 04(s) 393001 (usec)<br>
I: module.c: Loaded "module-test-sink-input" (index: #9; argument: "").<br>
I: client.c: Created 1 "Native client (UNIX socket client)"<br>
I: protocol-native.c: Got credentials: uid=1000 gid=1000 success=1<br>
I: protocol-native.c: Enabled SHM for new connection<br>
I: client.c: Client 1 changed name from "Native client (UNIX socket client)" to "paplay"<br>
E: &lt; &nbsp;sink_input_new_hook<br>
E: called at 1214256407.739320<br>
E: &nbsp;&nbsp;&nbsp;delta between last time called is 00(m) 40(s) 346319 (usec)<br>
E: called at 1214256407.739335<br>
E: &nbsp;&nbsp;&nbsp;delta between last time called is 000015 (usecs)<br>
E: last message indicates approx overhead for log_time<br>
E: &lt; sink_input_fixate_hook<br>
E: called at 1214256407.739359<br>
E: &nbsp;&nbsp;&nbsp;delta between last time called is 000024 (usecs)<br>
I: sink-input.c: Created input 0 "/home/nick/Sony CD-ROM Test Disk Type <font color="#0000FF"><u><a href="mailto:3.0/1-KHz-0030_-@0dB.wav">3.0/1-KHz-0030_-@0dB.wav</a></u></font>" on usbAudio with sample spec s16le 2ch 44100Hz and channel map front-left,front-right<br>
E: > subscribe_callback<br>
E: subscribe_callback - new event received on sink-input with index 0<br>
E: &lt; subscribe_callback:<br>
E: called at 1214256407.739466<br>
E: &nbsp;&nbsp;&nbsp;delta between last time called is 000107 (usecs)<br>
E: &lt; sink_input_put_hook<br>
E: called at 1214256439.738896<br>
E: &nbsp;&nbsp;&nbsp;delta between last time called is 00(m) 23(s) 000570 (usec)<br>
E: &lt; sink_input_unlink_hook<br>
E: called at 1214256439.738964<br>
E: &nbsp;&nbsp;&nbsp;delta between last time called is 000068 (usecs)<br>
I: sink-input.c: Freeing output 0 "/home/nick/Sony CD-ROM Test Disk Type <font color="#0000FF"><u><a href="mailto:3.0/1-KHz-0030_-@0dB.wav">3.0/1-KHz-0030_-@0dB.wav</a></u></font>"<br>
E: > subscribe_callback<br>
E: &lt; subscribe_callback - not a new sink input<br>
I: client.c: Freed 1 "paplay"<br>
I: protocol-native.c: connection died.<br>
</span></font>
<!--EndFragment-->

</blockquote><br></div><div>From the instrumented run above the subscription callback is called at&nbsp;<span class="Apple-style-span" style="font-family: Verdana; ">1214256407.739466, about 107 microseconds after the fixate hook is called. &nbsp;The put hook is called at&nbsp;1214256407.739466, 23 or so seconds later. &nbsp;The file being played is marked on the test CD as being&nbsp;thirty&nbsp;seconds, but I'll but it's actually 23 seconds of data (there is silence at the start and end that probably got stripped by itunes when I ripped it to a .wav file.</span></div><div><font class="Apple-style-span" face="Verdana"><br></font></div><div><font class="Apple-style-span" face="Verdana">What I see is that put gets called post streaming if aplay or paplay are used to stream the file. &nbsp;I'd like to see the pa_sink_input structure prior to streaming.</font></div><div><font class="Apple-style-span" face="Verdana"><br></font></div><div><font class="Apple-style-span" face="Verdana">The&nbsp;subscription&nbsp;lets me do this.</font></div><div><font class="Apple-style-span" face="Verdana"><br></font></div><div><font class="Apple-style-span" face="Verdana">I'd love to use _put but it comes in too late.</font></div><div><font class="Apple-style-span" face="Verdana"><br></font></div><div><font class="Apple-style-span" face="Verdana">From what Lennart said, I was under the impression that put would be called prior to streaming.</font></div><div><font class="Apple-style-span" face="Verdana"><br></font></div><div><font class="Apple-style-span" face="Verdana">Did I misunderstand this last part?</font></div><div><font class="Apple-style-span" face="Verdana"><br></font></div><div><font class="Apple-style-span" face="Verdana">Thanks</font></div><div><font class="Apple-style-span" face="Verdana"><br></font></div><div><font class="Apple-style-span" face="Verdana">Nick</font></div><div><font class="Apple-style-span" face="Verdana"><br></font></div><div><font class="Apple-style-span" face="Verdana"><br></font></div><div><font class="Apple-style-span" face="Verdana">Code for simple pulse module to log hook and subscription callbacks.</font></div><div><font class="Apple-style-span" face="Verdana"><br></font></div><div><font class="Apple-style-span" face="Verdana">
<!--StartFragment--><font face="Verdana, Helvetica, Arial"><span style="font-size:12.0px"><br>
/*<br>
&nbsp;* pulse module for stream routing to log hook calls for sink-inputs<br>
&nbsp;* Nick Thompson<br>
&nbsp;* 6/19/08<br>
&nbsp;*<br>
&nbsp;*/<br>
<br>
#include &lt;pulsecore/config.h><br>
#include &lt;pulsecore/module.h><br>
<br>
<br>
/* user data for the pulseaudio module, store this in init so that<br>
&nbsp;* stuff we need can be accessed when we get callbacks<br>
&nbsp;*/<br>
struct userdata {<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;/* cached references to pulse internals */<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_core *core;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_module *module;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_subscription *subscription;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;/* slots for our sink input hook functions */<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot *sink_input_new_hook_callback ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot *sink_input_fixate_hook_callback ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot *sink_input_put_hook_callback ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot *sink_input_unlink_hook_callback ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot *sink_input_unlink_post_hook_callback ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot *sink_input_move_hook_callback ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot *sink_input_move_post_callback ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot *sink_input_name_changed_hook_callback ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot *sink_input_state_changed_hook_callback ;<br>
};<br>
<br>
static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata);<br>
<br>
static pa_hook_result_t sink_input_new_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input_new_data *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u);<br>
<br>
static pa_hook_result_t sink_input_fixate_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input_new_data *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u);<br>
<br>
static pa_hook_result_t sink_input_put_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u);<br>
<br>
static pa_hook_result_t sink_input_unlink_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u);<br>
<br>
static pa_hook_result_t sink_input_unlink_post_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u);<br>
<br>
static pa_hook_result_t sink_input_move_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input_move_hook_data *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u);<br>
<br>
static pa_hook_result_t sink_input_move_post(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u);<br>
<br>
static pa_hook_result_t sink_input_name_changed_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u);<br>
<br>
static pa_hook_result_t sink_input_state_changed_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u);<br>
<br>
static void log_time(void) ;<br>
<br>
<br>
PA_MODULE_AUTHOR("Nick Thompson") ;<br>
PA_MODULE_DESCRIPTION("Sniffer for sink input hook callbacks") ;<br>
PA_MODULE_VERSION(PACKAGE_VERSION) ;<br>
PA_MODULE_USAGE("Usage TBD" ) ;<br>
<br>
static void log_time(void) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;struct timeval itstime ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;struct timeval difftime ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;static struct timeval lasttime = {0,0};<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;int minutes;<br>
&nbsp;&nbsp;&nbsp;&nbsp;int seconds;<br>
&nbsp;&nbsp;&nbsp;&nbsp;int usecs ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;int delta;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_gettimeofday(&amp;itstime);<br>
&nbsp;&nbsp;&nbsp;&nbsp;difftime.tv_sec = itstime.tv_sec;<br>
&nbsp;&nbsp;&nbsp;&nbsp;difftime.tv_usec = itstime.tv_usec;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("called at %d.%.06d",itstime.tv_sec,itstime.tv_usec);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(0==(itstime.tv_sec-lasttime.tv_sec)) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_log(" &nbsp;&nbsp;delta between last time called is %.06d (usecs)",<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abs(itstime.tv_usec-lasttime.tv_usec));<br>
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_log(" &nbsp;&nbsp;delta between last time called is %02d(m) %02d(s) %.06d (usec)",<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delta = abs(itstime.tv_sec-lasttime.tv_sec)/60,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abs(delta%60),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abs(itstime.tv_usec-lasttime.tv_usec));<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;lasttime.tv_sec = itstime.tv_sec;<br>
&nbsp;&nbsp;&nbsp;&nbsp;lasttime.tv_usec = itstime.tv_usec;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("");<br>
<br>
}<br>
<br>
static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u = &nbsp;userdata;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *si = NULL;<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_assert(c);<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_assert(u);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("> subscribe_callback");<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;/* we are only interested in sink-input creation events */<br>
&nbsp;&nbsp;&nbsp;&nbsp;if (t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT)|PA_SUBSCRIPTION_EVENT_NEW) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; subscribe_callback - not a new sink input");<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br>
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!(si = pa_idxset_get_by_index(c->sink_inputs, idx))) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; subscribe_callback - can't get index");<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("subscribe_callback - new event received on sink-input with index %d",si->index);<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; subscribe_callback:");<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
<br>
}<br>
<br>
/* entry point for the module*/<br>
int pa__init(pa_module* m)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u = NULL;<br>
&nbsp;&nbsp;&nbsp;&nbsp;int i;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("> pa__init");<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("this version compiled - %s %s",__DATE__,__TIME__);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_assert(m);<br>
&nbsp;&nbsp;&nbsp;&nbsp;u = pa_xnew(struct userdata, 1);<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->core = m->core;<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->module = m;<br>
&nbsp;&nbsp;&nbsp;&nbsp;m->userdata = u;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;/* install hooks to allow us to maange an internal, to this module,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* list of streams tied back to the originator sink of the stream<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* this will be used to implement the policy in place.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->sink_input_new_hook_callback = pa_hook_connect(&amp;u->core->hooks[PA_CORE_HOOK_SINK_INPUT_NEW],<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pa_hook_cb_t)sink_input_new_hook,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u);<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->sink_input_fixate_hook_callback = pa_hook_connect(&amp;u->core->hooks[PA_CORE_HOOK_SINK_INPUT_FIXATE],<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pa_hook_cb_t)sink_input_fixate_hook,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u);<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->sink_input_put_hook_callback = pa_hook_connect(&amp;u->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT],<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pa_hook_cb_t)sink_input_put_hook,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u);<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->sink_input_unlink_hook_callback = pa_hook_connect(&amp;u->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK],<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pa_hook_cb_t)sink_input_unlink_hook,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u);<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->sink_input_unlink_post_hook_callback = pa_hook_connect(&amp;u->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK_POST],<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pa_hook_cb_t)sink_input_unlink_post_hook,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u);<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->sink_input_move_hook_callback = pa_hook_connect(&amp;u->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE],<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pa_hook_cb_t)sink_input_move_hook,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u);<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->sink_input_move_post_callback = pa_hook_connect(&amp;u->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_POST],<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pa_hook_cb_t)sink_input_move_post,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u);<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->sink_input_name_changed_hook_callback = pa_hook_connect(&amp;u->core->hooks[PA_CORE_HOOK_SINK_INPUT_NAME_CHANGED],<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pa_hook_cb_t)sink_input_name_changed_hook,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u);<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->sink_input_state_changed_hook_callback = pa_hook_connect(&amp;u->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED],<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(pa_hook_cb_t)sink_input_state_changed_hook,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u);<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;/* install a subscription callback on the core */<br>
&nbsp;&nbsp;&nbsp;&nbsp;u->subscription = pa_subscription_new(m->core, PA_SUBSCRIPTION_MASK_SINK_INPUT, subscribe_callback, u);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; pa__init");<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>
<br>
fail:<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; pa__init - failure");<br>
&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br>
}<br>
<br>
static pa_hook_result_t sink_input_new_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input_new_data *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u){<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; &nbsp;sink_input_new_hook");<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("last message indicates approx overhead for log_time");<br>
&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;return PA_HOOK_OK;<br>
}<br>
<br>
static pa_hook_result_t sink_input_fixate_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input_new_data *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u){<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; sink_input_fixate_hook");<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;return PA_HOOK_OK;<br>
}<br>
<br>
static pa_hook_result_t sink_input_put_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u){<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; sink_input_put_hook");<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;return PA_HOOK_OK;<br>
}<br>
<br>
static pa_hook_result_t sink_input_unlink_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u){<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; sink_input_unlink_hook");<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;return PA_HOOK_OK;<br>
}<br>
<br>
static pa_hook_result_t sink_input_unlink_post_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u){<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; sink_input_unlink_post_hook");<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;return PA_HOOK_OK;<br>
}<br>
<br>
static pa_hook_result_t sink_input_move_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input_move_hook_data *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u){<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; sink_input_move_hook");<br>
&nbsp;&nbsp;&nbsp;&nbsp;return PA_HOOK_OK;<br>
}<br>
<br>
static pa_hook_result_t sink_input_move_post(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u){<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; sink_input_move_post");<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;return PA_HOOK_OK;<br>
}<br>
<br>
static pa_hook_result_t sink_input_name_changed_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u){<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; sink_input_name_changed_hook");<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;return PA_HOOK_OK;<br>
}<br>
<br>
static pa_hook_result_t sink_input_state_changed_hook(pa_core *c,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_sink_input *data,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u){<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; sink_input_state_changed_hook");<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;return PA_HOOK_OK;<br>
}<br>
<br>
<br>
<br>
/* exit and cleanup */<br>
void pa__done(pa_module *m) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;struct userdata *u ;<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("> pa__done");<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_assert(m) ;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;if (!(u = m->userdata))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(u->sink_input_new_hook_callback )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot_free(u->sink_input_new_hook_callback) ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(u->sink_input_fixate_hook_callback )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot_free(u->sink_input_fixate_hook_callback) ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(u->sink_input_put_hook_callback )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot_free(u->sink_input_put_hook_callback) ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(u->sink_input_unlink_hook_callback )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot_free(u->sink_input_unlink_hook_callback) ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(u->sink_input_unlink_post_hook_callback )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot_free(u->sink_input_unlink_post_hook_callback) ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(u->sink_input_move_hook_callback )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot_free(u->sink_input_move_hook_callback) ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(u->sink_input_move_post_callback )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot_free(u->sink_input_move_post_callback) ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(u->sink_input_name_changed_hook_callback )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot_free(u->sink_input_name_changed_hook_callback) ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;if(u->sink_input_state_changed_hook_callback )<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa_hook_slot_free(u->sink_input_state_changed_hook_callback) ;<br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_xfree(u);<br>
&nbsp;&nbsp;&nbsp;&nbsp;pa_log("&lt; pa__done");<br>
&nbsp;&nbsp;&nbsp;&nbsp;log_time() ;<br>
}<br>
</span></font>
<!--EndFragment-->

</font></div></div></div></body></html>