Lines Matching refs:pcm
2 * \file pcm/pcm_multi.c
45 snd_pcm_t *pcm;
67 static int snd_pcm_multi_close(snd_pcm_t *pcm)
69 snd_pcm_multi_t *multi = pcm->private_data;
75 int err = snd_pcm_close(slave->pcm);
86 static int snd_pcm_multi_nonblock(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int nonblock ATTRIBUTE_UNUSED)
91 static int snd_pcm_multi_async(snd_pcm_t *pcm, int sig, pid_t pid)
93 snd_pcm_multi_t *multi = pcm->private_data;
94 snd_pcm_t *slave_0 = multi->slaves[multi->master_slave].pcm;
98 static int snd_pcm_multi_poll_descriptors_count(snd_pcm_t *pcm)
100 snd_pcm_multi_t *multi = pcm->private_data;
101 snd_pcm_t *slave_0 = multi->slaves[multi->master_slave].pcm;
105 static int snd_pcm_multi_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space)
107 snd_pcm_multi_t *multi = pcm->private_data;
109 snd_pcm_t *slave_0 = multi->slaves[multi->master_slave].pcm;
114 slave = multi->slaves[i].pcm;
125 static int snd_pcm_multi_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents)
127 snd_pcm_multi_t *multi = pcm->private_data;
128 snd_pcm_t *slave_0 = multi->slaves[multi->master_slave].pcm;
132 static int snd_pcm_multi_info(snd_pcm_t *pcm, snd_pcm_info_t *info)
134 snd_pcm_multi_t *multi = pcm->private_data;
139 err = snd_pcm_info(multi->slaves[n].pcm, info);
146 static int snd_pcm_multi_hw_refine_cprepare(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
148 snd_pcm_multi_t *multi = pcm->private_data;
165 static int snd_pcm_multi_hw_refine_sprepare(snd_pcm_t *pcm, unsigned int slave_idx,
168 snd_pcm_multi_t *multi = pcm->private_data;
179 static int snd_pcm_multi_hw_refine_schange(snd_pcm_t *pcm ATTRIBUTE_UNUSED,
212 static int snd_pcm_multi_hw_refine_cchange(snd_pcm_t *pcm ATTRIBUTE_UNUSED,
247 static int snd_pcm_multi_hw_refine_slave(snd_pcm_t *pcm,
251 snd_pcm_multi_t *multi = pcm->private_data;
252 snd_pcm_t *slave = multi->slaves[slave_idx].pcm;
256 static int snd_pcm_multi_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
258 snd_pcm_multi_t *multi = pcm->private_data;
263 err = snd_pcm_multi_hw_refine_cprepare(pcm, params);
267 err = snd_pcm_multi_hw_refine_sprepare(pcm, k, &sparams[k]);
277 err = snd_pcm_multi_hw_refine_schange(pcm, k, params, &sparams[k]);
279 err = snd_pcm_multi_hw_refine_slave(pcm, k, &sparams[k]);
281 snd_pcm_multi_hw_refine_cchange(pcm, k, params, &sparams[k]);
284 err = snd_pcm_multi_hw_refine_cchange(pcm, k, params, &sparams[k]);
288 err = snd_pcm_hw_refine_soft(pcm, params);
297 static int snd_pcm_multi_hw_params_slave(snd_pcm_t *pcm,
301 snd_pcm_multi_t *multi = pcm->private_data;
302 snd_pcm_t *slave = multi->slaves[slave_idx].pcm;
331 if (snd_pcm_link(multi->slaves[0].pcm, multi->slaves[i].pcm) >= 0)
332 multi->slaves[i].linked = multi->slaves[0].pcm;
336 static int snd_pcm_multi_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
338 snd_pcm_multi_t *multi = pcm->private_data;
343 err = snd_pcm_multi_hw_refine_sprepare(pcm, i, &sparams[i]);
345 err = snd_pcm_multi_hw_refine_schange(pcm, i, params, &sparams[i]);
347 err = snd_pcm_multi_hw_params_slave(pcm, i, &sparams[i]);
349 snd_pcm_multi_hw_refine_cchange(pcm, i, params, &sparams[i]);
357 static int snd_pcm_multi_hw_free(snd_pcm_t *pcm)
359 snd_pcm_multi_t *multi = pcm->private_data;
363 snd_pcm_t *slave = multi->slaves[i].pcm;
377 static int snd_pcm_multi_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t *params)
379 snd_pcm_multi_t *multi = pcm->private_data;
383 snd_pcm_t *slave = multi->slaves[i].pcm;
391 static snd_pcm_sframes_t snd_pcm_multi_avail_update(snd_pcm_t *pcm);
392 static int snd_pcm_multi_status(snd_pcm_t *pcm, snd_pcm_status_t *status)
394 snd_pcm_multi_t *multi = pcm->private_data;
395 snd_pcm_t *slave = multi->slaves[multi->master_slave].pcm;
400 snd_pcm_sframes_t avail = snd_pcm_multi_avail_update(pcm);
403 status->hw_ptr = *pcm->hw.ptr;
408 static snd_pcm_state_t snd_pcm_multi_state(snd_pcm_t *pcm)
410 snd_pcm_multi_t *multi = pcm->private_data;
411 snd_pcm_t *slave = multi->slaves[multi->master_slave].pcm;
415 static void snd_pcm_multi_hwptr_update(snd_pcm_t *pcm)
417 snd_pcm_multi_t *multi = pcm->private_data;
421 if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
424 slave_hw_ptr = *multi->slaves[i].pcm->hw.ptr;
425 avail = __snd_pcm_playback_avail(pcm, multi->hw_ptr, slave_hw_ptr);
434 slave_hw_ptr = *multi->slaves[i].pcm->hw.ptr;
435 avail = __snd_pcm_capture_avail(pcm, multi->hw_ptr, slave_hw_ptr);
445 static int snd_pcm_multi_hwsync(snd_pcm_t *pcm)
447 snd_pcm_multi_t *multi = pcm->private_data;
451 err = snd_pcm_hwsync(multi->slaves[i].pcm);
455 snd_pcm_multi_hwptr_update(pcm);
459 static int snd_pcm_multi_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
461 snd_pcm_multi_t *multi = pcm->private_data;
466 err = snd_pcm_delay(multi->slaves[i].pcm, &d);
476 static snd_pcm_sframes_t snd_pcm_multi_avail_update(snd_pcm_t *pcm)
478 snd_pcm_multi_t *multi = pcm->private_data;
483 avail = snd_pcm_avail_update(multi->slaves[i].pcm);
489 snd_pcm_multi_hwptr_update(pcm);
493 static int snd_pcm_multi_htimestamp(snd_pcm_t *pcm, snd_pcm_uframes_t *avail,
496 snd_pcm_multi_t *multi = pcm->private_data;
497 snd_pcm_t *slave = multi->slaves[multi->master_slave].pcm;
501 static int snd_pcm_multi_prepare(snd_pcm_t *pcm)
503 snd_pcm_multi_t *multi = pcm->private_data;
510 err = snd_pcm_prepare(multi->slaves[i].pcm);
518 static int snd_pcm_multi_reset(snd_pcm_t *pcm)
520 snd_pcm_multi_t *multi = pcm->private_data;
525 err = snd_pcm_reset(multi->slaves[i].pcm);
537 static int snd_pcm_multi_start(snd_pcm_t *pcm)
539 snd_pcm_multi_t *multi = pcm->private_data;
547 err = snd_pcm_start(multi->slaves[i].pcm);
554 static int snd_pcm_multi_drop(snd_pcm_t *pcm)
556 snd_pcm_multi_t *multi = pcm->private_data;
564 err = snd_pcm_drop(multi->slaves[i].pcm);
571 static int snd_pcm_multi_drain(snd_pcm_t *pcm)
573 snd_pcm_multi_t *multi = pcm->private_data;
581 err = snd_pcm_drain(multi->slaves[i].pcm);
588 static int snd_pcm_multi_pause(snd_pcm_t *pcm, int enable)
590 snd_pcm_multi_t *multi = pcm->private_data;
598 err = snd_pcm_pause(multi->slaves[i].pcm, enable);
605 static int snd_pcm_multi_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t *info)
607 snd_pcm_multi_t *multi = pcm->private_data;
614 err = snd_pcm_channel_info(multi->slaves[c->slave_idx].pcm, info);
619 static snd_pcm_sframes_t snd_pcm_multi_rewindable(snd_pcm_t *pcm)
621 snd_pcm_multi_t *multi = pcm->private_data;
626 snd_pcm_sframes_t f = snd_pcm_rewindable(multi->slaves[i].pcm);
637 static snd_pcm_sframes_t snd_pcm_multi_forwardable(snd_pcm_t *pcm)
639 snd_pcm_multi_t *multi = pcm->private_data;
644 snd_pcm_sframes_t f = snd_pcm_forwardable(multi->slaves[i].pcm);
655 static snd_pcm_sframes_t snd_pcm_multi_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
657 snd_pcm_multi_t *multi = pcm->private_data;
662 snd_pcm_t *slave_i = multi->slaves[i].pcm;
671 snd_pcm_t *slave_i = multi->slaves[i].pcm;
682 snd_pcm_mmap_appl_backward(pcm, frames);
686 static snd_pcm_sframes_t snd_pcm_multi_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
688 snd_pcm_multi_t *multi = pcm->private_data;
693 snd_pcm_t *slave_i = multi->slaves[i].pcm;
702 snd_pcm_t *slave_i = multi->slaves[i].pcm;
713 snd_pcm_mmap_appl_forward(pcm, frames);
717 static int snd_pcm_multi_resume(snd_pcm_t *pcm)
719 snd_pcm_multi_t *multi = pcm->private_data;
727 err = snd_pcm_resume(multi->slaves[i].pcm);
737 static int snd_pcm_multi_link_slaves(snd_pcm_t *pcm, snd_pcm_t *master)
739 snd_pcm_multi_t *multi = pcm->private_data;
744 snd_pcm_unlink(multi->slaves[i].pcm);
746 err = snd_pcm_link(master, multi->slaves[i].pcm);
762 snd_pcm_t *main_pcm = multi->slaves[0].pcm;
768 static int snd_pcm_multi_unlink(snd_pcm_t *pcm)
770 snd_pcm_multi_t *multi = pcm->private_data;
781 static snd_pcm_sframes_t snd_pcm_multi_mmap_commit(snd_pcm_t *pcm,
785 snd_pcm_multi_t *multi = pcm->private_data;
791 slave = multi->slaves[i].pcm;
798 snd_pcm_mmap_appl_forward(pcm, size);
802 static int snd_pcm_multi_munmap(snd_pcm_t *pcm)
804 free(pcm->mmap_channels);
805 free(pcm->running_areas);
806 pcm->mmap_channels = NULL;
807 pcm->running_areas = NULL;
811 static int snd_pcm_multi_mmap(snd_pcm_t *pcm)
813 snd_pcm_multi_t *multi = pcm->private_data;
816 pcm->mmap_channels = calloc(pcm->channels,
817 sizeof(pcm->mmap_channels[0]));
818 pcm->running_areas = calloc(pcm->channels,
819 sizeof(pcm->running_areas[0]));
820 if (!pcm->mmap_channels || !pcm->running_areas) {
821 snd_pcm_multi_munmap(pcm);
826 for (c = 0; c < pcm->channels; c++) {
830 snd_pcm_multi_munmap(pcm);
833 slave = multi->slaves[chan->slave_idx].pcm;
834 pcm->mmap_channels[c] =
836 pcm->mmap_channels[c].channel = c;
837 pcm->running_areas[c] =
843 static int snd_pcm_multi_may_wait_for_avail_min(snd_pcm_t *pcm, snd_pcm_uframes_t avail)
845 snd_pcm_multi_t *multi = pcm->private_data;
848 if (snd_pcm_may_wait_for_avail_min(multi->slaves[i].pcm, avail))
854 static snd_pcm_chmap_query_t **snd_pcm_multi_query_chmaps(snd_pcm_t *pcm)
856 snd_pcm_multi_t *multi = pcm->private_data;
873 slave_maps[i] = snd_pcm_query_chmaps(multi->slaves[i].pcm);
908 static snd_pcm_chmap_t *snd_pcm_multi_get_chmap(snd_pcm_t *pcm)
910 snd_pcm_multi_t *multi = pcm->private_data;
922 slave_maps[i] = snd_pcm_get_chmap(multi->slaves[i].pcm);
946 static int snd_pcm_multi_set_chmap(snd_pcm_t *pcm, const snd_pcm_chmap_t *map)
948 snd_pcm_multi_t *multi = pcm->private_data;
974 err = snd_pcm_set_chmap(multi->slaves[i].pcm, slave_maps[i]);
986 static void snd_pcm_multi_dump(snd_pcm_t *pcm, snd_output_t *out)
988 snd_pcm_multi_t *multi = pcm->private_data;
999 if (pcm->setup) {
1001 snd_pcm_dump_setup(pcm, out);
1005 snd_pcm_dump(multi->slaves[k].pcm, out);
1083 snd_pcm_t *pcm;
1118 slave->pcm = slaves_pcm[i];
1133 err = snd_pcm_new(&pcm, SND_PCM_TYPE_MULTI, name, stream,
1134 multi->slaves[0].pcm->mode);
1141 pcm->mmap_rw = 1;
1142 pcm->mmap_shadow = 1; /* has own mmap method */
1143 pcm->ops = &snd_pcm_multi_ops;
1144 pcm->fast_ops = &snd_pcm_multi_fast_ops;
1145 pcm->private_data = multi;
1146 pcm->poll_fd = multi->slaves[master_slave].pcm->poll_fd;
1147 pcm->poll_events = multi->slaves[master_slave].pcm->poll_events;
1148 pcm->tstamp_type = multi->slaves[master_slave].pcm->tstamp_type;
1149 snd_pcm_set_hw_ptr(pcm, &multi->hw_ptr, -1, 0);
1150 snd_pcm_set_appl_ptr(pcm, &multi->appl_ptr, -1, 0);
1151 *pcmp = pcm;
1162 pcm.name {
1168 pcm STR # Slave PCM name
1170 pcm { } # Slave PCM definition
1187 pcm.quad {
1190 slaves.a.pcm "hw:0,0"
1192 slaves.b.pcm "hw:0,1"
1205 Note that the resultant pcm "quad" is not in the interleaved format
1211 pcm.quad2 {
1213 slave.pcm "quad"