Browse Source

添加录音程序

master
zhaohe 3 years ago
parent
commit
36e04c945f
  1. 3
      .vscode/settings.json
  2. 48
      CMakeLists.txt
  3. 2
      dep/iflytopcpp
  4. 24
      sh/envsetup_rk3328.sh
  5. 2
      sh/iflytool.sh
  6. 2
      sh/packet.sh
  7. 59
      src/audio_recorder.cpp
  8. 50
      src/main.cpp
  9. 46
      src/zmain.hpp

3
.vscode/settings.json

@ -86,6 +86,7 @@
"__functional_base_03": "cpp",
"__hash_table": "cpp",
"__tree": "cpp",
"__tuple": "cpp"
"__tuple": "cpp",
"*.ipp": "cpp"
}
}

48
CMakeLists.txt

@ -10,6 +10,9 @@ set(CMAKE_INSTALL_PREFIX "./")
include(zcmake/zcmake.cmake)
project(app)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
#
set(C_CPP_FLAGS "${C_CPP_FLAGS} ")
set(C_CPP_FLAGS
@ -43,23 +46,46 @@ include(dep/zservice_container/module.cmake)
include(dep/zwebservice/module.cmake)
include(dep/zlinuxcomponents/module.cmake)
zadd_executable(
function(zadd_executable_simple)
set(oneValueArgs NAME TARGET)
set(multiValueArgs SRC)
cmake_parse_arguments(VAR "${options}" "${oneValueArgs}" "${multiValueArgs}"
${ARGN})
zadd_executable(
TARGET
${VAR_TARGET}
INSTALL
./app
LINK_LIBRARIES
asound
pthread
INCLUDE_DIRECTORIES
${DEP_INCLUDE}
./src
DEFINES
${DEP_DEFINE}
SRC
${DEP_SRC}
${VAR_SRC})
endfunction(zadd_executable_simple)
zadd_executable_simple(
# TARGET
TARGET
app.out
INSTALL
./app
LINK_LIBRARIES
pthread
INCLUDE_DIRECTORIES
${DEP_INCLUDE}
./src
DEFINES
${DEP_DEFINE}
# SRC
SRC
${DEP_SRC}
src/main.cpp
src/service/device_io_service.cpp
src/service/device_io_service_mock.cpp
src/service/main_control_service.cpp
src/service/light_control_service.cpp
src/service/report_service.cpp)
zadd_executable_simple(
# TARGET
TARGET #
audio_recorder.out
# SRC
SRC
src/audio_recorder.cpp)

2
dep/iflytopcpp

@ -1 +1 @@
Subproject commit ea4118ddeb8238ccc065a2c11237ad7be056f89e
Subproject commit 2ae150407bb2beb45b2d3155a114992bdb59798e

24
sh/envsetup_rk3328.sh

@ -1,11 +1,27 @@
#!/bin/bash
# 下载编译器
cd ${PROJECT_PATH}/build
wget -c "ftp://zftpuser:zftpzwsd@192.168.1.2/zwsd/gnu_gcc_release/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.gz"
tar -xvf "gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.gz"
wget -c "192.168.1.2:8021/sdk_firefly_rk3328_v2.5.1/buildtools/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.gz"
rm -rf gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu
tar -xvf gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.gz
BUILD_TOOLS_PATH=${PROJECT_PATH}/build/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/
# alsa 支持
wget -c "192.168.1.2:8021/sdk_firefly_rk3328_v2.5.1/buildtools/libasound2_dev1.1.3-5ubuntu0.6.tar.gz"
rm -rf libasound2_dev1.1.3-5ubuntu0.6
tar -xvf libasound2_dev1.1.3-5ubuntu0.6.tar.gz
mkdir -p ${BUILD_TOOLS_PATH}/pkgconfig/
mkdir -p ${BUILD_TOOLS_PATH}/include/sys/
mv libasound2_dev1.1.3-5ubuntu0.6/unpack/usr/lib/aarch64-linux-gnu/libasound.* ${BUILD_TOOLS_PATH}/lib/
mv libasound2_dev1.1.3-5ubuntu0.6/unpack/usr/lib/aarch64-linux-gnu/pkgconfig/alsa.pc ${BUILD_TOOLS_PATH}/pkgconfig/
mv libasound2_dev1.1.3-5ubuntu0.6/unpack/usr/include/alsa ${BUILD_TOOLS_PATH}/include/
mv libasound2_dev1.1.3-5ubuntu0.6/unpack/usr/include/sys/* ${BUILD_TOOLS_PATH}/include/sys/
# 构造build.sh
echo "cmake ../ \\" >${PROJECT_PATH}/build/build.sh
echo "-DCMAKE_C_COMPILER=${PROJECT_PATH}/build/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc \\" >>${PROJECT_PATH}/build/build.sh
echo "-DCMAKE_CXX_COMPILER=${PROJECT_PATH}/build/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ \\" >>${PROJECT_PATH}/build/build.sh
echo "-DCMAKE_C_COMPILER=ccache ${PROJECT_PATH}/build/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc \\" >>${PROJECT_PATH}/build/build.sh
echo "-DCMAKE_CXX_COMPILER=ccache ${PROJECT_PATH}/build/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ \\" >>${PROJECT_PATH}/build/build.sh
chmod +x ${PROJECT_PATH}/build/build.sh

2
sh/iflytool.sh

@ -38,7 +38,7 @@ function do_flashapp_to_targetboard() {
ssh ${TARGET_USER}@${IP} "killall app.out"
set -e
# 拷贝目标程序
scp -r ${PROJECT_PATH}/build/app/app.out ${TARGET_USER}@${IP}:/app/
scp -r ${PROJECT_PATH}/build/app/*.out ${TARGET_USER}@${IP}:/app/
}
function do_flashwebapp_to_targetboard() {

2
sh/packet.sh

@ -43,7 +43,7 @@ cd $PROJECT_PATH/build
# ./build.sh && make -j8 && make install
#2.打包APP
cp $PROJECT_PATH/build/app/app.out $PACKET_DIR/
cp $PROJECT_PATH/build/app/*.out $PACKET_DIR/
#3.3 打包webapp
cp -rf $PROJECT_PATH/webapp $PACKET_DIR/

59
src/audio_recorder.cpp

@ -0,0 +1,59 @@
#include "zmain.hpp"
//
#include "configs/config.hpp"
#include "iflytopcpp/core/spdlogfactory/logger.hpp"
#include "iflytopcpp/core/thread/thread.hpp"
#include "spdlog/spdlog.h"
#include "version.hpp"
#include "zlinuxcomponents/audio/audio_recoder.hpp"
#include "zlinuxcomponents/rootfs_auto_update.hpp"
#include "zservice_container/zservice_container.hpp"
//
using namespace iflytop;
using namespace core;
using namespace std;
using namespace clipp;
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/
ZMAIN();
/**
* @brief ctrl+C
*/
ofstream outputwav("audio_recorder.wav", ios::binary | ios::trunc);
void Main::onSIGINT() {
logger->info("save audio to {}", "audio_recorder.wav");
exit(0);
}
int Main::main(int argc, char *argv[]) {
string g_host_server_ip;
string g_device_id;
int channel = 0;
int rate = 0;
#if 1
auto cli = ( //
(required("-c") & value("c", channel)).doc("channel"), //
(required("-r") & value("r", rate)).doc("rate") //
);
if (!parse(argc, argv, cli)) {
cout << make_man_page(cli, argv[0]);
exit(-1);
}
#endif
shared_ptr<AudioRecoder> audioRecoder(new AudioRecoder());
audioRecoder->onRecordData.connect([&](shared_ptr<AudioClip> audioclip) {
logger->info("on audio {}", audioclip->toString());
// 保存语音到文件
outputwav.write((char *)audioclip->getVoice(), audioclip->getVoiceLen());
});
audioRecoder->initialize("recorder", channel, rate, SND_PCM_FORMAT_S16_LE);
audioRecoder->startRecord();
logger->info("system setup end.");
while (true) sleep(1000);
}

50
src/main.cpp

@ -1,9 +1,11 @@
#include "zmain.hpp"
//
#include "configs/config.hpp"
#include "iflytopcpp/core/spdlogfactory/logger.hpp"
#include "iflytopcpp/core/thread/thread.hpp"
#include "spdlog/spdlog.h"
#include "version.hpp"
#include "zclipp/include/clipp.h"
#include "zlinuxcomponents/rootfs_auto_update.hpp"
#include "zservice_container/zservice_container.hpp"
#include "zwebservice/zwebservice.hpp"
@ -14,47 +16,19 @@
#include "service/main_control_service.hpp"
#include "service/report_service.hpp"
//
#include "dirent.h"
#include "zlinuxcomponents/audio/audio_recoder.hpp"
//
using namespace iflytop;
using namespace core;
using namespace std;
using namespace clipp;
class Main {
ENABLE_LOGGER(Main);
private:
unique_ptr<Thread> thread;
private:
int main(int argc, char *argv[]);
public:
Main(/* args */) {}
~Main() {}
void run(int argc, char *argv[]) {
thread.reset(new Thread("main", [&]() { exit(main(argc, argv)); }));
while (true) sleep(1000);
}
};
int main(int argc, char *argv[]) {
Main main;
main.run(argc, argv);
}
#define BUILD_AND_REG_SERRVICE(type, ...) \
logger->info("build {}.....", #type); \
shared_ptr<type> type##_val(new type(__VA_ARGS__)); \
ServiceContrainer::get().regService(type##_val);
#define BUILD_AND_REG_MOCK_SERRVICE(type, mocktype, ...) \
logger->info("build {}.....", #type); \
shared_ptr<type> type##_val(new mocktype(__VA_ARGS__)); \
ServiceContrainer::get().regService(type##_val);
ZMAIN();
/***********************************************************************************************************************
* =======================================================Main======================================================== *
***********************************************************************************************************************/
void Main::onSIGINT() { exit(0); }
int Main::main(int argc, char *argv[]) {
string g_host_server_ip;
string g_device_id;
@ -81,13 +55,12 @@ int Main::main(int argc, char *argv[]) {
GET_SERVICE(Config)->initialize();
if (!g_device_id.empty()) GET_SERVICE(Config)->set_deviceId(g_device_id);
/**
* @brief rootfs目录中的文件和系统中对应路径的文件是否一致
*
*
*
* ./rootfs/etc/asound.conf /etc/asound.conf
*
*
*/
auto rootfsAutoUpdate = make_shared<RootfsAutoUpdate>();
rootfsAutoUpdate->compareAndReplace();
@ -98,6 +71,9 @@ int Main::main(int argc, char *argv[]) {
// system("reboot");
}
// AudioRecoder::get().initialize();
shared_ptr<AudioRecoder> audioRecoder(new AudioRecoder());
#if 0
BUILD_AND_REG_SERRVICE(DeviceIOService);
#else

46
src/zmain.hpp

@ -0,0 +1,46 @@
#include <pthread.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include "zclipp/include/clipp.h"
#define ZMAIN() \
class Main { \
ENABLE_LOGGER(Main); \
\
private: \
unique_ptr<Thread> thread; \
\
private: \
int main(int argc, char *argv[]); \
\
public: \
Main(/* args */) {} \
~Main() {} \
void run(int argc, char *argv[]) { \
thread.reset(new Thread("main", [&]() { exit(main(argc, argv)); })); \
while (true) sleep(1000); \
} \
void onSIGINT(); \
}; \
Main *g_main; \
void onsignal(int signo) { g_main->onSIGINT(); } \
int main(int argc, char *argv[]) { \
Main main; \
g_main = &main; \
::signal(SIGINT, onsignal); \
main.run(argc, argv); \
}
#define BUILD_AND_REG_SERRVICE(type, ...) \
logger->info("build {}.....", #type); \
shared_ptr<type> type##_val(new type(__VA_ARGS__)); \
ServiceContrainer::get().regService(type##_val);
#define BUILD_AND_REG_MOCK_SERRVICE(type, mocktype, ...) \
logger->info("build {}.....", #type); \
shared_ptr<type> type##_val(new mocktype(__VA_ARGS__)); \
ServiceContrainer::get().regService(type##_val);
Loading…
Cancel
Save