audio_demo/cap_test.cpp
2025-02-14 08:58:27 +08:00

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;
}