mirror of
				https://github.com/alsa-project/alsa-lib.git
				synced 2025-10-29 05:40:25 -04:00 
			
		
		
		
	test: Add an example program to inquire UMP Endpoint and Block info
Provide an example program to inquire UMP Endpoint and Block info in various APIs. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
		
							parent
							
								
									fa673b719c
								
							
						
					
					
						commit
						3e38164ee5
					
				
					 2 changed files with 149 additions and 1 deletions
				
			
		|  | @ -1,7 +1,7 @@ | ||||||
| SUBDIRS=. lsb | SUBDIRS=. lsb | ||||||
| 
 | 
 | ||||||
| check_PROGRAMS=control pcm pcm_min latency seq seq-ump-example \ | check_PROGRAMS=control pcm pcm_min latency seq seq-ump-example \ | ||||||
| 	       playmidi1 timer rawmidi midiloop \ | 	       playmidi1 timer rawmidi midiloop umpinfo \ | ||||||
| 	       oldapi queue_timer namehint client_event_filter \ | 	       oldapi queue_timer namehint client_event_filter \ | ||||||
| 	       chmap audio_time user-ctl-element-set pcm-multi-thread | 	       chmap audio_time user-ctl-element-set pcm-multi-thread | ||||||
| 
 | 
 | ||||||
|  | @ -17,6 +17,7 @@ playmidi1_LDADD=../src/libasound.la | ||||||
| timer_LDADD=../src/libasound.la | timer_LDADD=../src/libasound.la | ||||||
| rawmidi_LDADD=../src/libasound.la | rawmidi_LDADD=../src/libasound.la | ||||||
| midiloop_LDADD=../src/libasound.la | midiloop_LDADD=../src/libasound.la | ||||||
|  | umpinfo_LDADD=../src/libasound.la | ||||||
| oldapi_LDADD=../src/libasound.la | oldapi_LDADD=../src/libasound.la | ||||||
| queue_timer_LDADD=../src/libasound.la | queue_timer_LDADD=../src/libasound.la | ||||||
| namehint_LDADD=../src/libasound.la | namehint_LDADD=../src/libasound.la | ||||||
|  |  | ||||||
							
								
								
									
										147
									
								
								test/umpinfo.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								test/umpinfo.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,147 @@ | ||||||
|  | // SPDX-License-Identifier: GPL-2.0-or-later
 | ||||||
|  | // Inquire UMP Endpoint and Block info in various APIs
 | ||||||
|  | 
 | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <alsa/asoundlib.h> | ||||||
|  | 
 | ||||||
|  | enum { UNKNOWN, SEQ, RAWMIDI, CTL }; | ||||||
|  | static int mode = UNKNOWN; | ||||||
|  | 
 | ||||||
|  | static snd_seq_t *seq; | ||||||
|  | static int client; | ||||||
|  | static snd_ump_t *ump; | ||||||
|  | static snd_ctl_t *ctl; | ||||||
|  | 
 | ||||||
