Files
luckfox-eng29 8f34c2760d project:build.sh: Added fastboot support; custom modifications to U-Boot and kernel implemented using patches.
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>
2024-10-14 09:47:04 +08:00

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