我正在尝试使用pa_simple应用程序接口来更好地理解数字音频。我已经编写了一些代码来将自定义生成的音频数据提供给pulseaudio服务器:
char buff[2];
while (playing) {
timePassed += periodMicros;
int val = userFunc(timePassed/1000000.0);
buff[0] = (val >> 0) & 0xff;
buff[1] = (val >> 1) & 0xff;
int error;
pa_simple_write(s, buff, 2, &error);
}func会生成一个简单的正弦波,如下所示:
uint16_t func(double time)
{
double op = sin(2*3.14*freq * time);
return op * 100;
}正如预期的那样,它会生成一个注释,但会占用我机器上50%的cpu,这是因为第一个代码块中存在不受限制的while循环。所以我试着这样修复它:
void _mainLoop() {
char buff[2*bufSize];
while (playing) {
for ( int i = 0; i < bufSize; i++ ) {
uint8_t word = userFunc(timePassed/1000000.0);
timePassed += periodMicros;
buff[i*2+0] = (word >> 0) & 0xff;
buff[i*2+1] = (word >> 1) & 0xff;
}
pa_simple_write(s, buff, 2*bufSize, &error);
this_thread::sleep_for(chrono::microseconds(bufSize*periodMicros));
}
}它修复了cpu的问题,但它产生的音频不再是一个完美的音符。它看起来音调有点高,有一种复古的感觉。
我想知道在不占用pa_simple代码的情况下使用cpu的正确方法。
请注意,即使我将bufSize更改为1并删除sleep行,第二个代码生成的声音也不会修复。
编辑:这是我初始化pulseaudio连接的方式:
pa_sample_spec ss = {
.format = PA_SAMPLE_S16LE,
.channels = 1,
.rate = 44100
};
s = pa_simple_new(
NULL,
"SYNTH",
PA_STREAM_PLAYBACK,
NULL,
"Music",
&ss,
NULL,
NULL,
NULL
);发布于 2019-02-11 01:28:58
这是程序中的一个错误。我将userFunc的输出存储在uint中,因此负值被截断。将其更改为int并删除sleep调用解决了这个问题,因为synchronous中的pa_simple api。
https://stackoverflow.com/questions/54633368
复制相似问题