getopt_long函数的典型使用
在实际开发中 需要自行开发一些测试程序。参考glibc 等LINUX 标准命令实现即可。
int main(int argc, char const *argv[])
{
int ret = 0,i;
char buffer[1024*2];
int len_read,len_write,offset,chunk_bytes;
fd_set rfds,wfds;
int io_select = -1;
char file_name[100]={0,};
struct fh81_audio_cfg_arg audio_cfg;
int option_index, c;
static const char short_options[] = "hC:P:r:v:s:b:p:";
static const struct option long_options[] = {
{"help",no_argument,0,'h'},
{"capture",required_argument,0,'C'},
{"playback",required_argument,0,'P'},
{"rate",required_argument,0,'r'},
{"volume",required_argument,0,'v'},
{"select_io",required_argument,0,'s'},
{"buffer_size",required_argument,0,'b'},
{"period_size",required_argument,0,'p'},
{0, 0, 0, 0}
};
/*default config*/
audio_cfg.volume = 85;
audio_cfg.rate = 8000;
audio_cfg.frame_bit = 16;
audio_cfg.channels = 1;
audio_cfg.period_size = 1024;
audio_cfg.buffer_size = audio_cfg.period_size << 3;
while ((c = getopt_long(argc, argv, short_options, long_options, &option_index)) != -1) {
switch(c) {
case 'h':
print_usage();
return 0;
case 'C':
strcpy(file_name,optarg);
stream = 0;
break;
case 'P':
strcpy(file_name,optarg);
stream = 1;
break;
case 'r':
audio_cfg.rate = strtol(optarg, NULL, 0);
break;
case 'v':
audio_cfg.volume = strtol(optarg, NULL, 0);
break;
case 's':
break;
case 'b':
audio_cfg.buffer_size = strtol(optarg, NULL, 0);
break;
case 'p':
audio_cfg.period_size = strtol(optarg, NULL, 0);
break;
default:
printf("unsupport cmd,try -h for help\n");
return 1;
}
}
if (-1 == stream) {
printf("please select capture or playback\n");
return 0;
}
if (strlen(file_name) < 1) {
printf("please input the file_name to capture or playback\n");
return 0;
}
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
signal(SIGABRT, signal_handler);
audio_fd = open("/dev/fh_linbao_i2s", O_RDWR);
if (audio_fd == -1) {
perror("open /dev/fh_audio");
return -1;
}
if (0 == stream) {
/*capture test*/
ret = ioctl(audio_fd, I2S_INIT_CAPTURE_MEM, &audio_cfg);
if (ret < 0) {
printf("[ERROR]: ioctl AC_INIT_CAPTURE_MEM failed ret=%d\n", ret);
return ret;
}
chunk_bytes = frames_to_bytes(audio_cfg.frame_bit,audio_cfg.period_size);
fd_file = open(file_name,O_RDWR|O_CREAT|O_TRUNC);
ret = ioctl(audio_fd, I2S_AI_EN, NULL);
if (ret < 0) {
printf("[ERROR]: ioctl AC_AI_EN failed ret=%d\n", ret);
return ret;
}
while(1) {
FD_ZERO(&rfds);
FD_SET(audio_fd,&rfds);
select(audio_fd+1,&rfds,NULL,NULL,NULL);
if (FD_ISSET(audio_fd,&rfds)) {
len_read = read(audio_fd,buffer,chunk_bytes);
write(fd_file,buffer,len_read);
}
}
ret = ioctl(audio_fd, I2S_AI_DISABLE, NULL);
} else {
/*playback test*/
fd_file = open(file_name,O_RDONLY);
if (fd_file < 0) {
printf("playback file not exits\n");
return -1;
}
ret = ioctl(audio_fd, I2S_INIT_PLAYBACK_MEM, &audio_cfg);
if (ret < 0) {
printf("[ERROR]: ioctl AC_INIT_PLAYBACK_MEM failed ret=%d\n", ret);
return ret;
}
ret = ioctl(audio_fd, I2S_AO_EN, NULL);
if (ret < 0) {
printf("[ERROR]: ioctl AC_AO_EN failed ret=%d\n", ret);
return ret;
}
chunk_bytes = frames_to_bytes(audio_cfg.frame_bit,audio_cfg.period_size);
while(1) {
len_read = read(fd_file,buffer,chunk_bytes);
if (len_read <= 0) {
printf("playback finished %d\n",len_read);
break;
}
if (len_read < chunk_bytes) {
fill_silence_data(buffer,chunk_bytes, chunk_bytes - len_read);
}
FD_ZERO(&wfds);
FD_SET(audio_fd,&wfds);
select(audio_fd+1,NULL,&wfds,NULL,NULL);
if (FD_ISSET(audio_fd,&wfds)) {
len_write = write(audio_fd,buffer,chunk_bytes);
//printf("write len = %d\n",len_write);
}
}
ret = ioctl(audio_fd, I2S_AO_DISABLE, NULL);
}
close(fd_file);
fd_file = -1;
close(audio_fd);
audio_fd = -1;
return 0;
}
上述是I2S的一个数据捕获测试DEMO
arm-linux# ./i2s_test -h
-h :help
-C file_name :capture
-P file_name :playback
-r n :n=sample rate(8000/16000/32000/44100/48000)
-v n :n=input volume(0~100)
-s n :n=0/1/2/3(0=mic_in;1=line_in;2=speaker_out;3=line_out)
-b n :n=buffer size
-p n :n=period_size
capture example: ./i2s_test -C test.dat -r 44100 -v 80 -s 1 -p 1024 -b 8196
playback example: ./i2s_test -P test.dat -r 44100 -s 2 -p 1024 -b 8196
getopt_long 的参数获取 具体可参考上述代码实现