Lines Matching refs:pcm

2  * \file pcm/pcm_dsnoop.c
58 static int snoop_timestamp(snd_pcm_t *pcm)
60 snd_pcm_direct_t *dsnoop = pcm->private_data;
103 static void snd_pcm_dsnoop_sync_area(snd_pcm_t *pcm, snd_pcm_uframes_t slave_hw_ptr, snd_pcm_uframes_t size)
105 snd_pcm_direct_t *dsnoop = pcm->private_data;
111 dst_areas = snd_pcm_mmap_areas(pcm);
113 hw_ptr %= pcm->buffer_size;
116 transfer = hw_ptr + size > pcm->buffer_size ? pcm->buffer_size - hw_ptr : size;
124 hw_ptr %= pcm->buffer_size;
131 static int snd_pcm_dsnoop_sync_ptr(snd_pcm_t *pcm)
133 snd_pcm_direct_t *dsnoop = pcm->private_data;
141 snoop_timestamp(pcm);
143 err = snd_pcm_direct_check_xrun(dsnoop, pcm);
149 snd_pcm_dsnoop_sync_area(pcm, old_slave_hw_ptr, diff);
151 dsnoop->hw_ptr %= pcm->boundary;
153 if (pcm->stop_threshold >= pcm->boundary) /* don't care */
155 if ((avail = snd_pcm_mmap_capture_avail(pcm)) >= pcm->stop_threshold) {
156 gettimestamp(&dsnoop->trigger_tstamp, pcm->tstamp_type);
170 static int snd_pcm_dsnoop_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
172 snd_pcm_direct_t *dsnoop = pcm->private_data;
178 snd_pcm_dsnoop_sync_ptr(pcm);
187 status->hw_ptr = *pcm->hw.ptr; /* boundary may be different */
188 status->appl_ptr = *pcm->appl.ptr; /* slave PCM doesn't set appl_ptr */
190 status->avail = snd_pcm_mmap_capture_avail(pcm);
193 status->delay = snd_pcm_mmap_capture_delay(pcm);
197 static snd_pcm_state_t snd_pcm_dsnoop_state(snd_pcm_t *pcm)
199 snd_pcm_direct_t *dsnoop = pcm->private_data;
201 snd_pcm_direct_check_xrun(dsnoop, pcm);
205 static int snd_pcm_dsnoop_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
207 snd_pcm_direct_t *dsnoop = pcm->private_data;
213 err = snd_pcm_dsnoop_sync_ptr(pcm);
219 *delayp = snd_pcm_mmap_capture_delay(pcm);
230 static int snd_pcm_dsnoop_hwsync(snd_pcm_t *pcm)
232 snd_pcm_direct_t *dsnoop = pcm->private_data;
237 return snd_pcm_dsnoop_sync_ptr(pcm);
250 static int snd_pcm_dsnoop_reset(snd_pcm_t *pcm)
252 snd_pcm_direct_t *dsnoop = pcm->private_data;
253 dsnoop->hw_ptr %= pcm->period_size;
255 snd_pcm_direct_reset_slave_ptr(pcm, dsnoop, dsnoop->slave_hw_ptr);
259 static int snd_pcm_dsnoop_start(snd_pcm_t *pcm)
261 snd_pcm_direct_t *dsnoop = pcm->private_data;
267 snoop_timestamp(pcm);
268 snd_pcm_direct_reset_slave_ptr(pcm, dsnoop, dsnoop->slave_hw_ptr);
277 static int snd_pcm_dsnoop_drop(snd_pcm_t *pcm)
279 snd_pcm_direct_t *dsnoop = pcm->private_data;
288 static int __snd_pcm_dsnoop_drain(snd_pcm_t *pcm)
290 snd_pcm_direct_t *dsnoop = pcm->private_data;
296 stop_threshold = pcm->stop_threshold;
297 if (pcm->stop_threshold > pcm->buffer_size)
298 pcm->stop_threshold = pcm->buffer_size;
300 err = snd_pcm_dsnoop_sync_ptr(pcm);
303 if (pcm->mode & SND_PCM_NONBLOCK)
305 __snd_pcm_wait_in_lock(pcm, SND_PCM_WAIT_DRAIN);
307 pcm->stop_threshold = stop_threshold;
308 return snd_pcm_dsnoop_drop(pcm);
311 static int snd_pcm_dsnoop_drain(snd_pcm_t *pcm)
315 snd_pcm_lock(pcm);
316 err = __snd_pcm_dsnoop_drain(pcm);
317 snd_pcm_unlock(pcm);
321 static int snd_pcm_dsnoop_pause(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int enable ATTRIBUTE_UNUSED)
326 static snd_pcm_sframes_t snd_pcm_dsnoop_rewindable(snd_pcm_t *pcm)
328 return snd_pcm_mmap_capture_hw_rewindable(pcm);
331 static snd_pcm_sframes_t snd_pcm_dsnoop_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
335 avail = snd_pcm_dsnoop_rewindable(pcm);
338 snd_pcm_mmap_appl_backward(pcm, frames);
342 static snd_pcm_sframes_t snd_pcm_dsnoop_forwardable(snd_pcm_t *pcm)
344 return snd_pcm_mmap_capture_avail(pcm);
347 static snd_pcm_sframes_t snd_pcm_dsnoop_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
351 avail = snd_pcm_dsnoop_forwardable(pcm);
354 snd_pcm_mmap_appl_forward(pcm, frames);
358 static snd_pcm_sframes_t snd_pcm_dsnoop_writei(snd_pcm_t *pcm ATTRIBUTE_UNUSED, const void *buffer ATTRIBUTE_UNUSED, snd_pcm_uframes_t size ATTRIBUTE_UNUSED)
363 static snd_pcm_sframes_t snd_pcm_dsnoop_writen(snd_pcm_t *pcm ATTRIBUTE_UNUSED, void **bufs ATTRIBUTE_UNUSED, snd_pcm_uframes_t size ATTRIBUTE_UNUSED)
368 static int snd_pcm_dsnoop_close(snd_pcm_t *pcm)
370 snd_pcm_direct_t *dsnoop = pcm->private_data;
386 pcm->private_data = NULL;
391 static snd_pcm_sframes_t snd_pcm_dsnoop_mmap_commit(snd_pcm_t *pcm,
395 snd_pcm_direct_t *dsnoop = pcm->private_data;
398 err = snd_pcm_direct_check_xrun(dsnoop, pcm);
402 err = snd_pcm_dsnoop_sync_ptr(pcm);
406 snd_pcm_mmap_appl_forward(pcm, size);
408 if (snd_pcm_mmap_capture_avail(pcm) < pcm->avail_min)
413 static snd_pcm_sframes_t snd_pcm_dsnoop_avail_update(snd_pcm_t *pcm)
415 snd_pcm_direct_t *dsnoop = pcm->private_data;
419 err = snd_pcm_dsnoop_sync_ptr(pcm);
426 return snd_pcm_mmap_capture_avail(pcm);
429 static int snd_pcm_dsnoop_htimestamp(snd_pcm_t *pcm,
433 snd_pcm_direct_t *dsnoop = pcm->private_data;
440 snd_pcm_dsnoop_sync_ptr(pcm);
441 avail1 = snd_pcm_mmap_capture_avail(pcm);
451 static void snd_pcm_dsnoop_dump(snd_pcm_t *pcm, snd_output_t *out)
453 snd_pcm_direct_t *dsnoop = pcm->private_data;
456 if (pcm->setup) {
458 snd_pcm_dump_setup(pcm, out);
534 snd_pcm_t *pcm, *spcm = NULL;
545 ret = _snd_pcm_direct_new(&pcm, &dsnoop, SND_PCM_TYPE_DSNOOP, name, opts, params, stream, mode);
550 pcm->ops = &snd_pcm_dsnoop_ops;
551 pcm->fast_ops = &snd_pcm_dsnoop_fast_ops;
552 pcm->private_data = dsnoop;
647 pcm->poll_fd = dsnoop->poll_fd;
648 pcm->poll_events = POLLIN; /* it's different than other plugins */
649 pcm->tstamp_type = spcm->tstamp_type;
650 pcm->mmap_rw = 1;
651 snd_pcm_set_hw_ptr(pcm, &dsnoop->hw_ptr, -1, 0);
652 snd_pcm_set_appl_ptr(pcm, &dsnoop->appl_ptr, -1, 0);
659 *pcmp = pcm;
680 snd_pcm_free(pcm);
695 pcm.name {
712 pcm STR # slave PCM name
714 pcm { } # slave PCM definition