Lines Matching refs:pcm
2 * \file pcm/pcm_dshare.c
59 static void do_silence(snd_pcm_t *pcm)
61 snd_pcm_direct_t *dshare = pcm->private_data;
108 static void snd_pcm_dshare_sync_area(snd_pcm_t *pcm)
110 snd_pcm_direct_t *dshare = pcm->private_data;
116 size = pcm_frame_diff(dshare->appl_ptr, dshare->last_appl_ptr, pcm->boundary);
134 src_areas = snd_pcm_mmap_areas(pcm);
136 appl_ptr = dshare->last_appl_ptr % pcm->buffer_size;
138 dshare->last_appl_ptr %= pcm->boundary;
144 if (appl_ptr + transfer > pcm->buffer_size)
145 transfer = pcm->buffer_size - appl_ptr;
155 appl_ptr %= pcm->buffer_size;
162 static int snd_pcm_dshare_sync_ptr0(snd_pcm_t *pcm, snd_pcm_uframes_t slave_hw_ptr)
164 snd_pcm_direct_t *dshare = pcm->private_data;
178 dshare->hw_ptr %= pcm->boundary;
180 if (pcm->stop_threshold >= pcm->boundary) /* don't care */
182 avail = snd_pcm_mmap_playback_avail(pcm);
185 if (avail >= pcm->stop_threshold) {
187 do_silence(pcm);
188 gettimestamp(&dshare->trigger_tstamp, pcm->tstamp_type);
200 static int snd_pcm_dshare_sync_ptr(snd_pcm_t *pcm)
202 snd_pcm_direct_t *dshare = pcm->private_data;
209 err = snd_pcm_direct_check_xrun(dshare, pcm);
213 return snd_pcm_dshare_sync_ptr0(pcm, slave_hw_ptr);
220 static snd_pcm_state_t snd_pcm_dshare_state(snd_pcm_t *pcm);
222 static int snd_pcm_dshare_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
224 snd_pcm_direct_t *dshare = pcm->private_data;
232 snd_pcm_dshare_sync_ptr0(pcm, status->hw_ptr);
233 status->delay = snd_pcm_mmap_playback_delay(pcm);
238 status->state = snd_pcm_dshare_state(pcm);
239 status->hw_ptr = *pcm->hw.ptr; /* boundary may be different */
240 status->appl_ptr = *pcm->appl.ptr; /* slave PCM doesn't set appl_ptr */
242 status->avail = snd_pcm_mmap_playback_avail(pcm);
248 static snd_pcm_state_t snd_pcm_dshare_state(snd_pcm_t *pcm)
250 snd_pcm_direct_t *dshare = pcm->private_data;
252 snd_pcm_direct_check_xrun(dshare, pcm);
258 static int snd_pcm_dshare_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
260 snd_pcm_direct_t *dshare = pcm->private_data;
266 err = snd_pcm_dshare_sync_ptr(pcm);
273 *delayp = snd_pcm_mmap_playback_delay(pcm);
284 static int snd_pcm_dshare_hwsync(snd_pcm_t *pcm)
286 snd_pcm_direct_t *dshare = pcm->private_data;
291 return snd_pcm_dshare_sync_ptr(pcm);
304 static int snd_pcm_dshare_reset(snd_pcm_t *pcm)
306 snd_pcm_direct_t *dshare = pcm->private_data;
307 dshare->hw_ptr %= pcm->period_size;
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)
318 snd_pcm_direct_reset_slave_ptr(pcm, dshare, *dshare->spcm->hw.ptr);
326 static int snd_pcm_dshare_start(snd_pcm_t *pcm)
328 snd_pcm_direct_t *dshare = pcm->private_data;
334 avail = snd_pcm_mmap_playback_hw_avail(pcm);
340 err = snd_pcm_dshare_start_timer(pcm, dshare);
343 snd_pcm_dshare_sync_area(pcm);
345 gettimestamp(&dshare->trigger_tstamp, pcm->tstamp_type);
349 static int snd_pcm_dshare_drop(snd_pcm_t *pcm)
351 snd_pcm_direct_t *dshare = pcm->private_data;
356 do_silence(pcm);
361 static int __snd_pcm_dshare_drain(snd_pcm_t *pcm)
363 snd_pcm_direct_t *dshare = pcm->private_data;
376 if (pcm->mode & SND_PCM_NONBLOCK)
379 if (snd_pcm_mmap_playback_hw_avail(pcm) > 0)
380 snd_pcm_dshare_start(pcm);
382 snd_pcm_dshare_drop(pcm);
388 snd_pcm_dshare_drop(pcm);
392 stop_threshold = pcm->stop_threshold;
393 if (pcm->stop_threshold > pcm->buffer_size)
394 pcm->stop_threshold = pcm->buffer_size;
397 err = snd_pcm_dshare_sync_ptr(pcm);
399 snd_pcm_dshare_drop(pcm);
403 snd_pcm_dshare_sync_area(pcm);
404 snd_pcm_wait_nocheck(pcm, SND_PCM_WAIT_DRAIN);
415 pcm->stop_threshold = stop_threshold;
419 static int snd_pcm_dshare_drain(snd_pcm_t *pcm)
423 snd_pcm_lock(pcm);
424 err = __snd_pcm_dshare_drain(pcm);
425 snd_pcm_unlock(pcm);
429 static int snd_pcm_dshare_pause(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int enable ATTRIBUTE_UNUSED)
434 static snd_pcm_sframes_t snd_pcm_dshare_rewindable(snd_pcm_t *pcm)
436 return snd_pcm_mmap_playback_hw_rewindable(pcm);
439 static snd_pcm_sframes_t snd_pcm_dshare_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
443 avail = snd_pcm_dshare_rewindable(pcm);
446 snd_pcm_mmap_appl_backward(pcm, frames);
450 static snd_pcm_sframes_t snd_pcm_dshare_forwardable(snd_pcm_t *pcm)
452 return snd_pcm_mmap_playback_avail(pcm);
455 static snd_pcm_sframes_t snd_pcm_dshare_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
459 avail = snd_pcm_dshare_forwardable(pcm);
462 snd_pcm_mmap_appl_forward(pcm, frames);
466 static snd_pcm_sframes_t snd_pcm_dshare_readi(snd_pcm_t *pcm ATTRIBUTE_UNUSED, void *buffer ATTRIBUTE_UNUSED, snd_pcm_uframes_t size ATTRIBUTE_UNUSED)
471 static snd_pcm_sframes_t snd_pcm_dshare_readn(snd_pcm_t *pcm ATTRIBUTE_UNUSED, void **bufs ATTRIBUTE_UNUSED, snd_pcm_uframes_t size ATTRIBUTE_UNUSED)
476 static int snd_pcm_dshare_close(snd_pcm_t *pcm)
478 snd_pcm_direct_t *dshare = pcm->private_data;
483 do_silence(pcm);
497 pcm->private_data = NULL;
502 static snd_pcm_sframes_t snd_pcm_dshare_mmap_commit(snd_pcm_t *pcm,
506 snd_pcm_direct_t *dshare = pcm->private_data;
509 err = snd_pcm_direct_check_xrun(dshare, pcm);
514 snd_pcm_mmap_appl_forward(pcm, size);
516 err = snd_pcm_dshare_start_timer(pcm, dshare);
521 if ((err = snd_pcm_dshare_sync_ptr(pcm)) < 0)
528 snd_pcm_dshare_sync_area(pcm);
530 if (snd_pcm_mmap_playback_avail(pcm) < pcm->avail_min)
536 static snd_pcm_sframes_t snd_pcm_dshare_avail_update(snd_pcm_t *pcm)
538 snd_pcm_direct_t *dshare = pcm->private_data;
543 if ((err = snd_pcm_dshare_sync_ptr(pcm)) < 0)
549 return snd_pcm_mmap_playback_avail(pcm);
552 static int snd_pcm_dshare_htimestamp(snd_pcm_t *pcm,
556 snd_pcm_direct_t *dshare = pcm->private_data;
563 snd_pcm_dshare_sync_ptr(pcm);
564 avail1 = snd_pcm_mmap_playback_avail(pcm);
574 static void snd_pcm_dshare_dump(snd_pcm_t *pcm, snd_output_t *out)
576 snd_pcm_direct_t *dshare = pcm->private_data;
579 if (pcm->setup) {
581 snd_pcm_dump_setup(pcm, out);
662 snd_pcm_t *pcm, *spcm = NULL;
674 ret = _snd_pcm_direct_new(&pcm, &dshare, SND_PCM_TYPE_DSHARE, name, opts, params, stream, mode);
680 pcm->ops = &snd_pcm_dshare_dummy_ops;
681 pcm->fast_ops = &snd_pcm_dshare_fast_dummy_ops;
683 pcm->ops = &snd_pcm_dshare_ops;
684 pcm->fast_ops = &snd_pcm_dshare_fast_ops;
686 pcm->private_data = dshare;
794 pcm->poll_fd = dshare->poll_fd;
795 pcm->poll_events = POLLIN; /* it's different than other plugins */
796 pcm->tstamp_type = spcm->tstamp_type;
797 pcm->mmap_rw = 1;
798 snd_pcm_set_hw_ptr(pcm, &dshare->hw_ptr, -1, 0);
799 snd_pcm_set_appl_ptr(pcm, &dshare->appl_ptr, -1, 0);
803 *pcmp = pcm;
825 snd_pcm_free(pcm);
841 pcm.name {
858 pcm STR # slave PCM name
860 pcm { } # slave PCM definition