一、基本概述
libpulse
是 PulseAudio 音频服务器的 C 语言客户端库,提供了一套 API 用于与 PulseAudio 进行音频数据的播放、录制和管理。PulseAudio 是一个跨平台的音频服务器,旨在提供高效、灵活的音频管理功能,使得不同应用程序可以共享音频资源。
libpulse官网:点击跳转
二、主要组件
- libpulse-simple:为应用程序提供“简单API”,是一个围绕libpulse的封装。
- libpulse:为应用程序提供“异步API”,通过Unix域或TCP流套接字上的“本地”协议与服务器通信。
- libpulsecommon:包含libpulsecore的一部分。
- libpulsecore:服务器库,为模块提供内部API,包含模块的共同环境和通用构建块。
- modules:服务器扩展,许多服务器功能都是通过模块实现的,包括网络协议、设备驱动程序、桌面集成等。
三、使用场景
- 音频播放和录制:libpulse提供了创建音频播放和录制流的API,允许应用程序播放和录制音频数据。
- 音频处理:通过PulseAudio服务器,libpulse支持复杂的音频处理操作,如混音、重采样等。
- 设备访问:应用程序可以通过libpulse访问和管理各种音频设备,包括声卡、USB音频设备等。
四、demo
//play
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <pulse/simple.h>
#include <pulse/error.h>
#define BUFSIZE 1024
int main(int argc, char *argv[])
{
/* The Sample format to use */
static const pa_sample_spec ss = {
.format = PA_SAMPLE_S16LE,
.rate = 44100,
.channels = 2
};
pa_simple *s = NULL;
int ret = 1;
int error;
/* replace STDIN with the specified file if needed */
if (argc > 1) {
int fd;
if ((fd = open(argv[1], O_RDONLY)) < 0) {
fprintf(stderr, __FILE__": open() failed: %s\n", strerror(errno));
goto finish;
}
if (dup2(fd, STDIN_FILENO) < 0) {
fprintf(stderr, __FILE__": dup2() failed: %s\n", strerror(errno));
goto finish;
}
close(fd);
}
/* Create a new playback stream */
if (!(s = pa_simple_new(NULL, argv[0], PA_STREAM_PLAYBACK, NULL, "playback", &ss, NULL, NULL, &error))) {
fprintf(stderr, __FILE__": pa_simple_new() failed: %s\n", pa_strerror(error));
goto finish;
}
for (;;) {
uint8_t buf[BUFSIZE];
ssize_t r;
#if 0
pa_usec_t latency;
if ((latency = pa_simple_get_latency(s, &error)) == (pa_usec_t) -1) {
fprintf(stderr, __FILE__": pa_simple_get_latency() failed: %s\n", pa_strerror(error));
goto finish;
}
fprintf(stderr, "%0.0f usec \r", (float)latency);
#endif
/* Read some data ... */
if ((r = read(STDIN_FILENO, buf, sizeof(buf))) <= 0) {
if (r == 0) /* EOF */
break;
fprintf(stderr, __FILE__": read() failed: %s\n", strerror(errno));
goto finish;
}
/* ... and play it */
if (pa_simple_write(s, buf, (size_t) r, &error) < 0) {
fprintf(stderr, __FILE__": pa_simple_write() failed: %s\n", pa_strerror(error));
goto finish;
}
}
/* Make sure that every single sample was played */
if (pa_simple_drain(s, &error) < 0) {
fprintf(stderr, __FILE__": pa_simple_drain() failed: %s\n", pa_strerror(error));
goto finish;
}
ret = 0;
finish:
if (s)
pa_simple_free(s);
return 0;
}
demo下载(含同步/异步放音+录音):点击跳转
qq群交流:698593923
觉得有帮助的话,打赏一下呗。。