Lines Matching defs:dsnoop

4  * \brief PCM Capture Stream Snooping (dsnoop) Plugin Interface
60 snd_pcm_direct_t *dsnoop = pcm->private_data;
65 ptr2 = *dsnoop->spcm->hw.ptr;
69 dsnoop->update_tstamp = snd_pcm_hw_fast_tstamp(dsnoop->spcm);
71 dsnoop->slave_hw_ptr = ptr1;
75 static void snoop_areas(snd_pcm_direct_t *dsnoop,
85 channels = dsnoop->channels;
86 format = dsnoop->shmptr->s.format;
87 if (dsnoop->interleaved) {
94 schn = dsnoop->bindings ? dsnoop->bindings[chn] : chn;
105 snd_pcm_direct_t *dsnoop = pcm->private_data;
106 snd_pcm_uframes_t hw_ptr = dsnoop->hw_ptr;
112 src_areas = snd_pcm_mmap_areas(dsnoop->spcm);
114 slave_hw_ptr %= dsnoop->slave_buffer_size;
117 transfer = slave_hw_ptr + transfer > dsnoop->slave_buffer_size ?
118 dsnoop->slave_buffer_size - slave_hw_ptr : transfer;
120 snoop_areas(dsnoop, src_areas, dst_areas, slave_hw_ptr, hw_ptr, transfer);
122 slave_hw_ptr %= dsnoop->slave_buffer_size;
133 snd_pcm_direct_t *dsnoop = pcm->private_data;
138 if (dsnoop->slowptr)
139 snd_pcm_hwsync(dsnoop->spcm);
140 old_slave_hw_ptr = dsnoop->slave_hw_ptr;
142 slave_hw_ptr = dsnoop->slave_hw_ptr;
143 err = snd_pcm_direct_check_xrun(dsnoop, pcm);
146 diff = pcm_frame_diff(slave_hw_ptr, old_slave_hw_ptr, dsnoop->slave_boundary);
150 dsnoop->hw_ptr += diff;
151 dsnoop->hw_ptr %= pcm->boundary;
156 gettimestamp(&dsnoop->trigger_tstamp, pcm->tstamp_type);
157 dsnoop->state = SND_PCM_STATE_XRUN;
158 dsnoop->avail_max = avail;
161 if (avail > dsnoop->avail_max)
162 dsnoop->avail_max = avail;
172 snd_pcm_direct_t *dsnoop = pcm->private_data;
175 switch(dsnoop->state) {
184 snd_pcm_status(dsnoop->spcm, status);
185 state = snd_pcm_state(dsnoop->spcm);
186 status->state = state == SND_PCM_STATE_RUNNING ? dsnoop->state : state;
189 status->trigger_tstamp = dsnoop->trigger_tstamp;
191 status->avail_max = status->avail > dsnoop->avail_max ? status->avail : dsnoop->avail_max;
192 dsnoop->avail_max = 0;
199 snd_pcm_direct_t *dsnoop = pcm->private_data;
201 snd_pcm_direct_check_xrun(dsnoop, pcm);
202 return dsnoop->state;
207 snd_pcm_direct_t *dsnoop = pcm->private_data;
210 switch(dsnoop->state) {
232 snd_pcm_direct_t *dsnoop = pcm->private_data;
234 switch(dsnoop->state) {
252 snd_pcm_direct_t *dsnoop = pcm->private_data;
253 dsnoop->hw_ptr %= pcm->period_size;
254 dsnoop->appl_ptr = dsnoop->hw_ptr;
255 snd_pcm_direct_reset_slave_ptr(pcm, dsnoop, dsnoop->slave_hw_ptr);
261 snd_pcm_direct_t *dsnoop = pcm->private_data;
264 if (dsnoop->state != SND_PCM_STATE_PREPARED)
266 snd_pcm_hwsync(dsnoop->spcm);
268 snd_pcm_direct_reset_slave_ptr(pcm, dsnoop, dsnoop->slave_hw_ptr);
269 err = snd_timer_start(dsnoop->timer);
272 dsnoop->state = SND_PCM_STATE_RUNNING;
273 dsnoop->trigger_tstamp = dsnoop->update_tstamp;
279 snd_pcm_direct_t *dsnoop = pcm->private_data;
280 if (dsnoop->state == SND_PCM_STATE_OPEN)
282 dsnoop->state = SND_PCM_STATE_SETUP;
283 snd_timer_stop(dsnoop->timer);
290 snd_pcm_direct_t *dsnoop = pcm->private_data;
294 if (dsnoop->state == SND_PCM_STATE_OPEN)
299 while (dsnoop->state == SND_PCM_STATE_RUNNING) {
370 snd_pcm_direct_t *dsnoop = pcm->private_data;
372 if (dsnoop->timer)
373 snd_timer_close(dsnoop->timer);
374 snd_pcm_direct_semaphore_down(dsnoop, DIRECT_IPC_SEM_CLIENT);
375 snd_pcm_close(dsnoop->spcm);
376 if (dsnoop->server)
377 snd_pcm_direct_server_discard(dsnoop);
378 if (dsnoop->client)
379 snd_pcm_direct_client_discard(dsnoop);
380 if (snd_pcm_direct_shm_discard(dsnoop)) {
381 if (snd_pcm_direct_semaphore_discard(dsnoop))
382 snd_pcm_direct_semaphore_final(dsnoop, DIRECT_IPC_SEM_CLIENT);
384 snd_pcm_direct_semaphore_final(dsnoop, DIRECT_IPC_SEM_CLIENT);
385 free(dsnoop->bindings);
387 free(dsnoop);
395 snd_pcm_direct_t *dsnoop = pcm->private_data;
398 err = snd_pcm_direct_check_xrun(dsnoop, pcm);
401 if (dsnoop->state == SND_PCM_STATE_RUNNING) {
409 snd_pcm_direct_clear_timer_queue(dsnoop);
415 snd_pcm_direct_t *dsnoop = pcm->private_data;
418 if (dsnoop->state == SND_PCM_STATE_RUNNING) {
423 if (dsnoop->state == SND_PCM_STATE_XRUN)
433 snd_pcm_direct_t *dsnoop = pcm->private_data;
438 if (dsnoop->state == SND_PCM_STATE_RUNNING ||
439 dsnoop->state == SND_PCM_STATE_DRAINING)
445 *tstamp = snd_pcm_hw_fast_tstamp(dsnoop->spcm);
453 snd_pcm_direct_t *dsnoop = pcm->private_data;
460 if (dsnoop->spcm)
461 snd_pcm_dump(dsnoop->spcm, out);
514 * \brief Creates a new dsnoop PCM
535 snd_pcm_direct_t *dsnoop;
541 SNDERR("The dsnoop plugin supports only capture stream");
545 ret = _snd_pcm_direct_new(&pcm, &dsnoop, SND_PCM_TYPE_DSNOOP, name, opts, params, stream, mode);
552 pcm->private_data = dsnoop;
553 dsnoop->state = SND_PCM_STATE_OPEN;
554 dsnoop->slowptr = opts->slowptr;
555 dsnoop->max_periods = opts->max_periods;
556 dsnoop->var_periodsize = opts->var_periodsize;
557 dsnoop->sync_ptr = snd_pcm_dsnoop_sync_ptr;
558 dsnoop->hw_ptr_alignment = opts->hw_ptr_alignment;
572 SNDERR("dsnoop plugin can be only connected to hw plugin");
576 ret = snd_pcm_direct_initialize_slave(dsnoop, spcm, params);
582 dsnoop->spcm = spcm;
584 if (dsnoop->shmptr->use_server) {
585 ret = snd_pcm_direct_server_create(dsnoop);
592 dsnoop->shmptr->type = spcm->type;
594 if (dsnoop->shmptr->use_server) {
596 snd_pcm_direct_semaphore_up(dsnoop, DIRECT_IPC_SEM_CLIENT);
597 ret = snd_pcm_direct_client_connect(dsnoop);
603 snd_pcm_direct_semaphore_down(dsnoop, DIRECT_IPC_SEM_CLIENT);
605 ret = snd_pcm_direct_open_secondary_client(&spcm, dsnoop, "dsnoop_client");
626 SNDERR("dsnoop plugin can be only connected to hw plugin");
631 ret = snd_pcm_direct_initialize_secondary_slave(dsnoop, spcm, params);
638 dsnoop->spcm = spcm;
641 ret = snd_pcm_direct_initialize_poll_fd(dsnoop);
647 pcm->poll_fd = dsnoop->poll_fd;
651 snd_pcm_set_hw_ptr(pcm, &dsnoop->hw_ptr, -1, 0);
652 snd_pcm_set_appl_ptr(pcm, &dsnoop->appl_ptr, -1, 0);
654 if (dsnoop->channels == UINT_MAX)
655 dsnoop->channels = dsnoop->shmptr->s.channels;
657 snd_pcm_direct_semaphore_up(dsnoop, DIRECT_IPC_SEM_CLIENT);
663 if (dsnoop->timer)
664 snd_timer_close(dsnoop->timer);
665 if (dsnoop->server)
666 snd_pcm_direct_server_discard(dsnoop);
667 if (dsnoop->client)
668 snd_pcm_direct_client_discard(dsnoop);
671 if ((dsnoop->shmid >= 0) && (snd_pcm_direct_shm_discard(dsnoop))) {
672 if (snd_pcm_direct_semaphore_discard(dsnoop))
673 snd_pcm_direct_semaphore_final(dsnoop, DIRECT_IPC_SEM_CLIENT);
675 snd_pcm_direct_semaphore_up(dsnoop, DIRECT_IPC_SEM_CLIENT);
678 free(dsnoop->bindings);
679 free(dsnoop);
686 \section pcm_plugins_dsnoop Plugin: dsnoop
696 type dsnoop # Direct snoop
762 * \brief Creates a new dsnoop PCM
766 * \param conf Configuration node with dsnoop PCM description