Lines Matching defs:apcm

128 atc_pcm_release_resources(struct ct_atc *atc, struct ct_atc_pcm *apcm);
135 static int ct_map_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
140 if (!apcm->substream)
143 runtime = apcm->substream->runtime;
146 apcm->vm_block = vm->map(vm, apcm->substream, runtime->dma_bytes);
148 if (!apcm->vm_block)
154 static void ct_unmap_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
158 if (!apcm->vm_block)
163 vm->unmap(vm, apcm->vm_block);
165 apcm->vm_block = NULL;
242 static int atc_pcm_playback_prepare(struct ct_atc *atc, struct ct_atc_pcm *apcm)
251 int n_amixer = apcm->substream->runtime->channels, i = 0;
252 int device = apcm->substream->pcm->device;
256 atc_pcm_release_resources(atc, apcm);
259 desc.multi = apcm->substream->runtime->channels;
262 err = src_mgr->get_src(src_mgr, &desc, (struct src **)&apcm->src);
266 pitch = atc_get_pitch(apcm->substream->runtime->rate,
268 src = apcm->src;
271 src->ops->set_sf(src, convert_format(apcm->substream->runtime->format,
277 apcm->amixers = kcalloc(n_amixer, sizeof(void *), GFP_KERNEL);
278 if (!apcm->amixers) {
283 for (i = 0, apcm->n_amixer = 0; i < n_amixer; i++) {
285 (struct amixer **)&apcm->amixers[i]);
289 apcm->n_amixer++;
293 err = ct_map_audio_buffer(atc, apcm);
298 src = apcm->src;
300 amixer = apcm->amixers[i];
307 src = apcm->src;
310 ct_timer_prepare(apcm->timer);
315 atc_pcm_release_resources(atc, apcm);
320 atc_pcm_release_resources(struct ct_atc *atc, struct ct_atc_pcm *apcm)
329 if (apcm->srcimps) {
330 for (i = 0; i < apcm->n_srcimp; i++) {
331 srcimp = apcm->srcimps[i];
334 apcm->srcimps[i] = NULL;
336 kfree(apcm->srcimps);
337 apcm->srcimps = NULL;
340 if (apcm->srccs) {
341 for (i = 0; i < apcm->n_srcc; i++) {
342 src_mgr->put_src(src_mgr, apcm->srccs[i]);
343 apcm->srccs[i] = NULL;
345 kfree(apcm->srccs);
346 apcm->srccs = NULL;
349 if (apcm->amixers) {
350 for (i = 0; i < apcm->n_amixer; i++) {
351 amixer_mgr->put_amixer(amixer_mgr, apcm->amixers[i]);
352 apcm->amixers[i] = NULL;
354 kfree(apcm->amixers);
355 apcm->amixers = NULL;
358 if (apcm->mono) {
359 sum_mgr->put_sum(sum_mgr, apcm->mono);
360 apcm->mono = NULL;
363 if (apcm->src) {
364 src_mgr->put_src(src_mgr, apcm->src);
365 apcm->src = NULL;
368 if (apcm->vm_block) {
370 ct_unmap_audio_buffer(atc, apcm);
371 apcm->vm_block = NULL;
377 static int atc_pcm_playback_start(struct ct_atc *atc, struct ct_atc_pcm *apcm)
380 struct src *src = apcm->src;
382 if (apcm->started)
384 apcm->started = 1;
389 src->ops->set_sa(src, apcm->vm_block->addr);
390 src->ops->set_la(src, apcm->vm_block->addr + apcm->vm_block->size);
391 src->ops->set_ca(src, apcm->vm_block->addr + max_cisz);
398 ct_timer_start(apcm->timer);
402 static int atc_pcm_stop(struct ct_atc *atc, struct ct_atc_pcm *apcm)
407 ct_timer_stop(apcm->timer);
409 src = apcm->src;
414 if (apcm->srccs) {
415 for (i = 0; i < apcm->n_srcc; i++) {
416 src = apcm->srccs[i];
423 apcm->started = 0;
429 atc_pcm_playback_position(struct ct_atc *atc, struct ct_atc_pcm *apcm)
431 struct src *src = apcm->src;
439 if (position < apcm->vm_block->addr) {
442 position, apcm->vm_block->addr, apcm->vm_block->size);
443 position = apcm->vm_block->addr;
446 size = apcm->vm_block->size;
450 return (position + size - max_cisz - apcm->vm_block->addr) % size;
461 static void setup_src_node_conf(struct ct_atc *atc, struct ct_atc_pcm *apcm,
468 apcm->substream->runtime->rate);
472 *n_srcc = apcm->substream->runtime->channels;
485 apcm->substream->runtime->rate);
488 *n_srcc = apcm->substream->runtime->channels * 2;
496 *n_srcc = apcm->substream->runtime->channels;
502 atc_pcm_capture_get_resources(struct ct_atc *atc, struct ct_atc_pcm *apcm)
520 atc_pcm_release_resources(atc, apcm);
525 multi = apcm->substream->runtime->channels;
529 apcm->substream->runtime->rate);
531 setup_src_node_conf(atc, apcm, src_node_conf, &n_srcc);
545 apcm->srccs = kcalloc(n_srcc, sizeof(void *), GFP_KERNEL);
546 if (!apcm->srccs)
550 apcm->amixers = kcalloc(n_amixer, sizeof(void *), GFP_KERNEL);
551 if (!apcm->amixers) {
556 apcm->srcimps = kcalloc(n_srcimp, sizeof(void *), GFP_KERNEL);
557 if (!apcm->srcimps) {
565 for (i = 0, apcm->n_srcc = 0; i < n_srcc; i++) {
568 (struct src **)&apcm->srccs[i]);
572 src = apcm->srccs[i];
578 apcm->n_srcc++;
582 for (i = 0, apcm->n_amixer = 0; i < n_amixer; i++) {
591 (struct amixer **)&apcm->amixers[i]);
595 apcm->n_amixer++;
600 err = sum_mgr->get_sum(sum_mgr, &sum_dsc, (struct sum **)&apcm->mono);
605 apcm->substream->runtime->rate);
607 for (i = 0, apcm->n_srcimp = 0; i < n_srcimp; i++) {
619 apcm->srcimps[i] = srcimp;
620 apcm->n_srcimp++;
624 src_dsc.multi = apcm->substream->runtime->channels;
627 err = src_mgr->get_src(src_mgr, &src_dsc, (struct src **)&apcm->src);
631 src = apcm->src;
635 err = ct_map_audio_buffer(atc, apcm);
642 atc_pcm_release_resources(atc, apcm);
646 static int atc_pcm_capture_prepare(struct ct_atc *atc, struct ct_atc_pcm *apcm)
658 atc_pcm_release_resources(atc, apcm);
661 err = atc_pcm_capture_get_resources(atc, apcm);
669 multi = apcm->substream->runtime->channels;
671 mono = apcm->mono;
673 amixer = apcm->amixers[i];
682 for (i = 0; i < apcm->n_srcc; i++) {
683 src = apcm->srccs[i];
684 srcimp = apcm->srcimps[imp_base+i];
685 amixer = apcm->amixers[mix_base+i];
692 apcm->substream->runtime->rate);
700 amixer = apcm->amixers[apcm->n_srcc+j*multi+i];
707 srcimp = apcm->srcimps[apcm->n_srcc+j*multi+i];
708 srcimp->ops->map(srcimp, apcm->src,
714 srcimp = apcm->srcimps[apcm->n_srcc+i];
715 srcimp->ops->map(srcimp, apcm->src, out_ports[i]);
719 ct_timer_prepare(apcm->timer);
724 static int atc_pcm_capture_start(struct ct_atc *atc, struct ct_atc_pcm *apcm)
730 if (apcm->started)
733 apcm->started = 1;
734 multi = apcm->substream->runtime->channels;
736 for (i = 0; i < apcm->n_srcc; i++) {
737 src = apcm->srccs[i];
743 src = apcm->src;
744 src->ops->set_sf(src, convert_format(apcm->substream->runtime->format,
746 src->ops->set_sa(src, apcm->vm_block->addr);
747 src->ops->set_la(src, apcm->vm_block->addr + apcm->vm_block->size);
748 src->ops->set_ca(src, apcm->vm_block->addr);
755 for (i = 0; i < apcm->n_srcc; i++) {
756 src = apcm->srccs[i];
761 src = apcm->src;
770 ct_timer_start(apcm->timer);
775 atc_pcm_capture_position(struct ct_atc *atc, struct ct_atc_pcm *apcm)
777 struct src *src = apcm->src;
781 return src->ops->get_ca(src) - apcm->vm_block->addr;
785 struct ct_atc_pcm *apcm)
793 int n_amixer = apcm->substream->runtime->channels, i;
797 atc_pcm_release_resources(atc, apcm);
800 desc.multi = apcm->substream->runtime->channels;
802 while (apcm->substream->runtime->rate > (rsr * desc.msr))
806 err = src_mgr->get_src(src_mgr, &desc, (struct src **)&apcm->src);
810 pitch = atc_get_pitch(apcm->substream->runtime->rate, (rsr * desc.msr));
811 src = apcm->src;
814 src->ops->set_sf(src, convert_format(apcm->substream->runtime->format,
821 apcm->amixers = kcalloc(n_amixer, sizeof(void *), GFP_KERNEL);
822 if (!apcm->amixers) {
827 for (i = 0, apcm->n_amixer = 0; i < n_amixer; i++) {
829 (struct amixer **)&apcm->amixers[i]);
833 apcm->n_amixer++;
837 err = ct_map_audio_buffer(atc, apcm);
844 atc_pcm_release_resources(atc, apcm);
858 spdif_passthru_playback_setup(struct ct_atc *atc, struct ct_atc_pcm *apcm)
861 unsigned int rate = apcm->substream->runtime->rate;
896 spdif_passthru_playback_prepare(struct ct_atc *atc, struct ct_atc_pcm *apcm)
904 atc_pcm_release_resources(atc, apcm);
908 err = spdif_passthru_playback_setup(atc, apcm);
913 err = spdif_passthru_playback_get_resources(atc, apcm);
918 src = apcm->src;
919 for (i = 0; i < apcm->n_amixer; i++) {
920 amixer = apcm->amixers[i];
924 src = apcm->src;
929 amixer = apcm->amixers[0];
931 amixer = apcm->amixers[1];
935 ct_timer_prepare(apcm->timer);