繁体   English   中英

播放音频而不会冻结openGL中的绘制循环

[英]Playing audio without freezing draw loop in openGL

我正在使用openGL开发一个项目,它需要能够播放文件中的简单声音(mp3),同时又不中断绘制循环。

我一直在玩几个不同的库(openAL,portaudio),最终选择了mpg123(以加载mp3)和libao来播放mp3。

当前的playound函数可以工作,但会阻塞openGL绘制循环(即冻结游戏),直到音频播放完毕。 我尝试过弄乱std :: thread,但是它仍然阻塞了绘制循环。

这是我一直在测试的音频播放功能:

void playSound() {
    mpg123_handle *mh;
    unsigned char *buffer;
    size_t buffer_size;
    size_t done;
    int err;

    int driver;
    ao_device *dev;

    ao_sample_format format;
    int channels, encoding;
    long rate;

    /* initializations */
    ao_initialize();
    driver = ao_default_driver_id();
    mpg123_init();
    mh = mpg123_new(NULL, &err);
    buffer_size = mpg123_outblock(mh);
    buffer = (unsigned char*) malloc(buffer_size * sizeof(unsigned char));

    /* open the file and get the decoding format */
    mpg123_open(mh, "sounds/door.mp3");
    mpg123_getformat(mh, &rate, &channels, &encoding);

    /* set the output format and open the output device */
    format.bits = mpg123_encsize(encoding) * 8;
    format.rate = rate;
    format.channels = channels;
    format.byte_format = AO_FMT_NATIVE;
    format.matrix = 0;
    dev = ao_open_live(driver, &format, NULL);

    /* decode and play */
    while (mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK)
            ao_play(dev, (char*)buffer, done);

    /* clean up */
    free(buffer);
    ao_close(dev);
    mpg123_close(mh);
    mpg123_delete(mh);
    mpg123_exit();
    ao_shutdown();
}

我将如何解决此问题,使游戏继续平稳运行并在后台播放音频?

您应该解压缩少量音频数据,并每帧将其馈送到音频设备。 主要技巧是找出设备已经播放了多少个样本。 我不确定如何用libao做到这一点,但是使用OpenAL却很简单。

您可以在此处查看详细信息OpenAL库中的播放流

另外,您始终可以使用其他线程。 这将是多余的,但操作非常简单,并且可以在小型/演示项目中正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM