This repository has been archived on 2023-07-17. You can view files and clone it, but cannot push or open issues or pull requests.
bl_mcu_sdk/examples/audio_cube/main.c

241 lines
9.9 KiB
C

/**
* @file main.c
* @brief
*
* Copyright (c) 2021 Bouffalolab team
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
*/
#include "bflb_platform.h"
#include "hal_i2s.h"
#include "hal_dma.h"
#include "data_protocol.h"
#include "wav_play_from_isp.h"
audio_dev_t audio_test;
isp_obj_t isp_obj_uart;
struct device *uart_isp;
uint8_t flag = 0;
/**
* @brief isp 事件回调,一般运行在中断里,不要阻塞操作
*
* @param isp_obj
* @param isp_callback_reason
*/
void isp_uart_callback(isp_obj_t *isp_obj, isp_callback_reason_t isp_callback_reason)
{
int vol;
switch (isp_callback_reason) {
case ISP_CALLBACK_RECEIVE_ACK_WAIT:
/* receive data information */
if (isp_obj->cmd_id == 0x50) {
/* receive data information */
if (isp_obj->file_type == 0x59 && audio_test.audio_state)
audio_test.audio_state = 1;
isp_obj->auot_ack = 0; /* auto ack */
} else if (isp_obj->cmd_id == 0x51) {
/* updata buff */
if (audio_test.audio_state == 0) { /* Not allowed to play */
isp_obj->auot_ack = 0;
} else if (audio_test.audio_state < 4) { /* start play */
audio_test.buff_using = (isp_obj->file_data == audio_test.buff[0]) ? 1 : 0;
audio_test.buff_data_size[!audio_test.buff_using] = isp_obj->length;
// audio_test.audio_control(&audio_test, AUDIO_CMD_PLAY_START, NULL);
if (audio_test.audio_state == 1) {
if (audio_test.audio_init(&audio_test, 0, isp_obj->file_data)) {
break;
}
}
audio_test.audio_control(&audio_test, AUDIO_CMD_PLAY_START, NULL);
isp_obj->file_data = audio_test.buff[!audio_test.buff_using];
audio_test.buff_data_size[!audio_test.buff_using] = 0;
isp_obj->auot_ack = 0;
} else if (audio_test.audio_state == 4) { /* play ing */
if (isp_obj->file_data == audio_test.buff[0])
audio_test.buff_data_size[0] = isp_obj->length;
else
audio_test.buff_data_size[1] = isp_obj->length;
/* non auto ack , audio callback */
isp_obj->auot_ack = 1;
}
}
// MSG("ISP_CALLBACK_RECEIVE_ACK_WAIT\r\n");
break;
case ISP_CALLBACK_RECEIVE_NACK_WAIT:
/* receive data err */
// MSG("ISP_CALLBACK_RECEIVE_NACK_WAIT\r\n");
isp_obj->auot_ack = 0; /* auto ack */
break;
case ISP_CALLBACK_SEND_ACK_WAIT:
/* receive data end,wait ack */
// MSG("ISP_CALLBACK_SEND_ACK_WAIT\r\n");
break;
case ISP_CALLBACK_SEND_SUCCES_ACK:
/* send ok,send file next data */
if (audio_test.audio_state == 11) {
/* Continue to the recording */
audio_test.audio_control(&audio_test, AUDIO_CMD_RECORD_START, NULL);
isp_obj_uart.file_data = audio_test.buff[!audio_test.buff_using];
isp_obj_uart.length = audio_test.buff_data_size[!audio_test.buff_using];
isp_uart_send_data(&isp_obj_uart);
audio_test.buff_data_size[!audio_test.buff_using] = 0;
audio_test.audio_state = 12;
}
// MSG("ISP_CALLBACK_SEND_SUCCES_ACK\r\n");
break;
case ISP_CALLBACK_SEND_ERROR_ACK:
/* send err,resend last data */
// MSG("ISP_CALLBACK_SEND_ERROR_ACK\r\n");
break;
case ISP_CALLBACK_CMD_:
// MSG("ISP_CALLBACK_CMD_\r\n");
switch (isp_obj->cmd_id) {
case CMD_PLAY_START: /* play */
if (audio_test.audio_state == 0)
audio_test.audio_state = 1;
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_SUCCES);
break;
case CMD_PLAY_PAUSE: /* pause */
// if (audio_test.audio_state == 3)
// audio_test.audio_state = 2;
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_SUCCES);
break;
case CMD_PLAY_STOP: /* stop */
if (audio_test.audio_state)
audio_test.audio_state = 0;
// device_close(i2s);
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_SUCCES);
break;
case CMD_VOLUME_INCREASE: /* volume +1 */
vol = audio_test.audio_control(&audio_test, AUDIO_CMD_GET_VOLUME, NULL);
if (vol >= 100)
vol = 99;
audio_test.audio_control(&audio_test, AUDIO_CMD_SET_VOLUME, (void *)(vol + 1));
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_SUCCES);
break;
case CMD_VOLUME_DECREASE: /* volume -1 */
vol = audio_test.audio_control(&audio_test, AUDIO_CMD_GET_VOLUME, NULL);
if (vol <= 0)
vol = 1;
audio_test.audio_control(&audio_test, AUDIO_CMD_SET_VOLUME, (void *)(vol - 1));
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_SUCCES);
break;
case CMD_VOLUME_SET: /* volume set */
vol = isp_obj->file_type;
if (vol <= 0)
vol = 0;
else if (vol >= 100)
vol = 100;
audio_test.audio_control(&audio_test, AUDIO_CMD_SET_VOLUME, (void *)vol);
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_SUCCES);
break;
case CMD_VOLUME_GET: /* volume get */
vol = audio_test.audio_control(&audio_test, AUDIO_CMD_GET_VOLUME, NULL);
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, (vol << 8) & 0xFF00);
break;
case CMD_SAMPLING_RATE: /* sampling_rate */
audio_test.record_config->sampl_freq = isp_obj->file_type;
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_SUCCES);
break;
case CMD_CHANNEL_NUM: /* channel */
audio_test.record_config->channel_num = isp_obj->file_type;
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_SUCCES);
break;
case CMD_RECORD_START: /* record */
if (audio_test.audio_state == 4 || /* play ing */
audio_test.audio_init(&audio_test, 1, isp_obj->file_data)) {
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_ERROR);
break;
}
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_SUCCES);
audio_test.audio_state = 10;
audio_test.audio_control(&audio_test, AUDIO_CMD_RECORD_START, NULL);
break;
case CMD_RECORD_STOP: /* stop record */
audio_test.audio_control(&audio_test, AUDIO_CMD_PLAY_STOP, NULL);
audio_test.audio_state = 10;
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_SUCCES);
break;
default:
isp_obj->status.isp_state_mode = NO_TASK;
isp_uart_send_ack(isp_obj, REPLY_SUCCES);
break;
}
break;
default:
MSG("unkown\r\n");
break;
}
}
int main(void)
{
/* Disable log output */
bflb_platform_print_set(1);
bflb_platform_init(0);
/* init audio */
// audio_init(&audio_test);
isp_wav_play_register(&audio_test);
audio_test.audio_control(&audio_test, AUDIO_CMD_SET_VOLUME, (void *)40);
/* init isp uart */
isp_uart_init(&isp_obj_uart);
isp_obj_uart.isp_callback = isp_uart_callback;
isp_obj_uart.file_data = audio_test.buff[!audio_test.buff_using];
while (1) {
bflb_platform_delay_ms(100);
/* code */
if (isp_obj_uart.status.isp_state_mode == NO_TASK) {
/* code */
}
}
}