You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 lines
4.2 KiB

/*
* Copyright (c) Hisilicon Technologies Co., Ltd. 2020-2021. All rights reserved.
* Description: karaoke sample
* Author: audio
* Create: 2020-04-03
*/
#include <stdio.h>
#include <stdlib.h>
#include "securec.h"
#include "adp_common_ext.h"
#include "uapi_sound.h"
#include "karaoke.h"
static td_s32 mixengine_snd_init(td_void)
{
td_s32 ret;
uapi_snd_attr attr;
ret = uapi_snd_init();
if (ret != TD_SUCCESS) {
printf("call uapi_SND_Init failed.\n");
return ret;
}
ret = uapi_snd_get_default_open_attr(UAPI_SND_0, &attr);
if (ret != TD_SUCCESS) {
printf("call uapi_snd_get_default_open_attr failed.\n");
return ret;
}
ret = uapi_snd_open(UAPI_SND_0, &attr);
if (ret != TD_SUCCESS) {
printf("call uapi_snd_open failed. ret(%d)\n", ret);
return ret;
}
return TD_SUCCESS;
}
static td_void mixengine_snd_deinit(td_void)
{
td_s32 ret;
ret = uapi_snd_close(UAPI_SND_0);
if (ret != TD_SUCCESS) {
printf("call uapi_snd_close failed.\n");
return;
}
ret = uapi_snd_deinit();
if (ret != TD_SUCCESS) {
printf("call uapi_snd_deinit failed.\n");
return;
}
}
static td_s32 sample_capture_init(td_char **argv, td_handle *track_id)
{
td_s32 ret;
uapi_audio_track_attr track_attr;
td_u32 card;
td_bool sync = TD_TRUE;
card = (td_u32)strtol(argv[1], NULL, 10); /* 10 is Dec */
ret = usb_mic_dev_init(card);
if (ret != TD_SUCCESS) {
printf("%s[%d]: call usb_mic_dev_init failed\n", __FUNCTION__, __LINE__);
return ret;
}
ret = mixengine_snd_init();
if (ret != TD_SUCCESS) {
printf("mixengine_snd_init fail!\n");
usb_mic_dev_deinit();
return ret;
}
ret = uapi_snd_get_default_track_attr(UAPI_SND_TRACK_TYPE_LOWLATENCY, &track_attr);
if (ret != TD_SUCCESS) {
printf("uapi_snd_get_default_track_attr fail!\n");
mixengine_snd_deinit();
usb_mic_dev_deinit();
return ret;
}
sync = !!((td_u32)strtol(argv[2], NULL, 10) == 0); /* 2 is num, 10 is Dec */
if (sync == TD_FALSE) {
track_attr.sync_port_mute = TD_FALSE;
track_attr.sync_port_vol = TD_FALSE;
}
ret = uapi_snd_create_track(UAPI_SND_0, &track_attr, track_id);
if (ret != TD_SUCCESS) {
printf("uapi_snd_create_track fail!\n");
mixengine_snd_deinit();
usb_mic_dev_deinit();
return ret;
}
return TD_SUCCESS;
}
static td_void sample_capture_deinit(td_handle track_id)
{
td_s32 ret;
ret = uapi_snd_destroy_track(track_id);
if (ret != TD_SUCCESS) {
printf("call uapi_snd_destroy_track failed\n");
return;
}
mixengine_snd_deinit();
}
static td_void capture_ctx_init(sample_capture_ctx *ctx)
{
ctx->ao_frame.bit_depth = UAPI_AUDIO_BIT_DEPTH_16;
ctx->ao_frame.channels = CHANNELS_2;
ctx->ao_frame.interleaved = TD_TRUE;
ctx->ao_frame.sample_rate = UAPI_AUDIO_SAMPLE_RATE_48K;
ctx->ao_frame.pts = 0xffffffffffffffff;
ctx->ao_frame.bits_buffer = TD_NULL;
ctx->ao_frame.frame_index = 0;
ctx->ao_frame.pcm_samples = DEFAULT_PCM_SAMPLES;
ctx->ao_frame.iec_data_type = 0;
}
td_s32 main(td_s32 argc, td_char **argv)
{
td_s32 ret;
td_char input_cmd[INPUT_CMD_LENGTH];
sample_capture_ctx ctx;
if (argc < 3) { /* 3 is max input num */
printf("======please input card num and sync attr======\n");
return -1;
}
ret = memset_s(&ctx, sizeof(ctx), 0, sizeof(sample_capture_ctx));
if (ret != EOK) {
printf("call memset_s failed(0x%x)\n", ret);
return ret;
}
sample_capture_init(argv, &ctx.track_id);
capture_ctx_init(&ctx);
capture_sample_start(&ctx);
while (1) {
printf("please input the q to quit!\n");
(td_void)fgets((char *)(input_cmd), (sizeof(input_cmd) - 1), stdin);
if (input_cmd[0] == 'q') {
printf("prepare to quit!\n");
break;
}
}
capture_sample_stop(&ctx);
sample_capture_deinit(ctx.track_id);
return TD_SUCCESS;
}