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
网友评论