#include #include #include #include #include extern "C" { #include #include #include #include #include #include #include } 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::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( \ capName, params.c_str()); \ } while(0); using rkStreamPtr = std::shared_ptr;