<html><body><div style="color:#000; background-color:#fff; font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px"><div id="yui_3_16_0_1_1425007014887_3759"><span></span></div> <div class="qtdSeparateBR" id="yui_3_16_0_1_1425007014887_3756" dir="ltr">One discovery I just made on the missing write callbacks:</div><div class="qtdSeparateBR" id="yui_3_16_0_1_1425007014887_3756" dir="ltr"><br></div><div class="qtdSeparateBR" id="yui_3_16_0_1_1425007014887_3756" dir="ltr">If I write data to the playback stream with prebuf enabled immediately after reading it, I eventually get a write callback once the playback buffer has reached it's full mark. Does this mean I need to write zeros to the server if my write callback happens with no data in the buffer? That seems inefficient for network operation, or am I still misunderstanding something here.</div><div class="qtdSeparateBR" id="yui_3_16_0_1_1425007014887_3756" dir="ltr"><br></div><div class="qtdSeparateBR" id="yui_3_16_0_1_1425007014887_3756" dir="ltr">Eric<br><br></div><div class="yahoo_quoted" style="display: block;" id="yui_3_16_0_1_1425007014887_3753"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 16px;" id="yui_3_16_0_1_1425007014887_3752"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 16px;" id="yui_3_16_0_1_1425007014887_3751"> <div dir="ltr" id="yui_3_16_0_1_1425007014887_3755"> <font size="2" face="Arial" id="yui_3_16_0_1_1425007014887_3754"> On Thursday, February 26, 2015 9:58 PM, Eric Thornton <gonesurfingnc@yahoo.com> wrote:<br> </font> </div>  <br><br> <div class="y_msg_container" id="yui_3_16_0_1_1425007014887_3750"><div id="yiv5125428497"><div id="yui_3_16_0_1_1425007014887_3749"><div style="color:#000;background-color:#fff;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;" id="yui_3_16_0_1_1425007014887_3748"><div dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229">Tanu,</div><div dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229"><br clear="none"></div><div dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229">Thanks for the reply.</div><div dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229"><br clear="none"></div><div dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229">On further examination, the segfault is happening on pa_stream_write. I've not yet figured out why. However the largest hurdle I can't seem to overcome is getting a write callback with prebuffering enabled. I understand that assigning that attribute only affects playback on the server side of the stream, but it most definitely affects write callbacks in some way I don't understand.</div><div dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229"><br clear="none"></div><div dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229">Output with prebuf=-1 (note 1st write callback happens before 1st read so it returns).</div><div dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229"><br clear="none"></div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229" style="">Stream write callback: Ready to write 384000 bytes</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229" style="">no buffer to write: length 0 </div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,     724</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    1448</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    2172</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    2896</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    3620</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    4344</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    5068</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style=""><br clear="none"></div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">....and on and on...</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style=""><br clear="none"></div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Now with no prebuf attribute on write stream, I have the following output</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style=""><br clear="none"></div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style=""><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">no buffer to write: length 0 </div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read     288 read     288 buffer address 0x249a0d0, length,     288</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read     104 read     104 buffer address 0x249a0d0, length,     392</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read      88 read      88 buffer address 0x249a0d0, length,     480</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read      32 read      32 buffer address 0x249a0d0, length,     512</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read      64 read      64 buffer address 0x249a0d0, length,     576</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read     104 read     104 buffer address 0x249a0d0, length,     680</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read      24 read      24 buffer address 0x249a0d0, length,     704</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read      24 read      24 buffer address 0x249a0d0, length,     728</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read      24 read      24 buffer address 0x249a0d0, length,     752</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read      24 read      24 buffer address 0x249a0d0, length,     776</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Stream write callback: Ready to write 437712 bytes</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Wrote 776 of 776 bytes from 0x249a0d0</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">freeing buffer</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read      40 read      40 buffer address 0x249a3e0, length,      40</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4994" style="">Can read      32 read      32 buffer address 0x249a3e0, length,      72</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_5460" style=""><br clear="none"></div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_5460" style="">...and I things act fairly normal except for random segfaults on 2 of the 3 computers i've tested it on.</div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_5460" style=""><br clear="none"></div><div class="yiv5125428497" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_5460" style=""><br clear="none"></div></div> <div class="yiv5125428497qtdSeparateBR" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3248">Thanks,</div><div class="yiv5125428497qtdSeparateBR" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3248"><br clear="none"></div><div class="yiv5125428497qtdSeparateBR" dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_3248">Eric<br clear="none"><br clear="none"></div><div class="yiv5125428497yqt6383789841" id="yiv5125428497yqt06570"><div class="yiv5125428497yahoo_quoted" id="yiv5125428497yui_3_16_0_1_1425005346966_3247" style="display: block;"> <div id="yiv5125428497yui_3_16_0_1_1425005346966_3246" style="font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;"> <div id="yiv5125428497yui_3_16_0_1_1425005346966_3245" style="font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;"> <div dir="ltr" id="yiv5125428497yui_3_16_0_1_1425005346966_4507"> <font id="yiv5125428497yui_3_16_0_1_1425005346966_4506" size="2" face="Arial"> On Wednesday, February 25, 2015 12:06 PM, Tanu Kaskinen <tanu.kaskinen@linux.intel.com> wrote:<br clear="none"> </font> </div>  <br clear="none"><br clear="none"> <div class="yiv5125428497y_msg_container" id="yiv5125428497yui_3_16_0_1_1425005346966_3244">On Mon, 2015-02-23 at 02:22 +0000, Eric Thornton wrote:<br clear="none">> All,<br clear="none">> <br clear="none">> <br clear="none">> I'm working on a basic asynchronous read/write program to understand<br clear="none">> the API before applying it to another piece of software.  On a read<br clear="none">> callback I create (or add to) a buffer, and then on write callback I<br clear="none">> write back as much of it as allowed. The code follows pacat.c and<br clear="none">> several examples I've found on Jan Newmarch's site. The main<br clear="none">> difference, is rather than checking for writable size and writing<br clear="none">> immediately following a read, piling it onto the buffer and waiting<br clear="none">> for write callback seems to reduce CPU load on the remote hardware<br clear="none">> (raspberry pi) by 50% or more.<br clear="none">> <br clear="none">> <br clear="none">> Here is the erratic behavior...<br clear="none">> 1)I don't get any write callbacks (after the initial one) with the<br clear="none">> prebuf attribute = -1. The sample buffer size continues to increment<br clear="none">> with nowhere to go. This is probably related to the next two issues.<br clear="none"><br clear="none">The prebuf attribute shouldn't cause any segfaults, so I don't think<br clear="none">it's directly related to issue 3.<br clear="none"><br clear="none">I didn't read your code thoroughly, but you probably don't fully<br clear="none">understand what the prebuf attribute does. If you set prebuf to -1, the<br clear="none">server will decide the value for you, and that value will be non-zero.<br clear="none">If the prebuf is non-zero, playback will not start until PulseAudio has<br clear="none">received prebuf amount of data from your application. Also, if you're<br clear="none">too slow to write audio after the playback has started, so that there's<br clear="none">an underrun on the stream, that will also trigger the prebuffering mode,<br clear="none">meaning that the stream is stopped until you have again written prebuf<br clear="none">amount of data.<div class="yiv5125428497yqt0542072018" id="yiv5125428497yqtfd39872"><br clear="none"><br clear="none">> 2)If I comment out the prebuf and tlength attribute it works...<br clear="none">> kind-of.  I sometimes don't get sound on one computer even though the<br clear="none">> data on the screen indicates the program is running normally. If there<br clear="none">> is no sound, I can immediately ctl-c and restart and then I get sound.<br clear="none">> 3)On a slower computer, I get a segfault and gdb gives the following.<br clear="none">> I sometimes get a message about memcpy and unaligned memory.</div><br clear="none"><br clear="none">To get better backtraces from gdb, you need to install the debug symbols<br clear="none">for the program and the libraries that it uses. In this case at least<br clear="none">the debug symbols for libpulse are not available. If you're using<br clear="none">Raspbian, the package name is libpulse0-dbg.<br clear="none"><br clear="none">-- <br clear="none">Tanu<div class="yiv5125428497yqt0542072018" id="yiv5125428497yqtfd67796"><br clear="none"><br clear="none"><br clear="none"></div><br clear="none"><br clear="none"></div>  </div> </div>  </div></div> </div></div></div><br><br></div>  </div> </div>  </div> </div></body></html>