PulseAudio를 사용하여 "실시간"으로 마이크 신호를 캡처하려고합니다. 이 프로그램은 C로 작성되었으며 PulseAudio Simple API를 사용합니다. 불행히도 요청한 오디오 버퍼에는 신호가 없습니다. 내 코드에 문제가 있거나 장치 소스가 인식되지 않습니다. gstreamer의 pulses 및 pulpink로 일부 프로그램을 테스트 해 보았습니다. 해야하는 코드가 작동하는 것 여기PulseAudio API - 마이크 신호 없음
parec -d alsa_input.usb-Creative_Technology_Ltd_Sound_Blaster_X-Fi_Go__Pro_00173634-00-Pro_1.analog-stereo | sox -t raw -r 44100 -sLb 16 -c 2 - /home/roos/Arbeitsfläche/pulsetest.wav
:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <math.h>
#include <pulse/simple.h>
#include <pulse/error.h>
#define BUFSIZE 1024
#define SAMPLE_BITS 16
/* A simple routine calling UNIX write() in a loop */
static ssize_t loop_write(int fd, const uint8_t *data, size_t size)
{
int i = 0;
for (i = 0; i < size; i += 2)
{
// put two bytes into one __signed__ integer
int16_t val = data[i] + ((uint32_t)data[i+1] << 8);
printf("%d", val);
}
return size;
}
int main(int argc, char*argv[])
{
char *device = "alsa_output.usb-Creative_Technology_Ltd_Sound_Blaster_X-Fi_Go__Pro_00173634-00-Pro_1.analog-stereo";
// The sample type to use
static const pa_sample_spec ss = {
.format = PA_SAMPLE_S16LE,
.rate = 44100,
.channels = 2
};
pa_simple *s = NULL;
int ret = 1;
int error;
// Create the recording stream
if (!(s = pa_simple_new(NULL, argv[0], PA_STREAM_RECORD, NULL, "record", &ss, NULL, NULL, &error))) {
fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error));
goto finish;
}
for (;;) {
uint8_t buf[BUFSIZE];
// Record some data ...
if (pa_simple_read(s, buf, sizeof(buf), &error) < 0) {
fprintf(stderr, __FILE__": pa_simple_read() failed: %s\n", pa_strerror(error));
goto finish;
}
// And write it to STDOUT
if (loop_write(STDOUT_FILENO, buf, sizeof(buf)) != sizeof(buf)) {
fprintf(stderr, __FILE__": write() failed: %s\n", strerror(errno));
goto finish;
}
}
ret = 0;
finish:
if (s)
pa_simple_free(s);
return 0;
}
을
parec -d alsa_input.usb-041e_30d3_121023000184-00-U0x41e0x30d3.analog-mono | sox -t raw -r 44100 -sLb 16 -c 2 - /home/roos/Arbeitsfläche/pulsetest.wav
및
내 두 번째 카드에이 일을 너무 : 나는 또한 또한 일 다음 명령을 테스트 메서드 "ssize_t loop_write"는 버퍼를 받고 16 비트 리틀 엔디안 바이트 배열이기 때문에 2 바이트를 하나의 16 비트 정수로 결합합니다. 이것은 진폭 (변수 "val"로 표시)이 0에서 32768 사이에 있어야 함을 의미합니다. 그러나 지금은 모두 0입니다. 따라서 두 가지 주요 관심사는 장치 소스 (더 가능성이 높음)와 정수 값.조언이 있으십니까? 미리 감사드립니다.
EDIT/UPDATE : 좋아, 나도 몰라 내가 무슨 짓을했는지 -하지만 난 이제 다음과 같은 메시지를 받고 있어요 특정 장치에 전달하는 경우 : 나는 그것이를 위해 일하고 NULL 전달하는 경우
pa_simple_new() failed: Connection refused
을 기본 사운드 카드. 이전에 설명한 명령 행 명령으로 계속 작업합니다. 이게 무슨 일인가?