<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="yiv7609057209"><div id="yui_3_16_0_1_1425270946803_12265"><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_1425270946803_12264"><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425270946803_4120"><span id="yiv7609057209yui_3_16_0_1_1425270946803_4119">To answer my own questions...</span></div><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425270946803_4121"><span><br clear="none"></span></div><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425270946803_4114"><span id="yiv7609057209yui_3_16_0_1_1425270946803_4115">-With the playback prebuf attribute set, the server will give one write callback and then wait until it receives the requested amount of data. If you are waiting on the server to send another callback, you'll never get one. I got around this issue by setting a "prebuffer_required" flag in which my read callback will check the size of the client buffer and send a single write with the prebuf amount of data. Once the prebuffer request has been satisfied, the server will continue to give regular write callbacks so long as the writable size does not exceed the prebuf attribute size. If it does, you have to prebuffer again.</span></div><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425270946803_4114"><span><br clear="none"></span></div><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425270946803_4114"><span id="yiv7609057209yui_3_16_0_1_1425270946803_7440">-The segfaults were caused by my simple allocate/copy/free buffer. I don't know why the performance was so bad, but I decided to go ahead and figure out the PortAudio ring buffer. After implementing it to hand off data between read and write callbacks, things are running smoothly. </span></div><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425270946803_4114"><span><br></span></div><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425270946803_4114"><span>Eric</span></div><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425270946803_4114"><span><br clear="none"></span></div><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425270946803_4114"><span><br clear="none"></span></div> <div class="yiv7609057209qtdSeparateBR" id="yui_3_16_0_1_1425270946803_14179"><br clear="none"><br clear="none"></div><div class="yiv7609057209yqt4619764852" id="yiv7609057209yqt03258"><div class="yiv7609057209yahoo_quoted" style="display: block;"> <div style="font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;"> <div style="font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;"> <div dir="ltr"> <font size="2" face="Arial"> On Thursday, February 26, 2015 10:37 PM, Eric Thornton <gonesurfingnc@yahoo.com> wrote:<br clear="none"> </font> </div>  <br clear="none"><br clear="none"> <div class="yiv7609057209y_msg_container"><div id="yiv7609057209"><div><div style="color:#000;background-color:#fff;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;"><div id="yiv7609057209yui_3_16_0_1_1425007014887_3759"><span></span></div> <div class="yiv7609057209qtdSeparateBR" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425007014887_3756">One discovery I just made on the missing write callbacks:</div><div class="yiv7609057209qtdSeparateBR" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425007014887_3756"><br clear="none"></div><div class="yiv7609057209qtdSeparateBR" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425007014887_3756">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="yiv7609057209qtdSeparateBR" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425007014887_3756"><br clear="none"></div><div class="yiv7609057209qtdSeparateBR" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425007014887_3756">Eric<br clear="none"><br clear="none"></div><div class="yiv7609057209yqt2586799238" id="yiv7609057209yqt00077"><div class="yiv7609057209yahoo_quoted" id="yiv7609057209yui_3_16_0_1_1425007014887_3753" style="display:block;"> <div id="yiv7609057209yui_3_16_0_1_1425007014887_3752" style="font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;"> <div id="yiv7609057209yui_3_16_0_1_1425007014887_3751" style="font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;"> <div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425007014887_3755"> <font id="yiv7609057209yui_3_16_0_1_1425007014887_3754" size="2" face="Arial"> On Thursday, February 26, 2015 9:58 PM, Eric Thornton <gonesurfingnc@yahoo.com> wrote:<br clear="none"> </font> </div>  <br clear="none"><br clear="none"> <div class="yiv7609057209y_msg_container" id="yiv7609057209yui_3_16_0_1_1425007014887_3750"><div id="yiv7609057209"><div id="yiv7609057209yui_3_16_0_1_1425007014887_3749"><div id="yiv7609057209yui_3_16_0_1_1425007014887_3748" style="color:#000;background-color:#fff;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;"><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229">Tanu,</div><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229"><br clear="none"></div><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229">Thanks for the reply.</div><div dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229"><br clear="none"></div><div dir="ltr" id="yiv7609057209yui_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="yiv7609057209yui_3_16_0_1_1425005346966_3229"><br clear="none"></div><div dir="ltr" id="yiv7609057209yui_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="yiv7609057209yui_3_16_0_1_1425005346966_3229"><br clear="none"></div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229" style="">Stream write callback: Ready to write 384000 bytes</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229" style="">no buffer to write: length 0 </div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,     724</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    1448</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    2172</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    2896</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    3620</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    4344</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3229" style="">Can read     724 read     724 buffer address 0x17da0d0, length,    5068</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style=""><br clear="none"></div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">....and on and on...</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style=""><br clear="none"></div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Now with no prebuf attribute on write stream, I have the following output</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style=""><br clear="none"></div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style=""><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">no buffer to write: length 0 </div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read     288 read     288 buffer address 0x249a0d0, length,     288</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read     104 read     104 buffer address 0x249a0d0, length,     392</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read      88 read      88 buffer address 0x249a0d0, length,     480</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read      32 read      32 buffer address 0x249a0d0, length,     512</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read      64 read      64 buffer address 0x249a0d0, length,     576</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read     104 read     104 buffer address 0x249a0d0, length,     680</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read      24 read      24 buffer address 0x249a0d0, length,     704</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read      24 read      24 buffer address 0x249a0d0, length,     728</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read      24 read      24 buffer address 0x249a0d0, length,     752</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read      24 read      24 buffer address 0x249a0d0, length,     776</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Stream write callback: Ready to write 437712 bytes</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Wrote 776 of 776 bytes from 0x249a0d0</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">freeing buffer</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read      40 read      40 buffer address 0x249a3e0, length,      40</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_4994" style="">Can read      32 read      32 buffer address 0x249a3e0, length,      72</div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_5460" style=""><br clear="none"></div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_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="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_5460" style=""><br clear="none"></div><div class="yiv7609057209" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_5460" style=""><br clear="none"></div></div> <div class="yiv7609057209qtdSeparateBR" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3248">Thanks,</div><div class="yiv7609057209qtdSeparateBR" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3248"><br clear="none"></div><div class="yiv7609057209qtdSeparateBR" dir="ltr" id="yiv7609057209yui_3_16_0_1_1425005346966_3248">Eric<br clear="none"><br clear="none"></div><div class="yiv7609057209yqt6383789841" id="yiv7609057209yqt06570"><div class="yiv7609057209yahoo_quoted" id="yiv7609057209yui_3_16_0_1_1425005346966_3247" style="display:block;"> <div id="yiv7609057209yui_3_16_0_1_1425005346966_3246" style="font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px;"> <div id="yiv7609057209yui_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="yiv7609057209yui_3_16_0_1_1425005346966_4507"> <font id="yiv7609057209yui_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="yiv7609057209y_msg_container" id="yiv7609057209yui_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="yiv7609057209yqt0542072018" id="yiv7609057209yqtfd39872"><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="yiv7609057209yqt0542072018" id="yiv7609057209yqtfd67796"><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 clear="none"><br clear="none"></div>  </div> </div>  </div></div> </div></div></div><br clear="none"><br clear="none"></div>  </div> </div>  </div></div> </div></div></div></div></body></html>