资讯详情

Linux_ALSA

小狼@http://blog.csdn.net/xiaolangyangyang


SOC_SINGLE_VALUESOC_SINGLE_VALUE_EXTSOC_SINGLESOC_SINGLE_TLVSOC_DOUBLESOC_DOUBLE_RSOC_DOUBLE_TLVSOC_DOUBLE_R_TLVSOC_DOUBLE_S8_TLVSOC_ENUM_DOUBLESOC_ENUM_SINGLESOC_ENUM_SINGLE_EXTSOC_VALUE_ENUM_DOUBLESOC_VALUE_ENUM_SINGLESOC_ENUMSOC_VALUE_ENUMSOC_SINGLE_EXTSOC_DOUBLE_EXTSOC_SINGLE_EXT_TLVSOC_DOUBLE_EXT_TLVSOC_DOUBLE_R_EXT_TLVSOC_SINGLE_BOOL_EXTSOC_ENUM_EXTSOC_DOUBLE_R_SX_TLVSOC_ENUM_DOUBLE_DECLSOC_ENUM_SINGLE_DECLSOC_ENUM_SINGLE_EXT_DECLSOC_VALUE_ENUM_DOUBLE_DECLSOC_VALUE_ENUM_SINGLE_DECL

SND_SOC_DAPM_VMIDSND_SOC_DAPM_INPUTSND_SOC_DAPM_OUTPUTSND_SOC_DAPM_MICSND_SOC_DAPM_HPSND_SOC_DAPM_SPKSND_SOC_DAPM_LINESND_SOC_DAPM_PGASND_SOC_DAPM_OUT_DRVSND_SOC_DAPM_MIXERSND_SOC_DAPM_MIXER_NAMED_CTLSND_SOC_DAPM_MICBIASSND_SOC_DAPM_SWITCHSND_SOC_DAPM_MUXSND_SOC_DAPM_VIRT_MUXSND_SOC_DAPM_VALUE_MUXSOC_PGA_ARRAYSOC_MIXER_ARRAYSOC_MIXER_NAMED_CTL_ARRAYSND_SOC_DAPM_PGA_ESND_SOC_DAPM_OUT_DRV_ESND_SOC_DAPM_MIXER_ESND_SOC_DAPM_MIXER_NAMED_CTL_ESND_SOC_DAPM_MICBIAS_ESND_SOC_DAPM_SWITCH_ESND_SOC_DAPM_MUX_ESND_SOC_DAPM_VIRT_MUX_ESND_SOC_DAPM_PGA_SSND_SOC_DAPM_SUPPLY_SSOC_PGA_E_ARRAYSOC_MIXER_E_ARRAYSOC_MIXER_NAMED_CTL_E_ARRAYSND_SOC_DAPM_PRESND_SOC_DAPM_POSTSND_SOC_DAPM_AIF_INSND_SOC_DAPM_AIF_IN_ESND_SOC_DAPM_AIF_OUTSND_SOC_DAPM_AIF_OUT_ESND_SOC_DAPM_DACSND_SOC_DAPM_DAC_ESND_SOC_DAPM_ADCSND_SOC_DAPM_ADC_ESND_SOC_DAPM_REGSND_SOC_DAPM_SUPPLYSOC_DAPM_SINGLESOC_DAPM_SINGLE_TLVSOC_DAPM_ENUMSOC_DAPM_ENUM_VIRTSOC_DAPM_VALUE_ENUMSOC_DAPM_PIN_SWITCH

static const struct snd_kcontrol_new wmxx_mix1_controls[] = {	SOC_DAPM_SINGLE("SW1",WMXX_REG_SW,1,1,0),	SOC_DAPM_SINGLE("SW2",WMXX_REG_SW,2,0,0),	SOC_DAPM_SINGLE("SW3",WMXX_REG_SW,3,0,0),	SOC_DAPM_SINGLE("SW4",WMXX_REG_SW,4,0,0)};	static const struct snd_kcontrol_new wmxx_mix2_controls[] = {	SOC_DAPM_SINGLE("SW5",WMXX_REG_SW,5,1,0),	SOC_DAPM_SINGLE("SW6",WMXX_REG_SW,6,0,0),	SOC_DAPM_SINGLE("SW7",WMXX_REG_SW,};};

