mirror of
				https://github.com/alsa-project/alsa-lib.git
				synced 2025-10-29 05:40:25 -04:00 
			
		
		
		
	Added 24 bit sample support
This commit is contained in:
		
							parent
							
								
									51dacc8e0e
								
							
						
					
					
						commit
						5b0c6ba74a
					
				
					 1 changed files with 130 additions and 7 deletions
				
			
		|  | @ -65,6 +65,11 @@ CONV_FUNC(8_16_end, char, short, (unsigned short)src) | |||
| CONV_FUNC(8_16_sign, char, short, (unsigned short)(src ^ 0x80) << 8) | ||||
| CONV_FUNC(8_16_sign_end, char, short, (unsigned short)src ^ 0x80) | ||||
| 
 | ||||
| CONV_FUNC(8_24, char, long, (unsigned long)src << 16) | ||||
| CONV_FUNC(8_24_end, char, long, (unsigned long)src << 8) | ||||
| CONV_FUNC(8_24_sign, char, long, (unsigned long)(src ^ 0x80) << 16) | ||||
| CONV_FUNC(8_24_sign_end, char, long, (unsigned long)(src ^ 0x80) << 8) | ||||
| 
 | ||||
| CONV_FUNC(8_32, char, long, (unsigned long)src << 24) | ||||
| CONV_FUNC(8_32_end, char, long, (unsigned long)src) | ||||
| CONV_FUNC(8_32_sign, char, long, (unsigned long)(src ^ 0x80) << 24) | ||||
|  | @ -73,7 +78,7 @@ CONV_FUNC(8_32_sign_end, char, long, (unsigned long)src ^ 0x80) | |||
| CONV_FUNC(16_8, short, char, src >> 8) | ||||
| CONV_FUNC(16_end_8, short, char, src) | ||||
| CONV_FUNC(16_8_sign, short, char, (src >> 8) ^ 0x80) | ||||
| CONV_FUNC(16_end_8_sign, short, char, src ^ 0x80;) | ||||
| CONV_FUNC(16_end_8_sign, short, char, src ^ 0x80) | ||||
| 
 | ||||
| CONV_FUNC(16_sign, short, short, src ^ 0x8000) | ||||
| CONV_FUNC(16_end, short, short, bswap_16(src)) | ||||
|  | @ -81,6 +86,15 @@ CONV_FUNC(16_end_sign, short, short, bswap_16(src) ^ 0x8000) | |||
| CONV_FUNC(16_sign_end, short, short, bswap_16(src ^ 0x8000)) | ||||
| CONV_FUNC(16_end_sign_end, short, short, src ^ 0x80) | ||||
| 
 | ||||
| CONV_FUNC(16_24, short, long, (unsigned long)src << 8) | ||||
| CONV_FUNC(16_24_sign, short, long, (unsigned long)(src ^ 0x8000) << 8) | ||||
| CONV_FUNC(16_24_end, short, long, (unsigned long)bswap_16(src) << 8) | ||||
| CONV_FUNC(16_24_sign_end, short, long, (unsigned long)bswap_16(src ^ 0x8000) << 8) | ||||
| CONV_FUNC(16_end_24, short, long, (unsigned long)bswap_16(src) << 8) | ||||
| CONV_FUNC(16_end_24_sign, short, long, (unsigned long)(bswap_16(src) ^ 0x8000) << 8) | ||||
| CONV_FUNC(16_end_24_end, short, long, (unsigned long)src << 8) | ||||
| CONV_FUNC(16_end_24_sign_end, short, long, ((unsigned long)src ^ 0x80) << 8) | ||||
| 
 | ||||
