Lines Matching refs:sr

100 size_t pa_srbchannel_write(pa_srbchannel *sr, const void *data, size_t l) {
105 void *ptr = pa_ringbuffer_begin_write(&sr->rb_write, &towrite);
118 pa_ringbuffer_end_write(&sr->rb_write, towrite);
127 pa_fdsem_post(sr->sem_write);
131 size_t pa_srbchannel_read(pa_srbchannel *sr, void *data, size_t l) {
136 void *ptr = pa_ringbuffer_peek(&sr->rb_read, &toread);
146 if (pa_ringbuffer_drop(&sr->rb_read, toread)) {
150 pa_fdsem_post(sr->sem_write);
181 static void srbchannel_rwloop(pa_srbchannel* sr) {
185 pa_ringbuffer_peek(&sr->rb_read, &q);
189 if (sr->callback) {
190 if (!sr->callback(sr, sr->cb_userdata)) {
199 pa_ringbuffer_peek(&sr->rb_read, &q);
203 } while (pa_fdsem_before_poll(sr->sem_read) < 0);
207 pa_srbchannel* sr = userdata;
209 pa_fdsem_after_poll(sr->sem_read);
210 srbchannel_rwloop(sr);
214 pa_srbchannel* sr = userdata;
221 srbchannel_rwloop(sr);
229 pa_srbchannel* sr = pa_xmalloc0(sizeof(pa_srbchannel));
230 sr->mainloop = m;
231 sr->memblock = pa_memblock_new_pool(p, -1);
232 if (!sr->memblock)
235 srh = pa_memblock_acquire(sr->memblock);
238 sr->rb_read.memory = (uint8_t*) srh + PA_ALIGN(sizeof(*srh));
239 srh->readbuf_offset = sr->rb_read.memory - (uint8_t*) srh;
241 capacity = (pa_memblock_get_length(sr->memblock) - srh->readbuf_offset) / 2;
243 sr->rb_write.memory = PA_ALIGN_PTR(sr->rb_read.memory + capacity);
244 srh->writebuf_offset = sr->rb_write.memory - (uint8_t*) srh;
249 (int) pa_memblock_get_length(sr->memblock), capacity);
251 srh->capacity = sr->rb_read.capacity = sr->rb_write.capacity = capacity;
253 sr->rb_read.count = &srh->read_count;
254 sr->rb_write.count = &srh->write_count;
256 sr->sem_read = pa_fdsem_new_shm(&srh->read_semdata);
257 if (!sr->sem_read)
260 sr->sem_write = pa_fdsem_new_shm(&srh->write_semdata);
261 if (!sr->sem_write)
264 readfd = pa_fdsem_get(sr->sem_read);
270 sr->read_event = m->io_new(m, readfd, PA_IO_EVENT_INPUT, semread_cb, sr);
271 m->io_enable(sr->read_event, PA_IO_EVENT_INPUT);
273 return sr;
276 pa_srbchannel_free(sr);
281 static void pa_srbchannel_swap(pa_srbchannel *sr) {
282 pa_srbchannel temp = *sr;
284 sr->sem_read = temp.sem_write;
285 sr->sem_write = temp.sem_read;
286 sr->rb_read = temp.rb_write;
287 sr->rb_write = temp.rb_read;
294 pa_srbchannel* sr = pa_xmalloc0(sizeof(pa_srbchannel));
296 sr->mainloop = m;
297 sr->memblock = t->memblock;
298 pa_memblock_ref(sr->memblock);
299 srh = pa_memblock_acquire(sr->memblock);
301 sr->rb_read.capacity = sr->rb_write.capacity = srh->capacity;
302 sr->rb_read.count = &srh->read_count;
303 sr->rb_write.count = &srh->write_count;
305 sr->rb_read.memory = (uint8_t*) srh + srh->readbuf_offset;
306 sr->rb_write.memory = (uint8_t*) srh + srh->writebuf_offset;
308 sr->sem_read = pa_fdsem_open_shm(&srh->read_semdata, t->readfd);
309 if (!sr->sem_read)
312 sr->sem_write = pa_fdsem_open_shm(&srh->write_semdata, t->writefd);
313 if (!sr->sem_write)
316 pa_srbchannel_swap(sr);
323 sr->read_event = m->io_new(m, t->readfd, PA_IO_EVENT_INPUT, semread_cb, sr);
324 m->io_enable(sr->read_event, PA_IO_EVENT_INPUT);
326 return sr;
329 pa_srbchannel_free(sr);
334 void pa_srbchannel_export(pa_srbchannel *sr, pa_srbchannel_template *t) {
335 t->memblock = sr->memblock;
336 t->readfd = pa_fdsem_get(sr->sem_read);
337 t->writefd = pa_fdsem_get(sr->sem_write);
340 void pa_srbchannel_set_callback(pa_srbchannel *sr, pa_srbchannel_cb_t callback, void *userdata) {
341 if (sr->callback)
342 pa_fdsem_after_poll(sr->sem_read);
344 sr->callback = callback;
345 sr->cb_userdata = userdata;
347 if (sr->callback) {
350 if (!sr->defer_event)
351 sr->defer_event = sr->mainloop->defer_new(sr->mainloop, defer_cb, sr);
352 sr->mainloop->defer_enable(sr->defer_event, 1);
356 void pa_srbchannel_free(pa_srbchannel *sr)
361 pa_assert(sr);
363 if (sr->defer_event)
364 sr->mainloop->defer_free(sr->defer_event);
365 if (sr->read_event)
366 sr->mainloop->io_free(sr->read_event);
368 if (sr->sem_read)
369 pa_fdsem_free(sr->sem_read);
370 if (sr->sem_write)
371 pa_fdsem_free(sr->sem_write);
373 if (sr->memblock) {
374 pa_memblock_release(sr->memblock);
375 pa_memblock_unref(sr->memblock);
378 pa_xfree(sr);