#include <alsa/asoundlib.h>#include <stdio.h>#include <termios.h> #include <unistd.h>#include <stdlib.h>#define int8_t		char#define int16_t		short#define int32_t		int#define int64_t		long#define uint8_t		unsigned char#define uint16_t	unsigned short#define uint32_t	unsigned int#define uint64_t	unsigned long/* para of wav file */typedef struct {	uint32_t dwSize;	uint16_t wFormatTag;	uint16_t wChannels;	uint32_t dwSamplesPerSec;	uint32_t dwAvgBytesPerSec;	uint16_t wBlockAlign;	uint16_t wBitsPerSample;} WAVEFORMAT;/* format of wav file header */typedef struct {	uint8_t RiffID [4];	uint32_t RiffSize;	uint8_t WaveID[4];	uint8_t FmtID[4];	uint32_t FmtSize;	uint16_t wFormatTag;	uint16_t nChannels;	uint32_t nSamplesPerSec;	uint32_t nAvgBytesPerSec;	uint16_t nBlockAlign;	uint16_t wBitsPerSample;	uint8_t DataID[4];	uint32_t nDataBytes;} WAVE_HEADER;/* set hwparams */static int32_t set_hwparams(snd_pcm_t *handle,snd_pcm_hw_params_t *params,snd_pcm_access_t access,uint32_t ch,snd_pcm_format_t format,uint32_t rate,snd_pcm_sframes_t *period_size){	snd_pcm_uframes_t size;	uint32_t rrate;	int32_t err,dir;	uint32_t buffer_time = 500000;	/* ring buffer length in us */	uint32_t period_time = 100000;	/* period time in us */	int32_t resample = 1;	/* enable alsa-lib resampling */	/* choose all parameters */	err = snd_pcm_hw_params_any(handle,params);	if (err < 0)	{		printf("Broken configuration for playback: no configurations available: %s\n",snd_strerror(err));		return err;	}	/* set hardware resampling */	err = snd_pcm_hw_params_set_rate_resample(handle,params,resample);	if (err < 0)	{		printf("Resampling setup failed for playback: %s\n",snd_strerror(err));		return err;	}	/* set the interleaved read/write format */	err = snd_pcm_hw_params_set_access(handle, params, access);	if (err < 0)	{		printf("Access type not available for playback: %s\n", snd_strerror(err));		return err;	}	/* set the sample format */	err = snd_pcm_hw_params_set_format(handle, params, format);	if (err < 0)	{		printf("Sample format not available for playback: %s\n", snd_strerror(err));		return err;	}	/* set the count of channels */	err = snd_pcm_hw_params_set_channels(handle, params, ch);	if (err < 0)	{		printf("Channels count (%u) not available for playbacks: %s\n", ch, snd_strerror(err));		return err;	}	/* set the stream rate */	rrate = rate;	err = snd_pcm_hw_params_set_rate_near(handle, params, &rrate, 0);	if (err < 0)	{		printf("Rate %uHz not available for playback: %s\n", rate, snd_strerror(err));		return err;	}	if (rrate != rate)	{		printf("Rate doesn't match (requested %uHz, get %iHz)\n", rate, err);		return -EINVAL;	}	/* set the buffer time */	err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, &dir);	if (err < 0)	{		printf("Unable to set buffer time %u for playback: %s\n", buffer_time, snd_strerror(err));		return err;	}	err = snd_pcm_hw_params_get_buffer_size(params, &size);	if (err < 0)	{		printf("Unable to get buffer size for playback: %s\n", snd_strerror(err));		return err;	}	printf("buffer_size = %ld\n", size);	/* set the period time */ 	err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, &dir);	if (err < 0)	{		printf("Unable to set period time %u for playback: %s\n", period_time, snd_strerror(err));		return err;	}	err = snd_pcm_hw_params_get_period_size(params, &size, &dir);	if (err < 0)	{		printf("Unable to get period size for playback: %s\n", snd_strerror(err));		return err;	}	*period_size = size;	printf("period_size = %ld\n", size);	/* write the parameters to device */	err = snd_pcm_hw_params(handle, params);	if (err < 0)	{		printf("Unable to set hw params for playback: %s\n", snd_strerror(err));		return err;	}	return 0;}/* read wav file header*/FILE * open_and_print_file_params(int8_t *file_name, WAVE_HEADER *g_wave_header){	FILE * fp = fopen(file_name, "r");	if (fp == NULL)	{		printf("can't open wav file\n");		return NULL;	}	memset(g_wave_header, 0, sizeof(WAVE_HEADER));	fread(g_wave_header, 1, sizeof(WAVE_HEADER), fp);	printf(">> RiffID : %c%c%c%c\n", g_wave_header->RiffID[0], g_wave_header->RiffID[1], g_wave_header->RiffID[2], g_wave_header->RiffID[3]);	printf(">> RiffSize : %d\n", g_wave_header->RiffSize);	printf(">> WaveID : %c%c%c%c\n", g_wave_header->WaveID[0], g_wave_header->WaveID[1], g_wave_header->WaveID[2], g_wave_header->WaveID[3]);	printf(">> FmtID : %c%c%c%c\n", g_wave_header->FmtID[0], g_wave_header->FmtID[1], g_wave_header->FmtID[2], g_wave_header->FmtID[3]);	printf(">> FmtSize : %d\n", g_wave_header->FmtSize);	printf(">> wFormatTag : %d\n", g_wave_header->wFormatTag);	printf(">> nChannels : %d\n", g_wave_header->nChannels);	printf(">> nSamplesPerSec : %d\n", g_wave_header->nSamplesPerSec);	printf(">> nAvgBytesPerSec : %d\n", g_wave_header->nAvgBytesPerSec);	printf(">> nBlockAlign : %d\n", g_wave_header->nBlockAlign);	printf(">> wBitsPerSample : %d\n", g_wave_header->wBitsPerSample);	printf(">> DataID : %c%c%c%c\n", g_wave_header->DataID[0], g_wave_header->DataID[1], g_wave_header->DataID[2], g_wave_header->DataID[3]);	printf(">> nDataBytes : %d\n", g_wave_header->nDataBytes);	return fp;}char * sctrlstr = "Digital Playback Volume";int32_t main(){	int8_t *infile = "Back_to_Earth.wav";	int8_t *device = "hw:0,0";	snd_pcm_t *handle;	snd_pcm_hw_params_t *hwparams;	WAVE_HEADER g_wave_header;	snd_pcm_format_t format;	uint32_t ch;	uint32_t rate;	snd_pcm_sframes_t period_size;	int16_t *samples;	int32_t music_sec;	int32_t err;	int32_t size;	int32_t rc;	FILE *fp = open_and_print_file_params(infile, &g_wave_header);	if (fp == NULL)	{		printf("open_and_print_file_params error\n");		return -1;	}	/* set sample rate */	rate = g_wave_header.nSamplesPerSec;	/* set sample bit */	if (8 == g_wave_header.FmtSize)	{		format = SND_PCM_FORMAT_U8;	}	else if (16 == g_wave_header.FmtSize)	{		format = SND_PCM_FORMAT_S16_LE;	}	else if (24 == g_wave_header.FmtSize)	{		format = SND_PCM_FORMAT_U24_LE;	}	else if (32 == g_wave_header.FmtSize)	{		format = SND_PCM_FORMAT_U32_LE;	}	else	{		printf("SND_PCM_FORMAT_UNKNOWN.\n");		format = SND_PCM_FORMAT_UNKNOWN;		return -1; 	}	/* set channel */	ch = g_wave_header.nChannels;	/* music time */	music_sec = g_wave_header.nDataBytes / g_wave_header.nAvgBytesPerSec;	printf("music_time : %d : %d\n", (int32_t)music_sec / 60, music_sec % 60);	printf("Playback device is %s\n", device);	printf("Stream parameters are %uHz, %s, %u channels\n", rate, snd_pcm_format_name(format), ch);	err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0);	if (err < 0) 	{		printf("Playback open error: %s\n", snd_strerror(err));		return 0;	}	snd_pcm_hw_params_alloca(&hwparams);	err = set_hwparams(handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED, ch, format, rate, &period_size);	if (err < 0) {		printf("Setting of hwparams failed: %s\n", snd_strerror(err));		return 0;	}	size = (period_size * ch * snd_pcm_format_physical_width(format)) / 8;	samples = (int16_t *)malloc(size);	while (1) 	{		rc = fread(samples, sizeof(int16_t), size, fp);		if (rc == 0)		{			printf("end of file on input\n");			break;		} 		else if (rc != size)		{			printf("short read: read %d bytes\n", rc);		}		rc = snd_pcm_writei(handle, samples, size);		if (rc == -EPIPE)		{			printf("underrun occurred\n");			err = snd_pcm_prepare(handle);			if( err < 0)			{				printf("can not recover from underrun: %s\n", snd_strerror(err));			}		} 		else if (rc < 0)		{			printf("error from writei: %s\n", snd_strerror(rc));		}  		else if (rc != (int32_t)size)		{			printf("short write, write %d frames\n", rc);		}	}	if (samples != NULL)	{		free(samples);	}	snd_pcm_close(handle);	return 0;}

 # arm-fsl-linux-gnueabi-gcc player.c -o player -lasound -lm -I /var/alsa/include/ -L /var/alsa/lib/


Linux/Android alsa codec音频路由dapm的配置详解

DAPM之二:audio paths与dapm kcontrol

ALSA声卡16_编写ALSA声卡应用程序_学习笔记

8.声卡驱动06-自己实现alsa驱动-虚拟声卡-widget

ALSA驱动asoc框架之machine(一)

ALSA驱动asoc框架之machine(二)

ALSA驱动asoc框架之Platform

ALSA驱动asoc框架之Codec

Linux ALSA 音频系统:物理链路篇

Linux ALSA 音频系统:逻辑设备篇

标签: uhz液位变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司