#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>
#define FRAME_SIZE 480
int main() {
int err;
snd_pcm_t *capture_handle;
snd_pcm_t *playback_handle;
snd_pcm_hw_params_t *hw_params;
DenoiseState *st;
// 初始化RNNoise
st = rnnoise_create(NULL);
// 打开录音设备
if ((err = snd_pcm_open(&capture_handle, "hw:1,0", SND_PCM_STREAM_CAPTURE, 0)) < 0) {
fprintf(stderr, "无法打开录音设备: %s\n", snd_strerror(err));
return 1;
}
// 设置录音设备参数
snd_pcm_hw_params_alloca(&hw_params);
snd_pcm_hw_params_any(capture_handle, hw_params);
snd_pcm_hw_params_set_access(capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED);
snd_pcm_hw_params_set_format(capture_handle, hw_params, SND_PCM_FORMAT_S16_LE);
snd_pcm_hw_params_set_rate(capture_handle, hw_params, 48000, 0);
snd_pcm_hw_params_set_channels(capture_handle, hw_params, 1);
snd_pcm_hw_params(capture_handle, hw_params);
// 打开播放设备
if ((err = snd_pcm_open(&playback_handle, "hw:1,0", SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
fprintf(stderr, "无法打开播放设备: %s\n", snd_strerror(err));
return 1;
}
// 设置播放设备参数
snd_pcm_hw_params_any(playback_handle, hw_params);
snd_pcm_hw_params_set_access(playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED);
snd_pcm_hw_params_set_format(playback_handle, hw_params, SND_PCM_FORMAT_S16_LE);
snd_pcm_hw_params_set_rate(playback_handle, hw_params, 48000, 0);
snd_pcm_hw_params_set_channels(playback_handle, hw_params, 1);
snd_pcm_hw_params(playback_handle, hw_params);
int16_t buffer[FRAME_SIZE];
float float_buffer[FRAME_SIZE];
// 开始录音和播放
while (1) {
// 从录音设备读取音频数据
if ((err = snd_pcm_readi(capture_handle, buffer, FRAME_SIZE)) != FRAME_SIZE) {
if(err == -EPIPE){
snd_pcm_prepare(capture_handle);
}else{
fprintf(stderr, "读取音频数据错误: %s\n", snd_strerror(err));
break;
}
}
// 将处理后的音频数据写入播放设备
if ((err = snd_pcm_writei(playback_handle, buffer, FRAME_SIZE)) != FRAME_SIZE) {
if(err == -EPIPE){
snd_pcm_prepare(playback_handle);
}else{
fprintf(stderr, "播放音频数据错误: %s\n", snd_strerror(err));
break;
}
}
}
// 关闭设备并释放资源
snd_pcm_close(capture_handle);
snd_pcm_close(playback_handle);
rnnoise_destroy(st);
return 0;
}
修复在播放的时候提示 Broken pipe