62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
#include <iostream>
|
|
#include "alsa_dev.h"
|
|
#include "log/logger.h"
|
|
#include "common.h"
|
|
|
|
using namespace toolkit;
|
|
|
|
#define AUDIO_CHANNELS 2
|
|
#define AUDIO_RATE 44100
|
|
#define AUDIO_SAMPLES (10 * AUDIO_RATE / 1000)
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
if (argc < 2) {
|
|
fprintf(stderr, "usage: %s card_num \n", argv[0]);
|
|
}
|
|
int ret;
|
|
//初始化日志系统
|
|
Logger::Instance().add(std::make_shared<ConsoleChannel> ());
|
|
Logger::Instance().add(std::make_shared<FileChannel>());
|
|
Logger::Instance().setWriter(std::make_shared<AsyncLogWriter>());
|
|
|
|
int card = atoi(argv[1]);
|
|
alsa::Config alsaConfig;
|
|
sprintf(alsaConfig.device, "hw:%d,0", card);
|
|
InfoL << "open dev: " << alsaConfig.device;
|
|
alsaConfig.period_time = AUDIO_SAMPLES * 1000000 / AUDIO_RATE;
|
|
alsaConfig.buffer_time = 5 * alsaConfig.period_time;
|
|
alsaConfig.format = SND_PCM_FORMAT_S16_LE;
|
|
alsaConfig.rate = AUDIO_RATE;
|
|
alsaConfig.channels = AUDIO_CHANNELS;
|
|
alsa::AlsaDev usbCaptureDev;
|
|
if (usbCaptureDev.applyConfig(alsaConfig) < 0) {
|
|
PrintE("alsa config failed.\n");
|
|
return -1;
|
|
}
|
|
PrintI("alsa before init: %s\n", usbCaptureDev.configToString());
|
|
if (usbCaptureDev.init(SND_PCM_STREAM_CAPTURE) < 0) {
|
|
PrintE("alsa init failed.\n");
|
|
return -1;
|
|
}
|
|
PrintI("alsa init: %s\n", usbCaptureDev.configToString());
|
|
|
|
uint8_t *capData = nullptr;
|
|
int buffer_size = usbCaptureDev.getFrames() * usbCaptureDev.getFrameSize();
|
|
capData = (uint8_t *)malloc(buffer_size);
|
|
assert(capData);
|
|
|
|
FILE *cap_fp = fopen("/root/record.pcm", "wb");
|
|
while (true)
|
|
{
|
|
size_t read_size = usbCaptureDev.read(capData, buffer_size);
|
|
PrintI("alsa read %d\n", read_size);
|
|
if (read_size <= 0) {
|
|
msleep(1);
|
|
continue;
|
|
}
|
|
fwrite(capData, 1, buffer_size, cap_fp);
|
|
InfoL << "write data:" << read_size;
|
|
}
|
|
return 0;
|
|
} |