70 lines
2.4 KiB
C++
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>; |