• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/ap/gpl/iserver/alsa-lib-1.0.26/src/pcm/

Lines Matching refs:svol

273 static void softvol_convert_stereo_vol(snd_pcm_softvol_t *svol,
285 if (svol->cur_vol[0] == 0 && svol->cur_vol[1] == 0) {
287 svol->sformat);
289 } else if (svol->zero_dB_val && svol->cur_vol[0] == svol->zero_dB_val &&
290 svol->cur_vol[1] == svol->zero_dB_val) {
292 channels, frames, svol->sformat);
296 if (svol->max_val == 1) {
297 vol[0] = svol->cur_vol[0] ? 0xffff : 0;
298 vol[1] = svol->cur_vol[1] ? 0xffff : 0;
301 vol[0] = svol->dB_value[svol->cur_vol[0]];
302 vol[1] = svol->dB_value[svol->cur_vol[1]];
303 vol_c = svol->dB_value[(svol->cur_vol[0] + svol->cur_vol[1]) / 2];
305 switch (svol->sformat) {
310 !snd_pcm_format_cpu_endian(svol->sformat));
316 !snd_pcm_format_cpu_endian(svol->sformat));
330 static void softvol_convert_mono_vol(snd_pcm_softvol_t *svol,
342 if (svol->cur_vol[0] == 0) {
344 svol->sformat);
346 } else if (svol->zero_dB_val && svol->cur_vol[0] == svol->zero_dB_val) {
348 channels, frames, svol->sformat);
352 if (svol->max_val == 1)
353 vol_scale = svol->cur_vol[0] ? 0xffff : 0;
355 vol_scale = svol->dB_value[svol->cur_vol[0]];
356 switch (svol->sformat) {
361 !snd_pcm_format_cpu_endian(svol->sformat));
367 !snd_pcm_format_cpu_endian(svol->sformat));
382 static void get_current_volume(snd_pcm_softvol_t *svol)
387 if (snd_ctl_elem_read(svol->ctl, &svol->elem) < 0)
389 for (i = 0; i < svol->cchannels; i++) {
390 val = svol->elem.value.integer.value[i];
391 if (val > svol->max_val)
392 val = svol->max_val;
393 svol->cur_vol[i] = val;
397 static void softvol_free(snd_pcm_softvol_t *svol)
399 if (svol->plug.gen.close_slave)
400 snd_pcm_close(svol->plug.gen.slave);
401 if (svol->ctl)
402 snd_ctl_close(svol->ctl);
403 if (svol->dB_value && svol->dB_value != preset_dB_value)
404 free(svol->dB_value);
405 free(svol);
410 snd_pcm_softvol_t *svol = pcm->private_data;
411 softvol_free(svol);
419 snd_pcm_softvol_t *svol = pcm->private_data;
430 if (svol->sformat != SND_PCM_FORMAT_UNKNOWN) {
432 snd_pcm_format_mask_set(&format_mask, svol->sformat);
454 snd_pcm_softvol_t *svol = pcm->private_data;
459 if (svol->sformat != SND_PCM_FORMAT_UNKNOWN) {
460 _snd_pcm_hw_params_set_format(sparams, svol->sformat);
502 snd_pcm_softvol_t *svol = pcm->private_data;
512 if (svol->sformat == SND_PCM_FORMAT_UNKNOWN)
531 snd_pcm_softvol_t *svol = pcm->private_data;
541 if (svol->sformat == SND_PCM_FORMAT_UNKNOWN)
568 snd_pcm_softvol_t *svol = pcm->private_data;
569 snd_pcm_t *slave = svol->plug.gen.slave;
586 svol->sformat = slave->format;
599 snd_pcm_softvol_t *svol = pcm->private_data;
602 get_current_volume(svol);
603 if (svol->cchannels == 1)
604 softvol_convert_mono_vol(svol, slave_areas, slave_offset,
607 softvol_convert_stereo_vol(svol, slave_areas, slave_offset,
622 snd_pcm_softvol_t *svol = pcm->private_data;
625 get_current_volume(svol);
626 if (svol->cchannels == 1)
627 softvol_convert_mono_vol(svol, areas, offset, slave_areas,
630 softvol_convert_stereo_vol(svol, areas, offset, slave_areas,
638 snd_pcm_softvol_t *svol = pcm->private_data;
640 snd_output_printf(out, "Control: %s\n", svol->elem.id.name);
641 if (svol->max_val == 1)
644 snd_output_printf(out, "min_dB: %g\n", svol->min_dB);
645 snd_output_printf(out, "max_dB: %g\n", svol->max_dB);
646 snd_output_printf(out, "resolution: %d\n", svol->max_val + 1);
653 snd_pcm_dump(svol->plug.gen.slave, out);
656 static int add_tlv_info(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo)
661 tlv[2] = svol->min_dB * 100;
662 tlv[3] = (svol->max_dB - svol->min_dB) * 100 / svol->max_val;
663 return snd_ctl_elem_tlv_write(svol->ctl, &cinfo->id, tlv);
666 static int add_user_ctl(snd_pcm_softvol_t *svol, snd_ctl_elem_info_t *cinfo, int count)
672 if (svol->max_val == 1)
673 err = snd_ctl_elem_add_boolean(svol->ctl, &cinfo->id, count);
675 err = snd_ctl_elem_add_integer(svol->ctl, &cinfo->id, count,
676 0, svol->max_val, 0);
679 if (svol->max_val == 1)
682 add_tlv_info(svol, cinfo);
685 def_val = svol->zero_dB_val ? svol->zero_dB_val : svol->max_val;
688 svol->elem.value.integer.value[i] = def_val;
689 return snd_ctl_elem_write(svol->ctl, &svol->elem);
698 static int softvol_load_control(snd_pcm_t *pcm, snd_pcm_softvol_t *svol,
721 err = snd_ctl_open(&svol->ctl, tmp_name, 0);
727 svol->elem.id = *ctl_id;
728 svol->max_val = resolution - 1;
729 svol->min_dB = min_dB;
730 svol->max_dB = max_dB;
731 if (svol->max_val == 1 || svol->max_dB == ZERO_DB)
732 svol->zero_dB_val = svol->max_val;
733 else if (svol->max_dB < 0)
734 svol->zero_dB_val = 0; /* there is no 0 dB setting */
736 svol->zero_dB_val = (min_dB / (min_dB - max_dB)) * svol->max_val;
740 if ((err = snd_ctl_elem_info(svol->ctl, cinfo)) < 0) {
745 err = add_user_ctl(svol, cinfo, cchannels);
760 if ((err = snd_ctl_elem_remove(svol->ctl, &cinfo->id)) < 0) {
765 if ((err = add_user_ctl(svol, cinfo, cchannels)) < 0) {
769 } else if (svol->max_val > 1) {
772 err = snd_ctl_elem_tlv_read(svol->ctl, &cinfo->id, tlv, sizeof(tlv));
774 add_tlv_info(svol, cinfo);
778 if (svol->max_val == 1)
783 svol->dB_value = (unsigned int*)preset_dB_value;
786 svol->dB_value = calloc(resolution, sizeof(unsigned int));
787 if (! svol->dB_value) {
791 svol->min_dB = min_dB;
792 svol->max_dB = max_dB;
793 for (i = 0; i <= svol->max_val; i++) {
794 double db = svol->min_dB + (i * (svol->max_dB - svol->min_dB)) / svol->max_val;
796 svol->dB_value[i] = (unsigned int)v;
798 if (svol->zero_dB_val)
799 svol->dB_value[svol->zero_dB_val] = 65535;
849 snd_pcm_softvol_t *svol;
859 svol = calloc(1, sizeof(*svol));
860 if (! svol)
862 err = softvol_load_control(slave, svol, ctl_card, ctl_id, cchannels,
865 softvol_free(svol);
869 softvol_free(svol);
877 snd_pcm_plugin_init(&svol->plug);
878 svol->sformat = sformat;
879 svol->cchannels = cchannels;
880 svol->plug.read = snd_pcm_softvol_read_areas;
881 svol->plug.write = snd_pcm_softvol_write_areas;
882 svol->plug.undo_read = snd_pcm_plugin_undo_read_generic;
883 svol->plug.undo_write = snd_pcm_plugin_undo_write_generic;
884 svol->plug.gen.slave = slave;
885 svol->plug.gen.close_slave = close_slave;
889 softvol_free(svol);
894 pcm->private_data = svol;
904 snd_pcm_set_hw_ptr(pcm, &svol->plug.hw_ptr, -1, 0);
905 snd_pcm_set_appl_ptr(pcm, &svol->plug.appl_ptr, -1, 0);