/* * Copyright (c) Hisilicon Technologies Co., Ltd. 2019-2020. All rights reserved. * Description: mix engine sample * Author: audio * Create: 2019-05-19 */ #include #include #include #include #include "uapi_sound.h" #include "securec.h" #include "uapi_system.h" #include "adp_common_ext.h" #define RATIO 1000 #define INPUT_CMD_LENGTH 32 typedef struct { uapi_snd snd; td_bool geq_enable; td_u32 select_band; uapi_snd_geq_attr geq_attr; td_s32 argc; td_char *argv[INPUT_CMD_LENGTH]; } sample_geq_ctx; static td_void sample_geq_print_attr(sample_geq_ctx *geq_ctx) { td_u32 i; td_s32 ret; ret = uapi_snd_get_geq_enable(geq_ctx->snd, &geq_ctx->geq_enable); if (ret != TD_SUCCESS) { printf("call uapi_snd_get_geq_enable failed(0x%x)\n", ret); return; } ret = uapi_snd_get_geq_attr(geq_ctx->snd, &geq_ctx->geq_attr); if (ret != TD_SUCCESS) { printf("call uapi_snd_get_geq_attr failed(0x%x)\n", ret); return; } printf("==========================================\n"); printf("-geq_enable: %s\n", (geq_ctx->geq_enable == TD_TRUE) ? "yes" : "no"); printf("-band_num: %d\n", geq_ctx->geq_attr.band_num); printf("%4s | %-6s | %-5s |\n", "band", "freq", "gain"); for (i = 0; i < geq_ctx->geq_attr.band_num; i++) { printf("%4d | %-6d %-5d |\n", i, geq_ctx->geq_attr.param[i].freq, geq_ctx->geq_attr.param[i].gain); } printf("-select_band: %d\n", geq_ctx->select_band); printf("\n==========================================\n"); } static td_void sample_geq_deinit(const sample_geq_ctx *geq_ctx) { td_s32 ret; (td_void)geq_ctx; ret = uapi_snd_deinit(); if (ret != TD_SUCCESS) { printf("call uapi_snd_deinit failed(0x%x)\n", ret); return; } } static td_s32 sample_geq_init(sample_geq_ctx *geq_ctx) { td_s32 ret; ret = memset_s(geq_ctx, sizeof(*geq_ctx), 0, sizeof(sample_geq_ctx)); if (ret != EOK) { printf("call memset_s failed(0x%x)\n", ret); return ret; } geq_ctx->snd = UAPI_SND_0; ret = uapi_snd_init(); if (ret != TD_SUCCESS) { printf("call uapi_snd_init failed(0x%x)\n", ret); return ret; } ret = uapi_snd_get_geq_enable(geq_ctx->snd, &geq_ctx->geq_enable); if (ret != TD_SUCCESS) { printf("call uapi_snd_get_geq_enable failed(0x%x)\n", ret); goto out; } ret = uapi_snd_get_geq_attr(geq_ctx->snd, &geq_ctx->geq_attr); if (ret != TD_SUCCESS) { printf("call uapi_snd_get_geq_attr failed(0x%x)\n", ret); goto out; } return TD_SUCCESS; out: sample_geq_deinit(geq_ctx); return ret; } static td_void sample_geq_set_attr(sample_geq_ctx *geq_ctx) { td_s32 ret; ret = uapi_snd_set_geq_enable(geq_ctx->snd, geq_ctx->geq_enable); if (ret != TD_SUCCESS) { printf("call uapi_snd_set_geq_enable failed(0x%x)\n", ret); } ret = uapi_snd_set_geq_attr(geq_ctx->snd, &geq_ctx->geq_attr); if (ret != TD_SUCCESS) { printf("call uapi_snd_set_geq_attr failed(0x%x)\n", ret); } sample_geq_print_attr(geq_ctx); } static td_void sample_geq_print_memu(td_void) { printf("==========================================\n"); printf("input q to quit\n"); printf("support option:\n"); printf( "\t-p: print geq attr\n" "\t-e: enable geq\n" "\t-d: disable geq\n" "\t-b: set total num of banks [1, 10]\n" "\t-n: select bank to change attr [0, 9]\n" "\t-f: freq\n" "\t-g: gain(-15000,15000,step by 125)\n" ); printf("==========================================\n"); } static td_s32 sample_geq_parse_attr(sample_geq_ctx *geq_ctx, td_char opt, td_char *opt_arg) { if (opt_arg == TD_NULL) { printf("invalid option -- '%c'\n", opt); sample_geq_print_memu(); return TD_FAILURE; } if (geq_ctx->geq_attr.band_num > UAPI_SND_EQ_BAND_MAX) { printf("invalid band_num -- '%d'\n", geq_ctx->geq_attr.band_num); sample_geq_print_memu(); return TD_FAILURE; } if (geq_ctx->select_band >= UAPI_SND_EQ_BAND_MAX) { printf("invalid select_band -- '%d'\n", geq_ctx->select_band); sample_geq_print_memu(); return TD_FAILURE; } switch (opt) { case 'b': geq_ctx->geq_attr.band_num = (td_u32)strtol(opt_arg, NULL, 10); /* 10 is Dec */ break; case 'n': geq_ctx->select_band = (td_u32)strtol(opt_arg, NULL, 10); /* 10 is Dec */ break; case 'f': geq_ctx->geq_attr.param[geq_ctx->select_band].freq = (td_u32)strtol(opt_arg, NULL, 10); /* 10 is Dec */ break; case 'g': geq_ctx->geq_attr.param[geq_ctx->select_band].gain = (td_u32)strtol(opt_arg, NULL, 10); /* 10 is Dec */ break; default: printf("invalid option -- '%c'\n", opt); sample_geq_print_memu(); return TD_FAILURE; } return TD_SUCCESS; } static td_u32 sample_geq_parse_opt(sample_geq_ctx *geq_ctx, td_char opt, td_char *opt_arg) { td_s32 ret; switch (opt) { case 'h' | 'H': sample_geq_print_memu(); return INPUT_CMD_LENGTH; case 'p' | 'P': sample_geq_print_attr(geq_ctx); return INPUT_CMD_LENGTH; case 'e': geq_ctx->geq_enable = TD_TRUE; return 1; case 'd': geq_ctx->geq_enable = TD_FALSE; return 1; default: break; } ret = sample_geq_parse_attr(geq_ctx, opt, opt_arg); if (ret != TD_SUCCESS) { return INPUT_CMD_LENGTH; } return 2; /* consume 2 args */ } static td_void sample_geq_cmd_line_to_arg(sample_geq_ctx *geq_ctx, td_char *cmd, td_u32 cmd_size) { td_u32 i; geq_ctx->argc = 0; geq_ctx->argv[0] = TD_NULL; if ((*cmd == '\0') || (*cmd == '\n')) { sample_geq_print_memu(); return; } for (i = 0; i < cmd_size; i++) { if ((cmd[i] == ' ') || (cmd[i] == '\n')) { cmd[i] = '\0'; } } for (i = 0; i < cmd_size; i++) { if ((i == 0) && (cmd[i] != '\0')) { geq_ctx->argv[geq_ctx->argc] = cmd + i; geq_ctx->argc++; } if ((i > 0) && (cmd[i - 1] == '\0') && (cmd[i] != '\0')) { geq_ctx->argv[geq_ctx->argc] = cmd + i; geq_ctx->argc++; } } } static td_void sample_geq_parse_cmd_line(sample_geq_ctx *geq_ctx, td_char *cmd, td_u32 cmd_size) { td_s32 i; td_u32 j; geq_ctx->argc = 0; sample_geq_cmd_line_to_arg(geq_ctx, cmd, cmd_size); if (geq_ctx->argc == 0) { return; } i = 0; while (1) { if (i >= geq_ctx->argc) { break; } j = sample_geq_parse_opt(geq_ctx, *(geq_ctx->argv[i]), geq_ctx->argv[i + 1]); if (j == INPUT_CMD_LENGTH) { return; } i += j; } sample_geq_set_attr(geq_ctx); } td_s32 main(td_s32 argc, td_char *argv[]) { td_s32 ret; sample_geq_ctx geq_ctx; td_char input_cmd[INPUT_CMD_LENGTH]; (td_void)argc; (td_void)argv; ret = uapi_sys_init(); if (ret != TD_SUCCESS) { printf("call uapi_sys_init failed(0x%x)\n", ret); return ret; } ret = sample_geq_init(&geq_ctx); if (ret != TD_SUCCESS) { printf("call sample_geq_init failed(0x%x)\n", ret); goto out; } sample_geq_print_attr(&geq_ctx); sample_geq_print_memu(); while (1) { if (memset_s(input_cmd, sizeof(input_cmd), 0, INPUT_CMD_LENGTH) != EOK) { break; } (td_void)fgets((char *)(input_cmd), (sizeof(input_cmd) - 1), stdin); if (input_cmd[0] == 'q') { printf("Prepare to quit!\n"); break; } input_cmd[INPUT_CMD_LENGTH - 1] = '\0'; sample_geq_parse_cmd_line(&geq_ctx, input_cmd, INPUT_CMD_LENGTH); } sample_geq_deinit(&geq_ctx); out: ret = uapi_sys_deinit(); if (ret != TD_SUCCESS) { printf("call uapi_sys_deinit failed(0x%x)\n", ret); return ret; } return 0; }