PulseAudio を使用して「リアルタイム」でマイク信号をキャプチャしようとしています。このプログラムは C で書かれており、PulseAudio Simple API を使用しています。残念ながら、リクエストしたオーディオ バッファには信号が含まれていません。コードに問題があるか、デバイス ソースが認識されません。gstreamer の pulsesrc と pulsesink を使用して、プログラムの外部でいくつかのテストを実行しましたが、うまくいきました。また、次のコマンドもテストしましたが、これも機能しました。
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
私の2番目のカードでも機能しました:
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;
}
メソッド「ssize_t loop_write」はバッファを受け取ります。これは 16 ビットのリトル エンディアン バイト配列であるため、2 バイトを 1 つの符号付き 16 ビット整数に結合します。これは、振幅 (変数「val」で表される) が 0 から 32768 の間である必要があることを意味します。整数値。
それについて何かアドバイスはありますか?前もって感謝します!
編集/更新:わかりました、何をしたかわかりませんが、特定のデバイスを渡すと、次のメッセージが表示されます:
pa_simple_new() failed: Connection refused
NULL を渡すと、デフォルトのサウンドカードで機能します。以前に説明したコマンド ライン コマンドを引き続き使用します。これが何であるかについての手がかりはありますか?