基于ALSA实现代码调节音量

笔记

一些设置的选项
Headphone
ADC FM volume
ADC INPUT GAIN control
ADC MIC Boost AMP en
ADC MIC Boost AMP gain control
ADC PA speed select
ADC mixer mute for FML
ADC mixer mute for FMR
ADC mixer mute for left ouput
ADC mixer mute for linein
ADC mixer mute for mic
ADC mixer mute for right ouput
COS slop time control for Anti-pop
External Speaker
LINEIN GAIN control
MICIN GAIN control
SPK_L Mux Left Mixer en
SPK_R Mux Right Mixer en
dac digital volume
dac: left analog output mixer en
dac: left chanle en
dac: left hpout to right hpout
dac: left mixer mute: FM
dac: left mixer mute: left dac
dac: left mixer mute: linein
dac: left mixer mute: mic
dac: left mixer mute: right dac
dac: left mute
dac: right analog output mixer en
dac: right chanel en
dac: right hpout to left hpout
dac: right mixer mute: FM
dac: right mixer mute: left dac
dac: right mixer mute: linein
dac: right mixer mute: mic
dac: right mixer mute: right dac
dac: right mute
head phone power
head phone volume
hp left source select: 0-dac, 1-mixer
hp right source select: 0-dac, 1-mixer

实例-亲测

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <stdarg.h>
#include <ctype.h>
#include <math.h>
#include <errno.h>
#include <assert.h>
#include <alsa/asoundlib.h>
#include <sys/poll.h>
#include <stdint.h>

char * sctrlstr = "head phone volume";

int setCapVal(int val)
{
    
    
    long volMin, volMax, leftVal, rightVal;
	volMin = 0;  
	volMax = 0;
	leftVal = 0; 
	rightVal = 0;
	int err;
	static snd_mixer_t *handle = NULL;
	snd_mixer_elem_t *elem;
	snd_mixer_selem_id_t *sid;
	snd_mixer_selem_id_alloca(&sid);
	
	if ((err = snd_mixer_open(&handle, 0)) < 0) {
    
    
		printf("snd_mixer_open Err\n");
		return err;
	}

	snd_mixer_attach(handle, "default");
	snd_mixer_selem_register(handle, NULL, NULL);
	snd_mixer_load(handle);
  
	elem = snd_mixer_first_elem(handle);
	while(elem)
	{
    
    
		if ( strcmp( sctrlstr, snd_mixer_selem_get_name (elem)) == 0)
		{
    
    
			printf( "elem name : %s\n", snd_mixer_selem_get_name (elem) );
			break;
		}
	    elem = snd_mixer_elem_next(elem);
	}
	if (!elem) {
    
    
		printf("snd_mixer_find_selem Err\n");
		snd_mixer_close(handle);
		handle = NULL;
		return -ENOENT;
	}
	printf( "elem name : %s\n", snd_mixer_selem_get_name (elem) );	
	snd_mixer_selem_get_capture_volume_range(elem, &volMin, &volMax);
	printf("音量范围: %ld -- %ld\n", volMin, volMax);
	
	snd_mixer_handle_events(handle);
	snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, &leftVal);
	snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_RIGHT, &rightVal);
	printf("当前音量: leftVal = %ld, rightVal = %ld\n", leftVal, rightVal);
	
	if( snd_mixer_selem_is_playback_mono( elem) )
	{
    
    
		//单声道
		snd_mixer_selem_set_playback_volume(elem,SND_MIXER_SCHN_FRONT_LEFT, val);
		printf("单声道: %d\n", val);
	}
	else
	{
    
    
		//左音量
		snd_mixer_selem_set_playback_volume(elem,SND_MIXER_SCHN_FRONT_LEFT, 45);
		//右音量
		snd_mixer_selem_set_playback_volume(elem,SND_MIXER_SCHN_FRONT_RIGHT, 67);
		printf("双声道: 45,  67\n");
	}
	关闭混音器设备
	snd_mixer_close(handle);
	handle = NULL;
}
 

猜你喜欢

转载自blog.csdn.net/W_s_j/article/details/108244643