2013-03-01 1 views
0

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 

을 기본 사운드 카드. 이전에 설명한 명령 행 명령으로 계속 작업합니다. 이게 무슨 일인가?

답변

0

좋아, 그냥 알아 냈어. 내게 어리석은 실수 야.

장치를 네 번째 함수 매개 변수 대신 첫 번째 함수 매개 변수로 전달했습니다.

그래서이

if (!(s = pa_simple_new(NULL, argv[0], PA_STREAM_RECORD, device, "record", &ss, NULL, NULL, &error))) 

대신

if (!(s = pa_simple_new(device, argv[0], PA_STREAM_RECORD, NULL, "record", &ss, NULL, NULL, &error))) 
의 수행
관련 문제