libpulse介绍

一、基本概述

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

觉得有帮助的话,打赏一下呗。。

           

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值