Lines Matching refs:pcm

33 void snd_pcm_mmap_appl_backward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
35 snd_pcm_sframes_t appl_ptr = *pcm->appl.ptr;
38 appl_ptr += pcm->boundary;
39 *pcm->appl.ptr = appl_ptr;
42 void snd_pcm_mmap_appl_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
44 snd_pcm_uframes_t appl_ptr = *pcm->appl.ptr;
46 if (appl_ptr >= pcm->boundary)
47 appl_ptr -= pcm->boundary;
48 *pcm->appl.ptr = appl_ptr;
51 void snd_pcm_mmap_hw_backward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
53 snd_pcm_sframes_t hw_ptr = *pcm->hw.ptr;
56 hw_ptr += pcm->boundary;
57 *pcm->hw.ptr = hw_ptr;
60 void snd_pcm_mmap_hw_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
62 snd_pcm_uframes_t hw_ptr = *pcm->hw.ptr;
64 if (hw_ptr >= pcm->boundary)
65 hw_ptr -= pcm->boundary;
66 *pcm->hw.ptr = hw_ptr;
69 static snd_pcm_sframes_t snd_pcm_mmap_write_areas(snd_pcm_t *pcm,
76 if (snd_pcm_mmap_playback_avail(pcm) < size) {
77 SNDMSG("too short avail %ld to size %ld", snd_pcm_mmap_playback_avail(pcm), size);
86 __snd_pcm_mmap_begin(pcm, &pcm_areas, &pcm_offset, &frames);
89 pcm->channels,
90 frames, pcm->format);
91 result = __snd_pcm_mmap_commit(pcm, pcm_offset, frames);
101 static snd_pcm_sframes_t snd_pcm_mmap_read_areas(snd_pcm_t *pcm,
108 if (snd_pcm_mmap_capture_avail(pcm) < size) {
109 SNDMSG("too short avail %ld to size %ld", snd_pcm_mmap_capture_avail(pcm), size);
118 __snd_pcm_mmap_begin(pcm, &pcm_areas, &pcm_offset, &frames);
121 pcm->channels,
122 frames, pcm->format);
123 result = __snd_pcm_mmap_commit(pcm, pcm_offset, frames);
135 * \param pcm PCM handle
150 snd_pcm_sframes_t snd_pcm_mmap_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size)
152 snd_pcm_channel_area_t areas[pcm->channels];
153 snd_pcm_areas_from_buf(pcm, areas, (void*)buffer);
154 return snd_pcm_write_areas(pcm, areas, 0, size,
160 * \param pcm PCM handle
175 snd_pcm_sframes_t snd_pcm_mmap_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size)
177 snd_pcm_channel_area_t areas[pcm->channels];
178 snd_pcm_areas_from_bufs(pcm, areas, bufs);
179 return snd_pcm_write_areas(pcm, areas, 0, size,
185 * \param pcm PCM handle
200 snd_pcm_sframes_t snd_pcm_mmap_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size)
202 snd_pcm_channel_area_t areas[pcm->channels];
203 snd_pcm_areas_from_buf(pcm, areas, buffer);
204 return snd_pcm_read_areas(pcm, areas, 0, size,
210 * \param pcm PCM handle
225 snd_pcm_sframes_t snd_pcm_mmap_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size)
227 snd_pcm_channel_area_t areas[pcm->channels];
228 snd_pcm_areas_from_bufs(pcm, areas, bufs);
229 return snd_pcm_read_areas(pcm, areas, 0, size,
233 int snd_pcm_channel_info_shm(snd_pcm_t *pcm, snd_pcm_channel_info_t *info, int shmid)
235 switch (pcm->access) {
238 info->first = info->channel * pcm->sample_bits;
239 info->step = pcm->frame_bits;
244 info->step = pcm->sample_bits;
247 SNDMSG("invalid access type %d", pcm->access);
251 if (pcm->hw_flags & SND_PCM_HW_PARAMS_EXPORT_BUFFER) {
260 int snd_pcm_mmap(snd_pcm_t *pcm)
264 assert(pcm);
265 if (CHECK_SANITY(! pcm->setup)) {
269 if (CHECK_SANITY(pcm->mmap_channels || pcm->running_areas)) {
273 if (pcm->ops->mmap)
274 err = pcm->ops->mmap(pcm);
279 if (pcm->mmap_shadow)
281 pcm->mmap_channels = calloc(pcm->channels, sizeof(pcm->mmap_channels[0]));
282 if (!pcm->mmap_channels)
284 pcm->running_areas = calloc(pcm->channels, sizeof(pcm->running_areas[0]));
285 if (!pcm->running_areas) {
286 free(pcm->mmap_channels);
287 pcm->mmap_channels = NULL;
290 for (c = 0; c < pcm->channels; ++c) {
291 snd_pcm_channel_info_t *i = &pcm->mmap_channels[c];
293 err = snd_pcm_channel_info(pcm, i);
295 free(pcm->mmap_channels);
296 free(pcm->running_areas);
297 pcm->mmap_channels = NULL;
298 pcm->running_areas = NULL;
302 for (c = 0; c < pcm->channels; ++c) {
303 snd_pcm_channel_info_t *i = &pcm->mmap_channels[c];
304 snd_pcm_channel_area_t *a = &pcm->running_areas[c];
314 size = i->first + i->step * (pcm->buffer_size - 1) + pcm->sample_bits;
315 for (c1 = c + 1; c1 < pcm->channels; ++c1) {
316 snd_pcm_channel_info_t *i1 = &pcm->mmap_channels[c1];
335 s = i1->first + i1->step * (pcm->buffer_size - 1) + pcm->sample_bits;
376 if (pcm->access == SND_PCM_ACCESS_MMAP_INTERLEAVED ||
377 pcm->access == SND_PCM_ACCESS_RW_INTERLEAVED) {
379 for (c1 = c + 1; c1 < pcm->channels; c1++) {
380 snd_pcm_channel_info_t *i1 = &pcm->mmap_channels[c1];
411 for (c1 = c + 1; c1 < pcm->channels; ++c1) {
412 snd_pcm_channel_info_t *i1 = &pcm->mmap_channels[c1];
426 if (pcm->access != SND_PCM_ACCESS_MMAP_INTERLEAVED &&
427 pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED)
442 int snd_pcm_munmap(snd_pcm_t *pcm)
446 assert(pcm);
447 if (CHECK_SANITY(! pcm->mmap_channels)) {
451 if (pcm->mmap_shadow) {
452 if (pcm->ops->munmap)
453 return pcm->ops->munmap(pcm);
457 for (c = 0; c < pcm->channels; ++c) {
458 snd_pcm_channel_info_t *i = &pcm->mmap_channels[c];
460 size_t size = i->first + i->step * (pcm->buffer_size - 1) + pcm->sample_bits;
463 for (c1 = c + 1; c1 < pcm->channels; ++c1) {
464 snd_pcm_channel_info_t *i1 = &pcm->mmap_channels[c1];
469 s = i1->first + i1->step * (pcm->buffer_size - 1) + pcm->sample_bits;
489 if (pcm->access == SND_PCM_ACCESS_MMAP_INTERLEAVED ||
490 pcm->access == SND_PCM_ACCESS_RW_INTERLEAVED) {
492 for (c1 = c + 1; c1 < pcm->channels; c1++) {
493 snd_pcm_channel_info_t *i1 = &pcm->mmap_channels[c1];
514 if (pcm->ops->munmap)
515 err = pcm->ops->munmap(pcm);
520 free(pcm->mmap_channels);
521 free(pcm->running_areas);
522 pcm->mmap_channels = NULL;
523 pcm->running_areas = NULL;
527 /* called in pcm lock */
528 snd_pcm_sframes_t snd_pcm_write_mmap(snd_pcm_t *pcm, snd_pcm_uframes_t offset,
537 snd_pcm_uframes_t cont = pcm->buffer_size - offset;
540 switch (pcm->access) {
543 const snd_pcm_channel_area_t *a = snd_pcm_mmap_areas(pcm);
545 snd_pcm_unlock(pcm); /* to avoid deadlock */
546 err = _snd_pcm_writei(pcm, buf, frames);
547 snd_pcm_lock(pcm);
554 unsigned int channels = pcm->channels;
557 const snd_pcm_channel_area_t *areas = snd_pcm_mmap_areas(pcm);
562 snd_pcm_unlock(pcm); /* to avoid deadlock */
563 err = _snd_pcm_writen(pcm, bufs, frames);
564 snd_pcm_lock(pcm);
570 SNDMSG("invalid access type %d", pcm->access);
576 offset = (offset + frames) % pcm->buffer_size;
583 /* called in pcm lock */
584 snd_pcm_sframes_t snd_pcm_read_mmap(snd_pcm_t *pcm, snd_pcm_uframes_t offset,
593 snd_pcm_uframes_t cont = pcm->buffer_size - offset;
596 switch (pcm->access) {
599 const snd_pcm_channel_area_t *a = snd_pcm_mmap_areas(pcm);
601 snd_pcm_unlock(pcm); /* to avoid deadlock */
602 err = _snd_pcm_readi(pcm, buf, frames);
603 snd_pcm_lock(pcm);
610 snd_pcm_uframes_t channels = pcm->channels;
613 const snd_pcm_channel_area_t *areas = snd_pcm_mmap_areas(pcm);
618 snd_pcm_unlock(pcm); /* to avoid deadlock */
619 err = _snd_pcm_readn(pcm->fast_op_arg, bufs, frames);
620 snd_pcm_lock(pcm);
626 SNDMSG("invalid access type %d", pcm->access);
632 offset = (offset + frames) % pcm->buffer_size;