Lines Matching defs:dshare
61 snd_pcm_direct_t *dshare = pcm->private_data;
66 dst_areas = snd_pcm_mmap_areas(dshare->spcm);
67 channels = dshare->channels;
68 format = dshare->shmptr->s.format;
70 dchn = dshare->bindings ? dshare->bindings[chn] : chn;
73 dshare->shmptr->s.buffer_size, format);
77 static void share_areas(snd_pcm_direct_t *dshare,
87 channels = dshare->channels;
88 format = dshare->shmptr->s.format;
89 if (dshare->interleaved) {
96 dchn = dshare->bindings ? dshare->bindings[chn] : chn;
110 snd_pcm_direct_t *dshare = pcm->private_data;
116 size = pcm_frame_diff(dshare->appl_ptr, dshare->last_appl_ptr, pcm->boundary);
119 slave_hw_ptr = dshare->slave_hw_ptr;
123 slave_hw_ptr -= slave_hw_ptr % dshare->slave_period_size;
124 slave_hw_ptr += dshare->slave_buffer_size;
125 if (slave_hw_ptr >= dshare->slave_boundary)
126 slave_hw_ptr -= dshare->slave_boundary;
127 slave_size = pcm_frame_diff(slave_hw_ptr, dshare->slave_appl_ptr, dshare->slave_boundary);
135 dst_areas = snd_pcm_mmap_areas(dshare->spcm);
136 appl_ptr = dshare->last_appl_ptr % pcm->buffer_size;
137 dshare->last_appl_ptr += size;
138 dshare->last_appl_ptr %= pcm->boundary;
139 slave_appl_ptr = dshare->slave_appl_ptr % dshare->slave_buffer_size;
140 dshare->slave_appl_ptr += size;
141 dshare->slave_appl_ptr %= dshare->slave_boundary;
146 if (slave_appl_ptr + transfer > dshare->slave_buffer_size)
147 transfer = dshare->slave_buffer_size - slave_appl_ptr;
148 share_areas(dshare, src_areas, dst_areas, appl_ptr, slave_appl_ptr, transfer);
153 slave_appl_ptr %= dshare->slave_buffer_size;
164 snd_pcm_direct_t *dshare = pcm->private_data;
168 old_slave_hw_ptr = dshare->slave_hw_ptr;
169 dshare->slave_hw_ptr = slave_hw_ptr;
170 diff = pcm_frame_diff(slave_hw_ptr, old_slave_hw_ptr, dshare->slave_boundary);
173 if (dshare->state != SND_PCM_STATE_RUNNING &&
174 dshare->state != SND_PCM_STATE_DRAINING)
177 dshare->hw_ptr += diff;
178 dshare->hw_ptr %= pcm->boundary;
183 if (avail > dshare->avail_max)
184 dshare->avail_max = avail;
186 snd_timer_stop(dshare->timer);
188 gettimestamp(&dshare->trigger_tstamp, pcm->tstamp_type);
189 if (dshare->state == SND_PCM_STATE_RUNNING) {
190 dshare->state = SND_PCM_STATE_XRUN;
193 dshare->state = SND_PCM_STATE_SETUP;
195 snd_pcm_direct_clear_timer_queue(dshare);
202 snd_pcm_direct_t *dshare = pcm->private_data;
206 if (dshare->slowptr)
207 snd_pcm_hwsync(dshare->spcm);
208 slave_hw_ptr = *dshare->spcm->hw.ptr;
209 err = snd_pcm_direct_check_xrun(dshare, pcm);
224 snd_pcm_direct_t *dshare = pcm->private_data;
227 snd_pcm_status(dshare->spcm, status);
229 switch (dshare->state) {
241 status->trigger_tstamp = dshare->trigger_tstamp;
243 status->avail_max = status->avail > dshare->avail_max ? status->avail : dshare->avail_max;
244 dshare->avail_max = 0;
250 snd_pcm_direct_t *dshare = pcm->private_data;
252 snd_pcm_direct_check_xrun(dshare, pcm);
253 if (dshare->state == STATE_RUN_PENDING)
255 return dshare->state;
260 snd_pcm_direct_t *dshare = pcm->private_data;
263 switch (dshare->state) {
286 snd_pcm_direct_t *dshare = pcm->private_data;
288 switch(dshare->state) {
306 snd_pcm_direct_t *dshare = pcm->private_data;
307 dshare->hw_ptr %= pcm->period_size;
308 dshare->appl_ptr = dshare->last_appl_ptr = dshare->hw_ptr;
309 snd_pcm_direct_reset_slave_ptr(pcm, dshare, *dshare->spcm->hw.ptr);
313 static int snd_pcm_dshare_start_timer(snd_pcm_t *pcm, snd_pcm_direct_t *dshare)
317 snd_pcm_hwsync(dshare->spcm);
318 snd_pcm_direct_reset_slave_ptr(pcm, dshare, *dshare->spcm->hw.ptr);
319 err = snd_timer_start(dshare->timer);
322 dshare->state = SND_PCM_STATE_RUNNING;
328 snd_pcm_direct_t *dshare = pcm->private_data;
332 if (dshare->state != SND_PCM_STATE_PREPARED)
336 dshare->state = STATE_RUN_PENDING;
340 err = snd_pcm_dshare_start_timer(pcm, dshare);
345 gettimestamp(&dshare->trigger_tstamp, pcm->tstamp_type);
351 snd_pcm_direct_t *dshare = pcm->private_data;
352 if (dshare->state == SND_PCM_STATE_OPEN)
354 dshare->state = SND_PCM_STATE_SETUP;
355 snd_pcm_direct_timer_stop(dshare);
363 snd_pcm_direct_t *dshare = pcm->private_data;
367 switch (snd_pcm_state(dshare->spcm)) {
374 if (dshare->state == SND_PCM_STATE_OPEN)
378 if (dshare->state == SND_PCM_STATE_PREPARED) {
387 if (dshare->state == SND_PCM_STATE_XRUN) {
395 dshare->state = SND_PCM_STATE_DRAINING;
402 if (dshare->state == SND_PCM_STATE_DRAINING) {
405 snd_pcm_direct_clear_timer_queue(dshare); /* force poll to wait */
407 switch (snd_pcm_state(dshare->spcm)) {
414 } while (dshare->state == SND_PCM_STATE_DRAINING);
478 snd_pcm_direct_t *dshare = pcm->private_data;
480 if (dshare->timer)
481 snd_timer_close(dshare->timer);
482 if (dshare->bindings)
484 snd_pcm_direct_semaphore_down(dshare, DIRECT_IPC_SEM_CLIENT);
485 dshare->shmptr->u.dshare.chn_mask &= ~dshare->u.dshare.chn_mask;
486 snd_pcm_close(dshare->spcm);
487 if (dshare->server)
488 snd_pcm_direct_server_discard(dshare);
489 if (dshare->client)
490 snd_pcm_direct_client_discard(dshare);
491 if (snd_pcm_direct_shm_discard(dshare)) {
492 if (snd_pcm_direct_semaphore_discard(dshare))
493 snd_pcm_direct_semaphore_final(dshare, DIRECT_IPC_SEM_CLIENT);
495 snd_pcm_direct_semaphore_final(dshare, DIRECT_IPC_SEM_CLIENT);
496 free(dshare->bindings);
498 free(dshare);
506 snd_pcm_direct_t *dshare = pcm->private_data;
509 err = snd_pcm_direct_check_xrun(dshare, pcm);
515 if (dshare->state == STATE_RUN_PENDING) {
516 err = snd_pcm_dshare_start_timer(pcm, dshare);
519 } else if (dshare->state == SND_PCM_STATE_RUNNING ||
520 dshare->state == SND_PCM_STATE_DRAINING) {
524 if (dshare->state == SND_PCM_STATE_RUNNING ||
525 dshare->state == SND_PCM_STATE_DRAINING) {
531 snd_pcm_direct_clear_timer_queue(dshare);
538 snd_pcm_direct_t *dshare = pcm->private_data;
541 if (dshare->state == SND_PCM_STATE_RUNNING ||
542 dshare->state == SND_PCM_STATE_DRAINING) {
546 if (dshare->state == SND_PCM_STATE_XRUN)
556 snd_pcm_direct_t *dshare = pcm->private_data;
561 if (dshare->state == SND_PCM_STATE_RUNNING ||
562 dshare->state == SND_PCM_STATE_DRAINING)
568 *tstamp = snd_pcm_hw_fast_tstamp(dshare->spcm);
576 snd_pcm_direct_t *dshare = pcm->private_data;
583 if (dshare->spcm)
584 snd_pcm_dump(dshare->spcm, out);
642 * \brief Creates a new dshare PCM
663 snd_pcm_direct_t *dshare;
670 SNDERR("The dshare plugin supports only playback stream");
674 ret = _snd_pcm_direct_new(&pcm, &dshare, SND_PCM_TYPE_DSHARE, name, opts, params, stream, mode);
679 if (!dshare->bindings) {
686 pcm->private_data = dshare;
687 dshare->state = SND_PCM_STATE_OPEN;
688 dshare->slowptr = opts->slowptr;
689 dshare->max_periods = opts->max_periods;
690 dshare->var_periodsize = opts->var_periodsize;
691 dshare->hw_ptr_alignment = opts->hw_ptr_alignment;
692 dshare->sync_ptr = snd_pcm_dshare_sync_ptr;
706 SNDERR("dshare plugin can be only connected to hw plugin");
710 ret = snd_pcm_direct_initialize_slave(dshare, spcm, params);
716 dshare->spcm = spcm;
718 if (dshare->shmptr->use_server) {
719 ret = snd_pcm_direct_server_create(dshare);
726 dshare->shmptr->type = spcm->type;
728 if (dshare->shmptr->use_server) {
730 snd_pcm_direct_semaphore_up(dshare, DIRECT_IPC_SEM_CLIENT);
731 ret = snd_pcm_direct_client_connect(dshare);
737 snd_pcm_direct_semaphore_down(dshare, DIRECT_IPC_SEM_CLIENT);
738 ret = snd_pcm_direct_open_secondary_client(&spcm, dshare, "dshare_client");
760 SNDERR("dshare plugin can be only connected to hw plugin");
765 ret = snd_pcm_direct_initialize_secondary_slave(dshare, spcm, params);
772 dshare->spcm = spcm;
775 for (chn = 0; dshare->bindings && (chn < dshare->channels); chn++) {
776 unsigned int dchn = dshare->bindings ? dshare->bindings[chn] : chn;
778 dshare->u.dshare.chn_mask |= (1ULL << dchn);
780 if (dshare->shmptr->u.dshare.chn_mask & dshare->u.dshare.chn_mask) {
782 dshare->u.dshare.chn_mask = 0;
786 dshare->shmptr->u.dshare.chn_mask |= dshare->u.dshare.chn_mask;
788 ret = snd_pcm_direct_initialize_poll_fd(dshare);
794 pcm->poll_fd = dshare->poll_fd;
798 snd_pcm_set_hw_ptr(pcm, &dshare->hw_ptr, -1, 0);
799 snd_pcm_set_appl_ptr(pcm, &dshare->appl_ptr, -1, 0);
801 snd_pcm_direct_semaphore_up(dshare, DIRECT_IPC_SEM_CLIENT);
807 if (dshare->shmptr != (void *) -1)
808 dshare->shmptr->u.dshare.chn_mask &= ~dshare->u.dshare.chn_mask;
809 if (dshare->timer)
810 snd_timer_close(dshare->timer);
811 if (dshare->server)
812 snd_pcm_direct_server_discard(dshare);
813 if (dshare->client)
814 snd_pcm_direct_client_discard(dshare);
817 if ((dshare->shmid >= 0) && (snd_pcm_direct_shm_discard(dshare))) {
818 if (snd_pcm_direct_semaphore_discard(dshare))
819 snd_pcm_direct_semaphore_final(dshare, DIRECT_IPC_SEM_CLIENT);
821 snd_pcm_direct_semaphore_up(dshare, DIRECT_IPC_SEM_CLIENT);
823 free(dshare->bindings);
824 free(dshare);
831 \section pcm_plugins_dshare Plugin: dshare
842 type dshare # Direct sharing
910 * \brief Creates a new dshare PCM
914 * \param conf Configuration node with dshare PCM description