Lines Matching defs:svol
316 static void softvol_convert_stereo_vol(snd_pcm_softvol_t *svol,
328 if (svol->cur_vol[0] == 0 && svol->cur_vol[1] == 0) {
330 svol->sformat);
332 } else if (svol->zero_dB_val && svol->cur_vol[0] == svol->zero_dB_val &&
333 svol->cur_vol[1] == svol->zero_dB_val) {
335 channels, frames, svol->sformat);
339 if (svol->max_val == 1) {
340 vol[0] = svol->cur_vol[0] ? 0xffff : 0;
341 vol[1] = svol->cur_vol[1] ? 0xffff : 0;
344 vol[0] = svol->dB_value[svol->cur_vol[0]];
345 vol[1] = svol->dB_value[svol->cur_vol[1]];
346 vol_c = svol->dB_value[(svol->cur_vol[0] + svol->cur_vol[1]) / 2];
348 switch (svol->sformat) {
353 !snd_pcm_format_cpu_endian(svol->sformat));
359 !snd_pcm_format_cpu_endian(svol->sformat));
377 static void softvol_convert_mono_vol(snd_pcm_softvol_t *svol,
389 if (svol->cur_vol[0] == 0) {
391 svol->sformat);
393 } else if (svol->zero_dB_val && svol->cur_vol[0] == svol->zero_dB_val) {
395 channels, frames, svol->sformat);
399 if (svol->max_val == 1)
400 vol_scale = svol->cur_vol[0] ? 0xffff : 0;
402 vol_scale = svol->dB_value[svol->cur_vol[0]];
403 switch (svol->sformat) {
408 !snd_pcm_format_cpu_endian(svol->sformat));
414 !snd_pcm_format_cpu_endian(svol->sformat));
433 static void get_current_volume(snd_pcm_softvol_t *svol)
438 if (snd_ctl_elem_read(svol->ctl, &svol->elem) < 0)
440 for (i = 0; i < svol->cchannels; i++) {
441 val = svol->elem.value.integer.value[i];
442 if (val > svol->max_val)
443 val = svol->max_val;
444 svol->cur_vol[i] = val;
448 static void softvol_free(snd_pcm_softvol_t *svol)
450 if (svol->plug.gen.close_slave)
451 snd_pcm_close(svol->plug.gen.slave);
452 if (svol->ctl)
453 snd_ctl_close(svol->ctl);
454 if (svol->dB_value && svol->dB_value != preset_dB_value)
455 free(svol->dB_value);
456 free(svol);
461 snd_pcm_softvol_t *svol = pcm->private_data;
462 softvol_free(svol);
470 snd_pcm_softvol_t *svol = pcm->private_data;
482 if (svol->sformat != SND_PCM_FORMAT_UNKNOWN) {
484 snd_pcm_format_mask_set(&format_mask, svol->sformat);
506 snd_pcm_softvol_t *svol = pcm->private_data;
511 if (svol->sformat != SND_PCM_FORMAT_UNKNOWN) {
512 _snd_pcm_hw_params_set_format(sparams, svol->sformat);
554 snd_pcm_softvol_t *svol = pcm->private_data;
564 if (svol->sformat == SND_PCM_FORMAT_UNKNOWN)
583 snd_pcm_softvol_t *svol = pcm->private_data;
593 if (svol->sformat == SND_PCM_FORMAT_UNKNOWN)
620 snd_pcm_softvol_t *svol = pcm->private_data;
621 snd_pcm_t *slave = svol->plug.gen.slave;
639 svol->sformat = slave->format;
652 snd_pcm_softvol_t *svol = pcm->private_data;
655 get_current_volume(svol);
656 if (svol->cchannels == 1)
657 softvol_convert_mono_vol(svol, slave_areas, slave_offset,
660 softvol_convert_stereo_vol(svol, slave_areas, slave_offset,
675 snd_pcm_softvol_t *svol = pcm->private_data;
678 get_current_volume(svol);
679 if (svol->cchannels == 1)
680 softvol_convert_mono_vol(svol, areas, offset, slave_areas,
683 softvol_convert_stereo_vol(svol, areas, offset, slave_areas,
691 snd_pcm_softvol_t *svol = pcm->private_data;
693 snd_output_printf(out, "Control: %s\n", svol->elem.id.name);
694 if (svol->max_val == 1)
697 snd_output_printf(out, "min_dB: %g\n", svol->min_dB);
698 snd_output_printf(out, "max_dB: %g\n", svol->max_dB);
699 snd_output_printf(out, "resolution: %d\n", svol->max_val + 1);
706 snd_pcm_dump(svol->plug.gen.slave, out);
709 static int add_tlv_info(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo,
715 tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN] = (int)(svol->min_dB * 100);
717 (int)((svol->max_dB - svol->min_dB) * 100 / svol->max_val);
720 return snd_ctl_elem_tlv_write(svol->ctl, &cinfo->id, tlv);
723 static int add_user_ctl(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo,
730 if (svol->max_val == 1) {
732 err = snd_ctl_add_boolean_elem_set(svol->ctl, cinfo, 1, count);
734 err = snd_ctl_add_integer_elem_set(svol->ctl, cinfo, 1, count,
735 0, svol->max_val, 0);
739 if (svol->max_val == 1)
742 add_tlv_info(svol, cinfo, NULL, 0);
745 def_val = svol->zero_dB_val ? svol->zero_dB_val : svol->max_val;
748 svol->elem.value.integer.value[i] = def_val;
749 return snd_ctl_elem_write(svol->ctl, &svol->elem);
758 static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
780 err = snd_ctl_open(&svol->ctl, tmp_name, 0);
786 svol->elem.id = *ctl_id;
787 svol->max_val = resolution - 1;
788 svol->min_dB = min_dB;
789 svol->max_dB = max_dB;
790 if (svol->max_val == 1 || svol->max_dB == ZERO_DB)
791 svol->zero_dB_val = svol->max_val;
792 else if (svol->max_dB < 0)
793 svol->zero_dB_val = 0; /* there is no 0 dB setting */
795 svol->zero_dB_val = (min_dB / (min_dB - max_dB)) *
796 svol->max_val;
799 if ((err = snd_ctl_elem_info(svol->ctl, &cinfo)) < 0) {
804 err = add_user_ctl(svol, &cinfo, cchannels);
818 cinfo.value.integer.max != svol->max_val ||
819 (svol->max_val > 1 &&
821 (svol->max_val < 2 &&
823 err = snd_ctl_elem_remove(svol->ctl, &cinfo.id);
831 if ((err = add_user_ctl(svol, &cinfo, cchannels)) < 0) {
835 } else if (svol->max_val > 1) {
838 err = snd_ctl_elem_tlv_read(svol->ctl, &cinfo.id, tlv,
840 add_tlv_info(svol, &cinfo, tlv, err < 0 ? 0 : sizeof(tlv));
844 if (svol->max_val == 1)
850 svol->dB_value = (unsigned int*)preset_dB_value;
853 svol->dB_value = calloc(resolution, sizeof(unsigned int));
854 if (! svol->dB_value) {
858 svol->min_dB = min_dB;
859 svol->max_dB = max_dB;
860 for (i = 0; i <= svol->max_val; i++) {
861 double db = svol->min_dB +
862 (i * (svol->max_dB - svol->min_dB)) /
863 svol->max_val;
866 svol->dB_value[i] = (unsigned int)v;
868 if (svol->zero_dB_val)
869 svol->dB_value[svol->zero_dB_val] = 65535;
922 snd_pcm_softvol_t *svol;
933 svol = calloc(1, sizeof(*svol));
934 if (! svol)
936 err = softvol_load_control(slave, svol, ctl_card, ctl_id, cchannels,
939 softvol_free(svol);
943 softvol_free(svol);
951 snd_pcm_plugin_init(&svol->plug);
952 svol->sformat = sformat;
953 svol->cchannels = cchannels;
954 svol->plug.read = snd_pcm_softvol_read_areas;
955 svol->plug.write = snd_pcm_softvol_write_areas;
956 svol->plug.undo_read = snd_pcm_plugin_undo_read_generic;
957 svol->plug.undo_write = snd_pcm_plugin_undo_write_generic;
958 svol->plug.gen.slave = slave;
959 svol->plug.gen.close_slave = close_slave;
963 softvol_free(svol);
968 pcm->private_data = svol;
978 snd_pcm_set_hw_ptr(pcm, &svol->plug.hw_ptr, -1, 0);
979 snd_pcm_set_appl_ptr(pcm, &svol->plug.appl_ptr, -1, 0);