8f34c2760d
project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp: Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem. sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately. sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades. sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for fastboot. Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
192 lines
5.7 KiB
C++
192 lines
5.7 KiB
C++
// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "audio_api.h"
|
|
#include "common.h"
|
|
|
|
namespace rockchip {
|
|
namespace cgi {
|
|
|
|
#ifdef USE_RKIPC
|
|
|
|
nlohmann::json audio_get_param(int stream_id) {
|
|
nlohmann::json param;
|
|
param.emplace("id", stream_id);
|
|
|
|
char *tmp = new char[256];
|
|
|
|
int value = 0;
|
|
|
|
rk_audio_get_bit_rate(stream_id, &value);
|
|
param.emplace("iBitRate", value);
|
|
|
|
rk_audio_get_sample_rate(stream_id, &value);
|
|
param.emplace("iSampleRate", value);
|
|
|
|
rk_audio_get_volume(stream_id, &value);
|
|
param.emplace("iVolume", value);
|
|
|
|
rk_audio_get_enable_vqe(stream_id, &value);
|
|
if (value)
|
|
param.emplace("sVQE", "open");
|
|
else
|
|
param.emplace("sVQE", "close");
|
|
|
|
rk_audio_get_encode_type(stream_id, &tmp);
|
|
param.emplace("sEncodeType", tmp);
|
|
delete[] tmp;
|
|
|
|
param.emplace("sInput", "micIn");
|
|
|
|
return param;
|
|
}
|
|
|
|
int audio_set_param(int stream_id, nlohmann::json param) {
|
|
int value_int;
|
|
std::string value;
|
|
|
|
if (param.dump().find("iBitRate") != param.dump().npos) {
|
|
value_int = atoi(param.at("iBitRate").dump().c_str());
|
|
rk_audio_set_bit_rate(stream_id, value_int);
|
|
}
|
|
if (param.dump().find("iSampleRate") != param.dump().npos) {
|
|
value_int = atoi(param.at("iSampleRate").dump().c_str());
|
|
rk_audio_set_sample_rate(stream_id, value_int);
|
|
}
|
|
if (param.dump().find("iVolume") != param.dump().npos) {
|
|
value_int = atoi(param.at("iVolume").dump().c_str());
|
|
rk_audio_set_volume(stream_id, value_int);
|
|
}
|
|
if (param.dump().find("sVQE") != param.dump().npos) {
|
|
value = param.at("sVQE").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
if (!strcmp(value.c_str(), "open"))
|
|
rk_audio_set_enable_vqe(stream_id, 1);
|
|
else
|
|
rk_audio_set_enable_vqe(stream_id, 0);
|
|
}
|
|
if (param.dump().find("sEncodeType") != param.dump().npos) {
|
|
value = param.at("sEncodeType").dump();
|
|
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
|
|
rk_audio_set_encode_type(stream_id, value.c_str());
|
|
}
|
|
rk_audio_restart();
|
|
|
|
return 0;
|
|
}
|
|
|
|
void AudioApiHandler::handler(const HttpRequest &Req, HttpResponse &Resp) {
|
|
nlohmann::json content;
|
|
#ifdef ENABLE_JWT
|
|
int user_level = Req.UserLevel;
|
|
#endif
|
|
if (Req.Method == "GET") {
|
|
content = audio_get_param(0);
|
|
Resp.setHeader(HttpStatus::kOk, "OK");
|
|
Resp.setApiData(content);
|
|
} else if ((Req.Method == "POST") || (Req.Method == "PUT")) {
|
|
#ifdef ENABLE_JWT
|
|
if (user_level > 1) {
|
|
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
|
|
return;
|
|
}
|
|
#endif
|
|
nlohmann::json audio_config = Req.PostObject; /* must be json::object */
|
|
/* Erase unchanged data */
|
|
nlohmann::json cfg_old = audio_get_param(0);
|
|
nlohmann::json diff = nlohmann::json::diff(cfg_old, audio_config);
|
|
for (auto &x : nlohmann::json::iterator_wrapper(cfg_old)) {
|
|
if (diff.dump().find(x.key()) == diff.dump().npos)
|
|
audio_config.erase(x.key());
|
|
}
|
|
|
|
/* set */
|
|
if (!audio_config.empty())
|
|
audio_set_param(0, audio_config);
|
|
|
|
/* get new info */
|
|
content = audio_get_param(0);
|
|
Resp.setHeader(HttpStatus::kOk, "OK");
|
|
Resp.setApiData(content);
|
|
} else {
|
|
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
|
|
}
|
|
}
|
|
|
|
#else // USE_RKIPC
|
|
|
|
static void audio_setting_item_set(nlohmann::json config, int id) {
|
|
if (!config.empty()) {
|
|
nlohmann::json setting_config = config;
|
|
if (setting_config.dump().find("id") != setting_config.dump().npos)
|
|
setting_config.erase("id");
|
|
mediaserver_set((char *)TABLE_AUDIO, id,
|
|
(char *)setting_config.dump().c_str());
|
|
}
|
|
}
|
|
|
|
void AudioApiHandler::handler(const HttpRequest &Req, HttpResponse &Resp) {
|
|
#ifdef ENABLE_JWT
|
|
int user_level = Req.UserLevel;
|
|
#endif
|
|
if (Req.Method == "GET") {
|
|
nlohmann::json content;
|
|
char *str = dbserver_audio_get();
|
|
nlohmann::json audio_config = nlohmann::json::parse(str).at("jData");
|
|
int pos_first = Req.PathInfo.find_first_of("/");
|
|
int pos_last = Req.PathInfo.find_last_of("/");
|
|
|
|
if (pos_first != pos_last)
|
|
content = audio_config.at(0);
|
|
else
|
|
content = audio_config;
|
|
|
|
Resp.setHeader(HttpStatus::kOk, "OK");
|
|
Resp.setApiData(content);
|
|
} else if ((Req.Method == "POST") || (Req.Method == "PUT")) {
|
|
#ifdef ENABLE_JWT
|
|
if (user_level > 1) {
|
|
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
|
|
return;
|
|
}
|
|
#endif
|
|
nlohmann::json content = nlohmann::json::array();
|
|
nlohmann::json audio_config = Req.PostObject; /* must be json::object */
|
|
int id = 0;
|
|
int pos_first = Req.PathInfo.find_first_of("/");
|
|
int pos_last = Req.PathInfo.find_last_of("/");
|
|
|
|
if (pos_first != pos_last)
|
|
id = atoi(Req.PathInfo.substr(pos_last + 1, Req.PathInfo.size()).c_str());
|
|
|
|
/* Erase unchanged data */
|
|
char *prev = dbserver_audio_get();
|
|
nlohmann::json cfg_old = nlohmann::json::parse(prev).at("jData");
|
|
nlohmann::json diff = nlohmann::json::diff(cfg_old.at(id), audio_config);
|
|
for (auto &x : nlohmann::json::iterator_wrapper(cfg_old.at(id))) {
|
|
if (diff.dump().find(x.key()) == diff.dump().npos)
|
|
audio_config.erase(x.key());
|
|
}
|
|
|
|
/* set */
|
|
if (!audio_config.empty())
|
|
dbserver_audio_set((char *)audio_config.dump().c_str());
|
|
audio_setting_item_set(audio_config, id);
|
|
|
|
/* get new info */
|
|
char *str = dbserver_audio_get();
|
|
audio_config = nlohmann::json::parse(str).at("jData");
|
|
content = audio_config.at(id);
|
|
Resp.setHeader(HttpStatus::kOk, "OK");
|
|
Resp.setApiData(content);
|
|
} else {
|
|
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
} // namespace cgi
|
|
} // namespace rockchip
|