| CONV_FUNC(16_32, short, long, (unsigned long)src << 16) | ||||
| CONV_FUNC(16_32_sign, short, long, (unsigned long)(src ^ 0x8000) << 16) | ||||
| CONV_FUNC(16_32_end, short, long, (unsigned long)bswap_16(src)) | ||||
|  | @ -90,10 +104,39 @@ CONV_FUNC(16_end_32_sign, short, long, (unsigned long)(bswap_16(src) ^ 0x8000) < | |||
| CONV_FUNC(16_end_32_end, short, long, (unsigned long)src) | ||||
| CONV_FUNC(16_end_32_sign_end, short, long, (unsigned long)src ^ 0x80) | ||||
| 
 | ||||
| CONV_FUNC(24_8, long, char, src >> 16) | ||||
| CONV_FUNC(24_end_8, long, char, src >> 8) | ||||
| CONV_FUNC(24_8_sign, long, char, (src >> 16) ^ 0x80) | ||||
| CONV_FUNC(24_end_8_sign, long, char, (src >> 8) ^ 0x80) | ||||
| 
 | ||||
| CONV_FUNC(24_16, long, short, src >> 8) | ||||
| CONV_FUNC(24_16_sign, long, short, (src >> 8) ^ 0x8000) | ||||
| CONV_FUNC(24_16_end, long, short, bswap_32(src >> 8)) | ||||
| CONV_FUNC(24_16_sign_end, long, short, bswap_32((src >> 8) ^ 0x8000)) | ||||
| CONV_FUNC(24_end_16, long, short, bswap_32(src) >> 8) | ||||
| CONV_FUNC(24_end_16_sign, long, short, (bswap_32(src) >> 8) ^ 0x8000) | ||||
| CONV_FUNC(24_end_16_end, long, short, src >> 8) | ||||
| CONV_FUNC(24_end_16_sign_end, long, short, (src >> 8) ^ 0x80) | ||||
| 
 | ||||
| CONV_FUNC(24_sign, long, long, src ^ 0x800000) | ||||
| CONV_FUNC(24_end, long, long, bswap_32(src)) | ||||
| CONV_FUNC(24_end_sign, long, long, bswap_32(src) ^ 0x800000) | ||||
| CONV_FUNC(24_sign_end, long, long, bswap_32(src) ^ 0x80) | ||||
| CONV_FUNC(24_end_sign_end, long, long, src ^ 0x80) | ||||
| 
 | ||||
| CONV_FUNC(24_32, long, long, src << 8) | ||||
| CONV_FUNC(24_32_sign, long, long, (src << 8) ^ 0x80000000) | ||||
| CONV_FUNC(24_32_end, long, long, bswap_32(src << 8)) | ||||
| CONV_FUNC(24_32_sign_end, long, long, bswap_32((src << 8) ^ 0x80000000)) | ||||
| CONV_FUNC(24_end_32, long, long, bswap_32(src) << 8) | ||||
| CONV_FUNC(24_end_32_sign, long, long, (bswap_32(src) << 8) ^ 0x80000000) | ||||
| CONV_FUNC(24_end_32_end, long, long, src >> 8) | ||||
| CONV_FUNC(24_end_32_sign_end, long, long, (src >> 8) ^ 0x80) | ||||
| 
 | ||||
| CONV_FUNC(32_8, long, char, src >> 24) | ||||
| CONV_FUNC(32_end_8, long, char, src) | ||||
| CONV_FUNC(32_8_sign, long, char, (src >> 24) ^ 0x80) | ||||
| CONV_FUNC(32_end_8_sign, long, char, src ^ 0x80;) | ||||
| CONV_FUNC(32_end_8_sign, long, char, src ^ 0x80) | ||||
| 
 | ||||
| CONV_FUNC(32_16, long, short, src >> 16) | ||||
| CONV_FUNC(32_16_sign, long, short, (src >> 16) ^ 0x8000) | ||||
|  | @ -104,6 +147,15 @@ CONV_FUNC(32_end_16_sign, long, short, bswap_16(src) ^ 0x8000) | |||
| CONV_FUNC(32_end_16_end, long, short, src) | ||||
| CONV_FUNC(32_end_16_sign_end, long, short, src ^ 0x80) | ||||
| 
 | ||||
| CONV_FUNC(32_24, long, long, src >> 8) | ||||
| CONV_FUNC(32_24_sign, long, long, (src >> 8) ^ 0x800000) | ||||
| CONV_FUNC(32_24_end, long, long, bswap_32(src >> 8)) | ||||
| CONV_FUNC(32_24_sign_end, long, long, bswap_32((src >> 8) ^ 0x800000)) | ||||
| CONV_FUNC(32_end_24, long, long, bswap_32(src) >> 8) | ||||
| CONV_FUNC(32_end_24_sign, long, long, (bswap_32(src) >> 8) ^ 0x800000) | ||||
| CONV_FUNC(32_end_24_end, long, long, src << 8) | ||||
| CONV_FUNC(32_end_24_sign_end, long, long, (src << 8) ^ 0x80) | ||||
| 
 | ||||
| CONV_FUNC(32_sign, long, long, src ^ 0x80000000) | ||||
| CONV_FUNC(32_end, long, long, bswap_32(src)) | ||||
| CONV_FUNC(32_end_sign, long, long, bswap_32(src) ^ 0x80000000) | ||||
|  | @ -111,7 +163,7 @@ CONV_FUNC(32_sign_end, long, long, bswap_32(src) ^ 0x80) | |||
| CONV_FUNC(32_end_sign_end, long, long, src ^ 0x80) | ||||
| 
 | ||||
| /* src_wid dst_wid src_endswap, dst_endswap, sign_swap */ | ||||
| conv_f convert_functions[3][3][2][2][2] = { | ||||
| conv_f convert_functions[4][4][2][2][2] = { | ||||
| 	NULL,			/* 8->8: Nothing to do */ | ||||
| 	conv_8_sign,		/* 8->8 sign: conv_8_sign */ | ||||
| 	NULL,			/* 8->8 dst_end: Nothing to do */ | ||||
|  | @ -128,6 +180,14 @@ conv_f convert_functions[3][3][2][2][2] = { | |||
| 	conv_8_16_sign,		/* 8->16 src_end sign: conv_8_16_sign */ | ||||
| 	conv_8_16_end,		/* 8->16 src_end dst_end: conv_8_16_end */ | ||||
| 	conv_8_16_sign_end,	/* 8->16 src_end dst_end sign: conv_8_16_sign_end */ | ||||
| 	conv_8_24,		/* 8->24: conv_8_24 */ | ||||
| 	conv_8_24_sign,		/* 8->24 sign: conv_8_24_sign */ | ||||
| 	conv_8_24_end,		/* 8->24 dst_end: conv_8_24_end */ | ||||
| 	conv_8_24_sign_end,	/* 8->24 dst_end sign: conv_8_24_sign_end */ | ||||
| 	conv_8_24,		/* 8->24 src_end: conv_8_24 */ | ||||
| 	conv_8_24_sign,		/* 8->24 src_end sign: conv_8_24_sign */ | ||||
| 	conv_8_24_end,		/* 8->24 src_end dst_end: conv_8_24_end */ | ||||
| 	conv_8_24_sign_end,	/* 8->24 src_end dst_end sign: conv_8_24_sign_end */ | ||||
| 	conv_8_32,			/* 8->32: conv_8_32 */ | ||||
| 	conv_8_32_sign,			/* 8->32 sign: conv_8_32_sign */ | ||||
| 	conv_8_32_end,			/* 8->32 dst_end: conv_8_32_end */ | ||||
|  | @ -160,6 +220,46 @@ conv_f convert_functions[3][3][2][2][2] = { | |||
| 	conv_16_end_32_sign,	/* 16->32 src_end sign: conv_16_end_32_sign */ | ||||
| 	conv_16_end_32_end,	/* 16->32 src_end dst_end: conv_16_end_32_end */ | ||||
| 	conv_16_end_32_sign_end,/* 16->32 src_end dst_end sign: conv_16_end_32_sign_end */ | ||||
| 	conv_16_24,		/* 16->24: conv_16_24 */ | ||||
| 	conv_16_24_sign,	/* 16->24 sign: conv_16_24_sign */ | ||||
| 	conv_16_24_end,		/* 16->24 dst_end: conv_16_24_end */ | ||||
| 	conv_16_24_sign_end,	/* 16->24 dst_end sign: conv_16_24_sign_end */ | ||||
| 	conv_16_end_24,		/* 16->24 src_end: conv_16_end_24 */ | ||||
| 	conv_16_end_24_sign,	/* 16->24 src_end sign: conv_16_end_24_sign */ | ||||
| 	conv_16_end_24_end,	/* 16->24 src_end dst_end: conv_16_end_24_end */ | ||||
| 	conv_16_end_24_sign_end,/* 16->24 src_end dst_end sign: conv_16_end_24_sign_end */ | ||||
| 	conv_24_8,		/* 24->8: conv_24_8 */ | ||||
| 	conv_24_8_sign,		/* 24->8 sign: conv_24_8_sign */ | ||||
| 	conv_24_8,		/* 24->8 dst_end: conv_24_8 */ | ||||
| 	conv_24_8_sign,		/* 24->8 dst_end sign: conv_24_8_sign */ | ||||
| 	conv_24_end_8,		/* 24->8 src_end: conv_24_end_8 */ | ||||
| 	conv_24_end_8_sign,	/* 24->8 src_end sign: conv_24_end_8_sign */ | ||||
| 	conv_24_end_8,		/* 24->8 src_end dst_end: conv_24_end_8 */ | ||||
| 	conv_24_end_8_sign,	/* 24->8 src_end dst_end sign: conv_24_end_8_sign */ | ||||
| 	conv_24_16,		/* 24->16: conv_24_16 */ | ||||
| 	conv_24_16_sign,	/* 24->16 sign: conv_24_16_sign */ | ||||
| 	conv_24_16_end,		/* 24->16 dst_end: conv_24_16_end */ | ||||
| 	conv_24_16_sign_end,	/* 24->16 dst_end sign: conv_24_16_sign_end */ | ||||
| 	conv_24_end_16,		/* 24->16 src_end: conv_24_end_16 */ | ||||
| 	conv_24_end_16_sign,	/* 24->16 src_end sign: conv_24_end_16_sign */ | ||||
| 	conv_24_end_16_end,	/* 24->16 src_end dst_end: conv_24_end_16_end */ | ||||
| 	conv_24_end_16_sign_end,/* 24->16 src_end dst_end sign: conv_24_end_16_sign_end */ | ||||
| 	NULL,			/* 24->24: Nothing to do */ | ||||
| 	conv_24_sign,		/* 24->24 sign: conv_24_sign */ | ||||
| 	conv_24_end,		/* 24->24 dst_end: conv_24_end */ | ||||
| 	conv_24_sign_end,	/* 24->24 dst_end sign: conv_24_sign_end */ | ||||
| 	conv_24_end,		/* 24->24 src_end: conv_24_end */ | ||||
| 	conv_24_end_sign,	/* 24->24 src_end sign: conv_24_end_sign */ | ||||
| 	NULL,			/* 24->24 src_end dst_end: Nothing to do */ | ||||
| 	conv_24_end_sign_end,	/* 24->24 src_end dst_end sign: conv_24_end_sign_end */ | ||||
| 	conv_24_32,		/* 24->32: conv_24_32 */ | ||||
| 	conv_24_32_sign,	/* 24->32 sign: conv_24_32_sign */ | ||||
| 	conv_24_32_end,		/* 24->32 dst_end: conv_24_32_end */ | ||||
| 	conv_24_32_sign_end,	/* 24->32 dst_end sign: conv_24_32_sign_end */ | ||||
| 	conv_24_end_32,		/* 24->32 src_end: conv_24_end_32 */ | ||||
| 	conv_24_end_32_sign,	/* 24->32 src_end sign: conv_24_end_32_sign */ | ||||
| 	conv_24_end_32_end,	/* 24->32 src_end dst_end: conv_24_end_32_end */ | ||||
| 	conv_24_end_32_sign_end,/* 24->32 src_end dst_end sign: conv_24_end_32_sign_end */ | ||||
| 	conv_32_8,		/* 32->8: conv_32_8 */ | ||||
| 	conv_32_8_sign,		/* 32->8 sign: conv_32_8_sign */ | ||||
| 	conv_32_8,		/* 32->8 dst_end: conv_32_8 */ | ||||
|  | @ -176,6 +276,14 @@ conv_f convert_functions[3][3][2][2][2] = { | |||
| 	conv_32_end_16_sign,	/* 32->16 src_end sign: conv_32_end_16_sign */ | ||||
| 	conv_32_end_16_end,	/* 32->16 src_end dst_end: conv_32_end_16_end */ | ||||
| 	conv_32_end_16_sign_end,/* 32->16 src_end dst_end sign: conv_32_end_16_sign_end */ | ||||
| 	conv_32_24,		/* 32->24: conv_32_24 */ | ||||
| 	conv_32_24_sign,	/* 32->24 sign: conv_32_24_sign */ | ||||
| 	conv_32_24_end,		/* 32->24 dst_end: conv_32_24_end */ | ||||
| 	conv_32_24_sign_end,	/* 32->24 dst_end sign: conv_32_24_sign_end */ | ||||
| 	conv_32_end_24,		/* 32->24 src_end: conv_32_end_24 */ | ||||
| 	conv_32_end_24_sign,	/* 32->24 src_end sign: conv_32_end_24_sign */ | ||||
| 	conv_32_end_24_end,	/* 32->24 src_end dst_end: conv_32_end_24_end */ | ||||
| 	conv_32_end_24_sign_end,/* 32->24 src_end dst_end sign: conv_32_end_24_sign_end */ | ||||
| 	NULL,			/* 32->32: Nothing to do */ | ||||
| 	conv_32_sign,		/* 32->32 sign: conv_32_sign */ | ||||
| 	conv_32_end,		/* 32->32 dst_end: conv_32_end */ | ||||
|  | @ -241,6 +349,7 @@ int snd_pcm_plugin_build_linear(snd_pcm_format_t *src_format, | |||
| 	snd_pcm_plugin_t *plugin; | ||||
| 	conv_f func; | ||||
| 	int src_endian, dst_endian, sign, src_width, dst_width; | ||||
| 	int src_sample_size, dst_sample_size; | ||||
| 
 | ||||
| 	if (!r_plugin) | ||||
| 		return -EINVAL; | ||||
|  | @ -274,12 +383,19 @@ int snd_pcm_plugin_build_linear(snd_pcm_format_t *src_format, | |||
| 	switch (src_width) { | ||||
| 	case 8: | ||||
| 		src_width = 0; | ||||
| 		src_sample_size = 1; | ||||
| 		break; | ||||
| 	case 16: | ||||
| 		src_width = 1; | ||||
| 		src_sample_size = 2; | ||||
| 		break; | ||||
| 	case 24: | ||||
| 		src_width = 2; | ||||
| 		src_sample_size = 4; | ||||
| 		break; | ||||
| 	case 32: | ||||
| 		src_width = 2; | ||||
| 		src_width = 3; | ||||
| 		src_sample_size = 4; | ||||
| 		break; | ||||
| 	default: | ||||
| 		return -EINVAL; | ||||
|  | @ -287,12 +403,19 @@ int snd_pcm_plugin_build_linear(snd_pcm_format_t *src_format, | |||
| 	switch (dst_width) { | ||||
| 	case 8: | ||||
| 		dst_width = 0; | ||||
| 		dst_sample_size = 1; | ||||
| 		break; | ||||
| 	case 16: | ||||
| 		dst_width = 1; | ||||
| 		dst_sample_size = 2; | ||||
| 		break; | ||||
| 	case 24: | ||||
| 		dst_width = 2; | ||||
| 		dst_sample_size = 4; | ||||
| 		break; | ||||
| 	case 32: | ||||
| 		dst_width = 2; | ||||
| 		dst_width = 3; | ||||
| 		dst_sample_size = 4; | ||||
| 		break; | ||||
| 	default: | ||||
| 		return -EINVAL; | ||||
|  | @ -314,8 +437,8 @@ int snd_pcm_plugin_build_linear(snd_pcm_format_t *src_format, | |||
| 		return -ENOMEM; | ||||
| 	data = (struct linear_private_data *)snd_pcm_plugin_extra_data(plugin); | ||||
| 	data->func = func; | ||||
| 	data->src_sample_size = 1 << src_width; | ||||
| 	data->dst_sample_size = 1 << dst_width; | ||||
| 	data->src_sample_size = src_sample_size; | ||||
| 	data->dst_sample_size = dst_sample_size; | ||||
| 
 | ||||
| 	plugin->transfer = linear_transfer; | ||||
| 	plugin->src_size = linear_src_size; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Abramo Bagnara
						Abramo Bagnara