linux播放到设备,linux - 将字节流式传输到ALSA播放设备 - 堆栈内存溢出

我在使用libasound将随机字节写入ALSA播放设备时遇到了很多麻烦。 最终,我的目标是能够通过网络路由回放流并让它在远程设备上播放。

此问题中提供的代码将WAV文件读入内存并通过snd_pcm_writei将其写入驱动程序并且可以正常工作。 但是,这段代码与我正在尝试做的事情之间的关键区别在于我没有立即获得所有数据。 我希望在数据可用时对其进行流式处理。

调整上面的示例代码以满足我的需求,我最终得到了这样的结论:

#include

#include

#include

static snd_pcm_t *PlaybackHandle;

int init_playback(const char *device, int samplerate, int channels) {

int err;

printf("Init parameters: %s %d %d\n", device, samplerate, channels);

if((err = snd_pcm_open(&PlaybackHandle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {

printf("Can't open audio %s: %s\n", device, snd_strerror(err));

return -1;

}

if ((err = snd_pcm_set_params(PlaybackHandle, SND_PCM_FORMAT_S16, SND_PCM_ACCESS_RW_INTERLEAVED, channels, samplerate, 1, 500000)) < 0) {

printf("Can't set sound parameters: %s\n", snd_strerror(err));

return -1;

}

return 0;

}

int play_bytes(const void *bytes, int len) {

snd_pcm_uframes_t frames, count;

snd_pcm_uframes_t bufsize, period_size;

frames = 0;

count = 0;

snd_pcm_prepare(PlaybackHandle);

snd_pcm_get_params(PlaybackHandle, &bufsize, &period_size);

printf("bufsize=%d\n", (int) bufsize);

do {

int remaining = len - count;

int buflen = remaining < bufsize ? remaining : bufsize;

frames = snd_pcm_writei(PlaybackHandle, bytes + count, buflen);

// If an error, try to recover from it

if (frames == -EPIPE) {

printf("EPIPE\n");

snd_pcm_prepare(PlaybackHandle);

}

if (frames < 0) {

printf("Recovering\n");

frames = snd_pcm_recover(PlaybackHandle, frames, 0);

}

if (frames < 0)

{

printf("Error playing wave: %s\n", snd_strerror(frames));

break;

}

// Update our pointer

count += frames;

//printf("count=%d len=%d\n", (int)count, len);

} while (count < len);

// Wait for playback to completely finish

if (count == len)

snd_pcm_drain(PlaybackHandle);

return 0;

}

int close_playback() {

snd_pcm_close(PlaybackHandle);

return 0;

}

int main(int argc, char **argv) {

if(argc < 1) {

printf("Usage: %s \n", argv[0]);

return -1;

}

int fd;

unsigned long long len;

fd = open(argv[1], O_RDONLY);

// Find the length

len = lseek(fd, 0, SEEK_END);

// Skip the first 44 bytes (header)

lseek(fd, 44, SEEK_SET);

len -= 44;

char *data = malloc(len);

read(fd, data, len);

init_playback("default", 44100, 2);

play_bytes(data, len);

close_playback();

return 0;

}

这段代码可以用gcc playback.c -o playback -lasound 。 我正在使用的WAV文件可以在这里找到。

当我运行此代码片段时,我根据bufsize对输入数据进行分块,根据块大小,在播放中会重复播放音频片段。 较大的块大小产生的重复次数少于小块大小。 将此与音频的声音结合起来,我相信在每个块的末尾都会重复一个小片段。

我使用的参数是:

样本:44100

频道:2

为什么一次性发送整个WAV文件工作,而发送它的块不起作用? 如何将音频数据块发送给驱动程序并使其正常播放?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue实现一个带搜索功能的列表_(Vue起步)2.模板指令:v-for / v-on / v-model

①公众号&#xff1a;王酱酱记②记录跟着文档学习Vue的一些关键点&#xff0c;持续更新。感兴趣的小白建议关注一下③Vue当中有几个常见的指令&#xff0c;看看是怎么用的&#xff0c;强烈建议你自己在编辑器里打一遍&#xff0c;你就更明白Vue为什么是数据驱动型的一款框架啦&…

python读取windows日志_Python解析windows系统日志文件

DOM是Document Object Model的简称&#xff0c;XML 文档的高级树型表示。该模型并非只针对 Python&#xff0c;而是一种普通XML 模型。Python 的 DOM 包是基于 SAX 构建的&#xff0c;并且包括在 Python 2.0 的标准 XML 支持里。参考博客&#xff1a;python网络编程学习笔记&am…

linux安装mysql5.5.52,Linux系统上安装MySQL 5.5prm

RapidXML 试用近半年来断断续续的封装一些SDK,在兼顾跨平台.易用性和高效率上还要顾及到对外dll的大小问题.由于之前解析SVG文件的用到了一个XML解析库xercesc,这个DLL实在巨大近4M,于是尝试用新的X ...ios数据库1. ios数据库管理软件 ios使用的数据库是sqlite 管理软件有2种, …

python numpy库安装winerror5_详解idea从git上拉取maven项目详细步骤

刚从Eclipse转Intellij,对于它的各种操作也是一脸懵逼&#xff0c;但觉得使用起来还不错&#xff0c;今天就说一下我用Idea导入git中的Maven项目的详细步骤&#xff1a; 1. 首先打开Intellji Idea,选择check out from Version Control,选择Git(图片上选到gitHub了&#xff0c;抱…

python 函数例子_Python3函数之例子

1.分别使用递归、循环和生成器求菲波那切数列递归&#xff1a;def fib_rec(n):if n 0:return 1if n 1:return 1return fib_rec(n-1) fib_rec(n-2)fib_rec(5)循环&#xff1a;def fib_loop(n):lst []for i in range(n1):if i 0 or i 1:lst.append(1)else:lst.append(lst[-…

java jcsh执行linux命令,java jcsh执行linux命令

java jcsh执行linux命令[2021-02-03 01:26:29] 简介:php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff…

python目标检测答案_入门指南:用Python实现实时目标检测(内附代码)

全文共6821字&#xff0c;预计学习时长20分钟 来源&#xff1a;Pexels 从自动驾驶汽车检测路上的物体&#xff0c;到通过复杂的面部及身体语言识别发现可能的犯罪活动。多年来&#xff0c;研究人员一直在探索让机器通过视觉识别物体的可能性。 这一特殊领域被称为计算机视觉 (C…

sql md5函数_【学习笔记】常见漏洞:SQL注入的利用与防御

第 21 课 SQL注入的利用与防御课程入口(付费)个人背景李&#xff0c;本科&#xff0c;电子信息工程专业&#xff0c;毕业一年半&#xff0c;有JavaScript的&#xff0c;PHP&#xff0c;Python的语言基础&#xff0c;目前自学网络安全中。SQL注入的利用与防御01 SQL盲注1.1 S…

管理linux的快捷键,Linux快捷键及系统管理命令(1)

快捷键&#xff1a;ctrlU&#xff1a;快速删除光标前所有字符内容。ctrlK&#xff1a;快速删除从当前光标到行尾的所有字符内容。ctrlL&#xff1a;快速清空当前屏幕中显示的内容&#xff0c;只在左上角显示命令提示符。ctrlC&#xff1a;取消当前命令行的编辑&#xff0c;并切…

docker -v 覆盖了容器中的文件_浅谈docker中宿主机和容器之间互相copy文件的两种方式,欢迎补充...

在dokcer的日常使用过程中&#xff0c;我们可能会遇到将宿主机内文件/目录copy到容器内&#xff0c;或者将容器的文件/目录copy到宿主机中&#xff0c;下面我们就来简单的谈一下关于这种情况的两种操作。1、Docker cp命令&#xff1a;用于容器与主机之间的数据copy语法&#xf…

线性代数第九版pdf英文_斯坦福CS229机器学习课程的数学基础(线性代数)翻译完成...

文章转载自公众号 机器学习初学者 &#xff0c; 作者 机器学习初学者Stanford cs229 manchine learning课程&#xff0c;相比于Coursera中的机器学习有更多的数学要求和公式的推导&#xff0c;课程全英文&#xff0c;基础材料部分还没有翻译。这个基础材料主要分为线性代数和概…

用python读取股票价格_Python读取文件并给出股票价格

我使用的是ystockquote&#xff0c;可以找到here。基本上&#xff0c;我有一个包含我所有股票符号的文件&#xff0c;然后我用python将其笔下并显示每只股票的价格。以下是我目前为止的代码&#xff1a;import ystockquote def intro(): # Here you enter the name of your fil…

ppc linux 性能,用profile和oprofile监视视linux性能!

profile使用&#xff1a;profile功能是架构无关的&#xff0c;可以用来监视linux内核的4项功能&#xff0c;即&#xff1a;11 #define CPU_PROFILING 112 #define SCHED_PROFILING 213 #define SLEEP_PROFILING 314 #define KVM_PROFILING 4要想找开profile功能&#xff0c…

bisect git 使用_Git使用过程中的一些常见场景问题总结

之前在公司内部推Git&#xff0c;写了一份git使用教程&#xff0c;后来又在团队内部做了一次分享&#xff0c;内容是关于Git使用过程中经常会遇到的一些场景&#xff0c;并有了这份总结。git基础基于feature的工作流添加忽略文件 .gitignore (http://gitignore.io/)基于develop…

c 多文件全局变量_C语言开发单片机为什么大多数都采用全局变量的形式?

点击上方蓝字关注我哦&#xff5e;01前言全局变量简直就是嵌入式系统的戈兰高地。冲突最激烈的双方是1. 做控制的工程师 2. 做非嵌入式的软件工程师。02做控制的工程师特点他们普遍的理解就是“变量都写成全局该有多方便”。我之前面试过一个非常有名的做控制实验室里出来的PhD…

linux耳机插拔检测,Android应用开发之耳机插拔处理两种方式

本文将带你了解Android应用开发[RK3288][Android6.0] 耳机插拔处理两种方式&#xff0c;希望本文对大家学Android有所帮助。[RK3288][Android6.0] 耳机插拔处理两种方式。Platform: RockchipOS: Android 6.0Kernel: 3.10.92系统对耳机插拔处理的方式有两种&#xff0c;一种…

医学图像处理_专刊征稿|医学图像处理中的认知计算

认知科学是20世纪世界科学标志性的新兴研究门类&#xff0c;它作为探究人脑或心智工作机制的前沿性尖端学科&#xff0c;已经引起了全世界科学家们的广泛关注。认知计算代表一种全新的计算模式&#xff0c;它包含信息分析&#xff0c;自然语言处理和机器学习领域的大量技术创新…

python 如何判断一个函数执行完成_Python 函数为什么会默认返回 None?

&#x1f446; “Python猫” &#xff0c;一个值得加星标的公众号Python 有一项默认的做法&#xff0c;很多编程语言都没有——它的所有函数都会有一个返回值&#xff0c;不管你有没有写 return 语句。 本文出自“Python为什么”系列&#xff0c;在正式开始之前&#xff0c;我们…

中美线径对照表_中国线径与英美德线规对照表

德DIN*线径(mm)实际截面(mm2)标准截面(mm2)线号线径(mm)线号线径(mm)线径(mm)7/012.712.56/011.7854/011.68411.298.52001005/010.9733/010.40411.21078.5400804/010.1610963.6200633/09.4492/09.26692/08.839850.27005008.2308.253817.627.139.59004027.0117.3487.16.331.1700…

不在 sudoers 文件中。此事将被报告_快餐包装中检出致癌物质?麦当劳、汉堡王回应!...

薯条汉堡、雪碧可乐已然成为大家的用餐首选之一一周吃了两次以上的人相信也不在少数可最近一则“麦当劳、汉堡王等快餐包装中检出致癌物质”的消息却让许多人吓出了一身冷汗而且迅速登上热搜榜…近日&#xff0c;环保组织的一份报告称&#xff0c;美国当地麦当劳McDonald’s、汉…