audio_demo/common.h
2025-02-14 08:58:27 +08:00

70 lines
2.4 KiB
C++

#include <alsa/asoundlib.h>
#include <chrono>
#include <easymedia/stream.h>
#include <easymedia/buffer.h>
#include <easymedia/utils.h>
extern "C" {
#include <libavformat/avformat.h>
#include <libavutil/time.h>
#include <libavutil/timestamp.h>
#include <libavutil/opt.h>
#include <libavutil/mathematics.h>
#include <libavutil/samplefmt.h>
#include <libswresample/swresample.h>
}
inline int free_memory(void *buffer) {
assert(buffer);
free(buffer);
return 0;
}
inline void msleep(int ms) {
std::this_thread::sleep_for(
std::chrono::milliseconds(ms));
}
// us
inline int64_t gettimeofday() {
std::chrono::microseconds us =
std::chrono::duration_cast<std::chrono::microseconds>(
std::chrono::system_clock::now().time_since_epoch());
return us.count();
}
#define TRIM(s, chars) \
do{ \
std::string map(0xFF, '\0'); \
for (auto &ch : chars) { \
map[(unsigned char &)ch] = '\1'; \
} \
while( s.size() && map.at((unsigned char &)s.back())) s.pop_back(); \
while( s.size() && map.at((unsigned char &)s.front())) s.erase(0,1); \
}while(0);
//去除前后的空格、回车符、制表符
inline std::string &trim(std::string &s, const std::string &chars) {
TRIM(s, chars);
return s;
}
//打开声卡设备
//dev_num: 声卡id; direction: capture/playback; streamPtr: 返回的设备指针(rkStreamPtr类型)
#define COMMON_STR(v) #v
#define RkStreamInit(dev_num, direction, sampleInfo, streamPtr) \
do { \
std::string params; \
const char *capName = COMMON_STR(alsa_##direction##_stream); \
char devName[20];\
sprintf(devName, "plughw:%d", dev_num);\
std::string fmtStr = SampleFmtToString(sampleInfo.fmt); \
int chns = sampleInfo.channels; \
int rate = sampleInfo.sample_rate; \
PARAM_STRING_APPEND(params, KEY_DEVICE, devName); \
PARAM_STRING_APPEND(params, KEY_SAMPLE_FMT, fmtStr); \
PARAM_STRING_APPEND_TO(params, KEY_CHANNELS, chns); \
PARAM_STRING_APPEND_TO(params, KEY_SAMPLE_RATE, rate); \
printf("params:\n%s\n", params.c_str()); \
streamPtr = easymedia::REFLECTOR(Stream)::Create<easymedia::Stream>( \
capName, params.c_str()); \
} while(0);
using rkStreamPtr = std::shared_ptr<easymedia::Stream>;