c语言调用PulseAudio播放音乐

2025-04-18  本文已影响0人  一路向后

1.源码实现

#include <pulse/simple.h>
#include <pulse/error.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main()
{
    //配置音频参数
    const pa_sample_spec ss = {
        .format = PA_SAMPLE_S16LE,
        .rate = 44100,
        .channels = 2
    };

    //创建PulseAudio简单连接
    pa_simple *s = NULL;
    int error;

    if (!(s=pa_simple_new(
        NULL,
        "Example",
        PA_STREAM_PLAYBACK,
        NULL,
        "Test Tone",
        &ss,
        NULL,
        NULL,
        &error
    )))
    {
        fprintf(stderr, "pa_simple_new failed: %s\n", pa_strerror(error));

        return 1;
    }

    //生成1秒440Hz正弦波
    const int duration_sec = 1;
    const int buf_size = ss.rate * duration_sec * pa_sample_size(&ss);
    int16_t *buffer = malloc(buf_size*sizeof(int16_t));
    const double freq = 440.0;
    int i;

    for (i=0; i<ss.rate * duration_sec; i++)
    {
        double t = (double)i / ss.rate;
        double val = sin(t * freq * 2 * M_PI) * 0.5;

        buffer[2*i] = buffer[2*i+1] = val * INT16_MAX;
    }

    //写入音频数据
    if (pa_simple_write(s, buffer, buf_size, &error) < 0)
    {
        fprintf(stderr, "pa_simple_write() failed: %s\n", pa_strerror(error));

        pa_simple_free(s);
        free(buffer);

        return 1;
    }

    //等待播放完成
    if (pa_simple_drain(s, &error) < 0)
    {
        fprintf(stderr, "pa_simple_drain failed: %s\n", pa_strerror(error));

        pa_simple_free(s);
        free(buffer);

        return 1;
    }

    //清理资源
    pa_simple_free(s);
    free(buffer);

    return 0;
}

2.编译源码

$ g++ -g -o pa_simple pa_simple.c -lpulse-simple -lpulse
上一篇 下一篇

猜你喜欢

热点阅读