首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效使用pa_simple应用编程接口

高效使用pa_simple应用编程接口
EN

Stack Overflow用户
提问于 2019-02-11 01:11:45
回答 1查看 191关注 0票数 0

我正在尝试使用pa_simple应用程序接口来更好地理解数字音频。我已经编写了一些代码来将自定义生成的音频数据提供给pulseaudio服务器:

代码语言:javascript
复制
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会生成一个简单的正弦波,如下所示:

代码语言:javascript
复制
uint16_t func(double time)
{   
    double op = sin(2*3.14*freq * time);
    return op * 100;
}

正如预期的那样,它会生成一个注释,但会占用我机器上50%的cpu,这是因为第一个代码块中存在不受限制的while循环。所以我试着这样修复它:

代码语言:javascript
复制
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连接的方式:

代码语言:javascript
复制
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
);
EN

回答 1

Stack Overflow用户

发布于 2019-02-11 01:28:58

这是程序中的一个错误。我将userFunc的输出存储在uint中,因此负值被截断。将其更改为int并删除sleep调用解决了这个问题,因为synchronous中的pa_simple api。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54633368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档