|  | static int get_ump_endpoint_info(snd_ump_endpoint_info_t *ep) | ||||||
|  | { | ||||||
|  | 	switch (mode) { | ||||||
|  | 	case SEQ: | ||||||
|  | 		return snd_seq_get_ump_endpoint_info(seq, client, ep); | ||||||
|  | 	case RAWMIDI: | ||||||
|  | 		return snd_ump_endpoint_info(ump, ep); | ||||||
|  | 	case CTL: | ||||||
|  | 		return snd_ctl_ump_endpoint_info(ctl, ep); | ||||||
|  | 	default: | ||||||
|  | 		return -EINVAL; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int get_ump_block_info(int blk, snd_ump_block_info_t *bp) | ||||||
|  | { | ||||||
|  | 	switch (mode) { | ||||||
|  | 	case SEQ: | ||||||
|  | 		return snd_seq_get_ump_block_info(seq, client, blk, bp); | ||||||
|  | 	case RAWMIDI: | ||||||
|  | 		snd_ump_block_info_set_block_id(bp, blk); | ||||||
|  | 		return snd_ump_block_info(ump, bp); | ||||||
|  | 	case CTL: | ||||||
|  | 		snd_ump_block_info_set_block_id(bp, blk); | ||||||
|  | 		return snd_ctl_ump_block_info(ctl, bp); | ||||||
|  | 	default: | ||||||
|  | 		return -EINVAL; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void help(void) | ||||||
|  | { | ||||||
|  | 	printf("umpinfo: inquire UMP Endpoint and Block info\n" | ||||||
|  | 	       "  umpinfo -c target	inquiry via control API\n" | ||||||
|  | 	       "  umpinfo -m target	inquiry via UMP rawmidi API\n" | ||||||
|  | 	       "  umpinfo -s client	inquiry via sequencer API\n" | ||||||
|  | 	       "    target = hw:0, etc\n" | ||||||
|  | 	       "    client = sequencer client number\n"); | ||||||
|  | 	exit(1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main(int argc, char **argv) | ||||||
|  | { | ||||||
|  | 	const char *target = "hw:0"; | ||||||
|  | 	snd_ump_endpoint_info_t *ep; | ||||||
|  | 	snd_ump_block_info_t *blk; | ||||||
|  | 	const unsigned char *s; | ||||||
|  | 	int c, i, num_blks; | ||||||
|  | 
 | ||||||
|  | 	while ((c = getopt(argc, argv, "s:m:c:h")) >= 0) { | ||||||
|  | 		switch (c) { | ||||||
|  | 		case 's': | ||||||
|  | 			mode = SEQ; | ||||||
|  | 			client = atoi(target); | ||||||
|  | 			break; | ||||||
|  | 		case 'm': | ||||||
|  | 			mode = RAWMIDI; | ||||||
|  | 			target = optarg; | ||||||
|  | 			break; | ||||||
|  | 		case 'c': | ||||||
|  | 			mode = CTL; | ||||||
|  | 			target = optarg; | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			help(); | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	switch (mode) { | ||||||
|  | 	case SEQ: | ||||||
|  | 		if (snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0)) { | ||||||
|  | 			fprintf(stderr, "failed to open sequencer\n"); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
|  | 		break; | ||||||
|  | 	case RAWMIDI: | ||||||
|  | 		if (snd_ump_open(&ump, NULL, target, 0)) { | ||||||
|  | 			fprintf(stderr, "failed to open UMP rawmidi\n"); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
|  | 		break; | ||||||
|  | 	case CTL: | ||||||
|  | 		if (snd_ctl_open(&ctl, target, 0)) { | ||||||
|  | 			fprintf(stderr, "failed to open control\n"); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
|  | 		break; | ||||||
|  | 	default: | ||||||
|  | 		help(); | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	snd_ump_endpoint_info_alloca(&ep); | ||||||
|  | 	snd_ump_block_info_alloca(&blk); | ||||||
|  | 
 | ||||||
|  | 	if (get_ump_endpoint_info(ep)) { | ||||||
|  | 		fprintf(stderr, "failed to get UMP EP info\n"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	printf("Name: %s\n", snd_ump_endpoint_info_get_name(ep)); | ||||||
|  | 	printf("Product ID: %s\n", snd_ump_endpoint_info_get_product_id(ep)); | ||||||
|  | 	printf("Flags: 0x%x\n", snd_ump_endpoint_info_get_flags(ep)); | ||||||
|  | 	printf("Protocol Caps: 0x%x\n", snd_ump_endpoint_info_get_protocol_caps(ep)); | ||||||
|  | 	printf("Protocol: 0x%x\n", snd_ump_endpoint_info_get_protocol(ep)); | ||||||
|  | 	printf("Num Blocks: %d\n", snd_ump_endpoint_info_get_num_blocks(ep)); | ||||||
|  | 	printf("Version: 0x%x\n", snd_ump_endpoint_info_get_version(ep)); | ||||||
|  | 	printf("Manufacturer ID: 0x%x\n", snd_ump_endpoint_info_get_manufacturer_id(ep)); | ||||||
|  | 	printf("Family ID: 0x%x\n", snd_ump_endpoint_info_get_family_id(ep)); | ||||||
|  | 	printf("Model ID: 0x%x\n", snd_ump_endpoint_info_get_model_id(ep)); | ||||||
|  | 	s = snd_ump_endpoint_info_get_sw_revision(ep); | ||||||
|  | 	printf("SW Revision: %02x:%02x:%02x:%02x\n", s[0], s[1], s[2], s[3]); | ||||||
|  | 	num_blks = snd_ump_endpoint_info_get_num_blocks(ep); | ||||||
|  | 	for (i = 0; i < num_blks; i++) { | ||||||
|  | 		if (get_ump_block_info(i, blk)) { | ||||||
|  | 			fprintf(stderr, "failed to get UMP Block info for %d\n", i); | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  | 		printf("\n"); | ||||||
|  | 		printf("Block ID: %d\n", snd_ump_block_info_get_block_id(blk)); | ||||||
|  | 		printf("Name: %s\n", snd_ump_block_info_get_name(blk)); | ||||||
|  | 		printf("Active: %d\n", snd_ump_block_info_get_active(blk)); | ||||||
|  | 		printf("Flags: 0x%x\n", snd_ump_block_info_get_flags(blk)); | ||||||
|  | 		printf("Direction: %d\n", snd_ump_block_info_get_direction(blk)); | ||||||
|  | 		printf("First Group: %d\n", snd_ump_block_info_get_first_group(blk)); | ||||||
|  | 		printf("Num Groups: %d\n", snd_ump_block_info_get_num_groups(blk)); | ||||||
|  | 		printf("MIDI-CI Version: %d\n", snd_ump_block_info_get_midi_ci_version(blk)); | ||||||
|  | 		printf("Sysex8 Streams: %d\n", snd_ump_block_info_get_sysex8_streams(blk)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Takashi Iwai
						Takashi Iwai