void analog_volume_init(void) { snd_ctl_elem_info_t *info; int i; snd_ctl_elem_info_alloca(&info); snd_ctl_elem_info_set_interface(info, SND_CTL_ELEM_IFACE_MIXER); for (i = 0; i < 10; i++) { snd_ctl_elem_info_set_name(info, DAC_VOLUME_NAME); snd_ctl_elem_info_set_numid(info, 0); snd_ctl_elem_info_set_index(info, i); if (snd_ctl_elem_info(ctl, info) < 0) break; dac_max = snd_ctl_elem_info_get_max(info); } if (i < output_channels - 1) dac_volumes = i; else dac_volumes = output_channels; snd_ctl_elem_info_set_name(info, DAC_SENSE_NAME); for (i = 0; i < dac_volumes; i++) { snd_ctl_elem_info_set_numid(info, 0); snd_ctl_elem_info_set_index(info, i); if (snd_ctl_elem_info(ctl, info) < 0) break; } dac_senses = i; if (dac_senses > 0) { snd_ctl_elem_info_set_numid(info, 0); snd_ctl_elem_info_set_index(info, 0); snd_ctl_elem_info(ctl, info); dac_sense_items = snd_ctl_elem_info_get_items(info); for (i = 0; i < dac_sense_items; i++) { snd_ctl_elem_info_set_item(info, i); snd_ctl_elem_info(ctl, info); dac_sense_name[i] = strdup(snd_ctl_elem_info_get_item_name(info)); } } for (i = 0; i < 10; i++) { snd_ctl_elem_info_set_name(info, ADC_VOLUME_NAME); snd_ctl_elem_info_set_numid(info, 0); snd_ctl_elem_info_set_index(info, i); if (snd_ctl_elem_info(ctl, info) < 0) break; adc_max = snd_ctl_elem_info_get_max(info); } if (i < input_channels - 1) adc_volumes = i; else adc_volumes = input_channels; snd_ctl_elem_info_set_name(info, ADC_SENSE_NAME); for (i = 0; i < adc_volumes; i++) { snd_ctl_elem_info_set_numid(info, 0); snd_ctl_elem_info_set_index(info, i); if (snd_ctl_elem_info(ctl, info) < 0) break; } adc_senses = i; if (adc_senses > 0) { snd_ctl_elem_info_set_numid(info, 0); snd_ctl_elem_info_set_index(info, 0); snd_ctl_elem_info(ctl, info); adc_sense_items = snd_ctl_elem_info_get_items(info); for (i = 0; i < adc_sense_items; i++) { snd_ctl_elem_info_set_item(info, i); snd_ctl_elem_info(ctl, info); adc_sense_name[i] = strdup(snd_ctl_elem_info_get_item_name(info)); } } for (i = 0; i < 10; i++) { snd_ctl_elem_info_set_name(info, IPGA_VOLUME_NAME); snd_ctl_elem_info_set_numid(info, 0); snd_ctl_elem_info_set_index(info, i); if (snd_ctl_elem_info(ctl, info) < 0) break; } if (i < input_channels - 1) ipga_volumes = i; else ipga_volumes = input_channels; }
void main( int argc, char *argv[] ) { struct structArgs cmdArgs; int errNum; // ************************************************************************ // ALSA control elements. // ************************************************************************ snd_ctl_t *ctl; // Simple control handle. snd_ctl_elem_id_t *id; // Simple control element id. snd_ctl_elem_value_t *control; // Simple control element value. snd_ctl_elem_type_t type; // Simple control element type. snd_ctl_elem_info_t *info; // Simple control info container. // ************************************************************************ // Get command line parameters. // ************************************************************************ argp_parse( &argp, argc, argv, 0, 0, &cmdArgs ); printf( "Card = %i\n", cmdArgs.card ); printf( "Control = %i\n", cmdArgs.control ); printf( "Value 1 = %i\n", cmdArgs.value1 ); printf( "Value 2 = %i\n", cmdArgs.value2 ); // ************************************************************************ // Set up ALSA control. // ************************************************************************ sprintf( cmdArgs.deviceID, "hw:%i", cmdArgs.card ); printf( "Device ID = %s.\n", cmdArgs.deviceID ); if ( snd_ctl_open( &ctl, cmdArgs.deviceID, 1 ) < 0 ) { printf( "Error opening control.\n" ); return; } // Initialise a simple control element id structure. snd_ctl_elem_id_alloca( &id ); snd_ctl_elem_id_set_numid( id, cmdArgs.control ); // Initialise info element. snd_ctl_elem_info_alloca( &info ); snd_ctl_elem_info_set_numid( info, cmdArgs.control ); // Is the control valid? if ( snd_ctl_elem_info( ctl, info ) < 0 ) { printf( "Error getting control element info.\n" ); return; } // Find type of control. // either: // SND_CTL_ELEM_TYPE_INTEGER, // SND_CTL_ELEM_TYPE_INTEGER64, // SND_CTL_ELEM_TYPE_ENUMERATED, etc. // Only interested in INTEGER. type = snd_ctl_elem_info_get_type( info ); if ( type != SND_CTL_ELEM_TYPE_INTEGER ) { printf( "Control type is not integer.\n" ); printf( "Type = %s\n", type ); return; } // ************************************************************************ // Get some information for selected control. // ************************************************************************ printf( "Min value for control = %d\n", snd_ctl_elem_info_get_min( info )); printf( "Max value for control = %d\n", snd_ctl_elem_info_get_max( info )); printf( "Step value for control = %d\n", snd_ctl_elem_info_get_step( info )); // Initialise the control element value container. snd_ctl_elem_value_alloca( &control ); snd_ctl_elem_value_set_id( control, id ); // ************************************************************************ // Set values for selected control. // ************************************************************************ snd_ctl_elem_value_set_integer( control, 0, cmdArgs.value1 ); if ( snd_ctl_elem_write( ctl, control ) < 0 ) printf( "Error setting L volume" ); else printf( "Set L volume to %d.\n", cmdArgs.value1 ); snd_ctl_elem_value_set_integer( control, 1, cmdArgs.value2 ); if ( snd_ctl_elem_write( ctl, control ) < 0 ) printf( "Error setting R volume" ); else printf( "Set R volume to %d.\n", cmdArgs.value2 ); // ************************************************************************ // Clean up. // ************************************************************************ snd_ctl_close( ctl ); return; }
static int check_elem_set_props(struct elem_set_trial *trial) { snd_ctl_elem_id_t *id; snd_ctl_elem_info_t *info; unsigned int numid; unsigned int index; unsigned int i; unsigned int j; int err; snd_ctl_elem_id_alloca(&id); snd_ctl_elem_info_alloca(&info); snd_ctl_elem_info_set_id(info, trial->id); numid = snd_ctl_elem_id_get_numid(trial->id); index = snd_ctl_elem_id_get_index(trial->id); for (i = 0; i < trial->element_count; ++i) { snd_ctl_elem_info_set_index(info, index + i); /* * In Linux 4.0 or former, ioctl(SNDRV_CTL_IOCTL_ELEM_ADD) * doesn't fill all of fields for identification. */ if (numid > 0) snd_ctl_elem_info_set_numid(info, numid + i); err = snd_ctl_elem_info(trial->handle, info); if (err < 0) return err; /* Check some common properties. */ if (snd_ctl_elem_info_get_type(info) != trial->type) return -EIO; if (snd_ctl_elem_info_get_count(info) != trial->member_count) return -EIO; for (j = 0; j < 4; ++j) { if (snd_ctl_elem_info_get_dimension(info, j) != trial->dimension[j]) return -EIO; } /* * In a case of IPC, this is the others. But in this case, * it's myself. */ if (snd_ctl_elem_info_get_owner(info) != getpid()) return -EIO; /* * Just adding an element set by userspace applications, * included elements are initially locked. */ if (!snd_ctl_elem_info_is_locked(info)) return -EIO; /* Check type-specific properties. */ if (trial->check_elem_props != NULL) { err = trial->check_elem_props(trial, info); if (err < 0) return err; } snd_ctl_elem_info_get_id(info, id); err = snd_ctl_elem_unlock(trial->handle, id); if (err < 0) return err; } return 0; }