c语言调用话筒的程序,c – OpenAL:如何创建简单的“麦克风回声”程序?

一个古老的问题,但这是一个答案.如果我们真的想要简洁,它肯定可以修剪,但这有点不到100条有效线:

#include // OpenAL header files

#include

#include

using std::list;

#define FREQ 22050 // Sample rate

#define CAP_SIZE 2048 // How much to capture at a time (affects latency)

int main(int argC,char* argV[])

{

list bufferQueue; // A quick and dirty queue of buffer objects

ALenum errorCode=0;

ALuint helloBuffer[16], helloSource[1];

ALCdevice* audioDevice = alcOpenDevice(NULL); // Request default audio device

errorCode = alcGetError(audioDevice);

ALCcontext* audioContext = alcCreateContext(audioDevice,NULL); // Create the audio context

alcMakeContextCurrent(audioContext);

errorCode = alcGetError(audioDevice);

// Request the default capture device with a half-second buffer

ALCdevice* inputDevice = alcCaptureOpenDevice(NULL,FREQ,AL_FORMAT_MONO16,FREQ/2);

errorCode = alcGetError(inputDevice);

alcCaptureStart(inputDevice); // Begin capturing

errorCode = alcGetError(inputDevice);

alGenBuffers(16,&helloBuffer[0]); // Create some buffer-objects

errorCode = alGetError();

// Queue our buffers onto an STL list

for (int ii=0;ii<16;++ii) {

bufferQueue.push_back(helloBuffer[ii]);

}

alGenSources (1, &helloSource[0]); // Create a sound source

errorCode = alGetError();

short buffer[FREQ*2]; // A buffer to hold captured audio

ALCint samplesIn=0; // How many samples are captured

ALint availBuffers=0; // Buffers to be recovered

ALuint myBuff; // The buffer we're using

ALuint buffHolder[16]; // An array to hold catch the unqueued buffers

bool done = false;

while (!done) { // Main loop

// Poll for recoverable buffers

alGetSourcei(helloSource[0],AL_BUFFERS_PROCESSED,&availBuffers);

if (availBuffers>0) {

alSourceUnqueueBuffers(helloSource[0],availBuffers,buffHolder);

for (int ii=0;ii

// Push the recovered buffers back on the queue

bufferQueue.push_back(buffHolder[ii]);

}

}

// Poll for captured audio

alcGetIntegerv(inputDevice,ALC_CAPTURE_SAMPLES,1,&samplesIn);

if (samplesIn>CAP_SIZE) {

// Grab the sound

alcCaptureSamples(inputDevice,buffer,CAP_SIZE);

//***** Process/filter captured data here *****//

//for (int ii=0;ii

// buffer[ii]*=0.1; // Make it quieter

//}

// Stuff the captured data in a buffer-object

if (!bufferQueue.empty()) { // We just drop the data if no buffers are available

myBuff = bufferQueue.front(); bufferQueue.pop_front();

alBufferData(myBuff,AL_FORMAT_MONO16,buffer,CAP_SIZE*sizeof(short),FREQ);

// Queue the buffer

alSourceQueueBuffers(helloSource[0],1,&myBuff);

// Restart the source if needed

// (if we take too long and the queue dries up,

// the source stops playing).

ALint sState=0;

alGetSourcei(helloSource[0],AL_SOURCE_STATE,&sState);

if (sState!=AL_PLAYING) {

alSourcePlay(helloSource[0]);

}

}

}

}

// Stop capture

alcCaptureStop(inputDevice);

alcCaptureCloseDevice(inputDevice);

// Stop the sources

alSourceStopv(1,&helloSource[0]);

for (int ii=0;ii<1;++ii) {

alSourcei(helloSource[ii],AL_BUFFER,0);

}

// Clean-up

alDeleteSources(1,&helloSource[0]);

alDeleteBuffers(16,&helloBuffer[0]);

errorCode = alGetError();

alcMakeContextCurrent(NULL);

errorCode = alGetError();

alcDestroyContext(audioContext);

alcCloseDevice(audioDevice);

return 0;

}

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

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

相关文章

轶事奇语

---恢复内容开始--- Windows自带的记事本编辑文本时&#xff0c;如果使用utf-8编码的文件&#xff0c;会在每个文件开头添加一个值为0xefbbbf字符&#xff0c;会导致许多奇怪的问题&#xff0c;如网页第一行可能会显示一个"?", 或编译器报语法错误&#xff0c;等。U…

教你玩转CSS 轮廓(outline)属性

目录 CSS 轮廓&#xff08;outline&#xff09; 所有CSS 轮廓&#xff08;outline&#xff09;属性 CSS 轮廓&#xff08;outline&#xff09; 轮廓&#xff08;outline&#xff09;是绘制于元素周围的一条线&#xff0c;位于边框边缘的外围&#xff0c;可起到突出元素的作用…

单片机c语言参考文献最新,[2018年最新整理]10个单片机C语言实例.doc

[2018年最新整理]10个单片机C语言实例经典单片机实验帮你成功1&#xff0e; 闪烁灯1&#xff0e; 实验任务如图4.1.1 所示&#xff1a;在P1.0 端口上接一个发光二极管L1&#xff0c;使L1 在不停地一亮一灭&#xff0c;一亮一灭的时间间隔为0.2 秒。2&#xff0e; 电路原理图图4…

Web安全-伪静态网页

初步认识 “伪静态”顾名思义就是一种表面上看似是静态网页&#xff08;以.html、.htm等结尾&#xff09;&#xff0c;不存在任何的数据交互&#xff0c;却其实是动态网页&#xff0c;存在数据交互的网站&#xff0c;具有这种特性的网页被称为“伪静态网页”。我们看到的伪静态…

2015.7.11js-10(无缝滚动)

1.实现原理&#xff1a;setInterval定时器&#xff0c;让某元素position的left属性定时滚动&#xff0c;使用到js中的元素的offsetLeft属性。 2.案例&#xff1a;1.css的实现是外div是4张图片的总宽度&#xff0c;设置relative然后overflow隐藏。子代有ul层设置为absolute;left…

教你玩转CSS margin(外边距)

目录 margin 可能的值 Margin - 单边外边距属性 Margin - 简写属性 所有的CSS边距属性 margin margin 清除周围的(外边框)元素区域。margin 没有背景颜色,是完全透明的。 margin 可以单独改变元素的上,下,左,右边距,也可以一次改变所有的属性。

某高校2006年招收学生3千人c语言,C语言程序设计例题

C语言程序课程设计任务书一、题目每个同学可从下列给出的参考题目中任选一题完成&#xff0c;也可以自选题目。1.完成一个学生成绩管理系统。内容描述&#xff1a;设计四个类&#xff1a;学生基本信息&#xff1b;成绩表&#xff1b;班级表&#xff1b;课程表(描述课程信息&…

j2ee 和 j2se_在J2SE应用中模拟CDI的会话和请求范围

j2ee 和 j2se我们目前正在考虑重构Naked Objects框架&#xff0c;以使用JSR-330&#xff08;依赖注入&#xff09;和面向EE的老大哥JSR-299&#xff08;CDI&#xff09;。 使用香草JSR-330是不费吹灰之力的&#xff0c;但是我们想利用JSR-299中的一些不错的功能&#xff08;例如…

php双引号解析漏洞

1|0前言 在PHP语言中&#xff0c;单引号和双引号都可以表示一个字符串&#xff0c;但是对于双引号来说&#xff0c;可能会对引号内的内容进行二次解释&#xff0c;这就可能会出现安全问题。 条件&#xff1a;php版本>5.5 2|0正文 举个简单例子 <?php $a 1; $b 2; ec…

Jquery插件开发

直到最近写一个小功能的时候灵机一动&#xff0c;才想起来尝试着写很早以前就想进行的插件开发。更郁闷的是&#xff0c;直到写插件的时候&#xff0c;才深刻的明白什么叫面向对象&#xff01;(不知道都怎么想的&#xff0c;我在qq空间里发这句话的时候大家都评论&#xff0c;“…

c语言用整数 寻址,132-寻址运算符-C语言教程2020年 - 视频教程 - 北盟网校 - 专注原创教学第一站...

寻址运算符&输出其操作数的内存地址。前面使用了寻址运算符&&#xff0c;它广泛用在scanf()函数。&放在变量前面&#xff0c;scanf需要用到这个变量的地址。scanf内部可以利用这个地址 去修改对应的哪个变量的值。看看下面的例子#includeint main(void){/* 定义一些…

在Web浏览器中显示Spring应用程序启动的进度

重新启动企业应用程序时&#xff0c;客户打开Web浏览器时会看到什么&#xff1f; 他们什么也没看到&#xff0c;服务器还没有响应&#xff0c;因此Web浏览器显示ERR_CONNECTION_REFUSED 应用程序前面的Web代理&#xff08;如果有&#xff09;注意到它已关闭并显示“友好”错误…

教你玩转CSS padding(填充)

padding(填充) 当元素的 padding(填充)内边距被清除时,所释放的区域将会受到元素背景颜色的填充。 单独使用 padding 属性可以改变上下左右的填充。 可能的值 填充- 单边内边距属性 在CSS中,它可以指定不同的侧面不同的填充: padding-top:25px; padding-bottom:25px…

代码审计之SQL注入:BlueCMSv1.6 sp1

这是一篇纪录关于BlueCMSv1.6 sp1两个SQL注入的审计过程&#xff0c;原文来自代码审计之SQL注入&#xff1a;BlueCMSv1.6 sp1 &#xff0c;主要纪录一下个人在参考博文复现这两个漏洞经过。 href"https://www.ichunqiu.com/course/406" target"_blank">…

莫队算法 BOJ 2038 [2009国家集训队]小Z的袜子(hose)

题目传送门 1 /*2 莫队算法&#xff1a;求出[l, r]上取出两只相同袜子的个数。3 莫队算法是离线处理一类区间不修改查询类问题的算法。如果你知道了[L,R]的答案&#xff0c;可以在O(1)的时间下得到4 [L,R-1]和[L,R1]和[L-1,R]和[L1,R]&#xff0c;4个while…

linux prelink.cache,Linux基础操作

1、Linux上的文件管理类命令都有哪些&#xff0c;其常用的使用方法及其相关示例演示。1、1 cp复制命令单个文件复制&#xff1a;cp [OPTION]... SOURCE DEST如果DEST不存在&#xff0c;则事先创建文件&#xff0c;并复制源文件数据如果DEST是非目录文件&#xff0c;则覆盖目录文…

教你玩转CSS 分组选择器和嵌套选择器

目录 分组选择器 嵌套选择器 分组选择器 在样式表中有很多具有相同样式的元素。 h1 {color:green;}h2 {color:green;}p {color:green;} 为了尽量减少代码,你可以使用分组选择器。 每个选择器用逗号分隔。 在下面的例子中,我们对以上代码使用分组选择器: h1,h2,p {color…

记一次无意间发现某学校图书检索系统的变量覆盖漏洞

这是汇文OPAC很早就存在的一个严重漏洞 补充漏洞信息参考来源https://www.seebug.org/vuldb/ssvid-90722 1. 利用存在该漏洞参数的链接&#xff0c;访问存在漏洞文件&#xff0c;并覆盖 session 值 http://*******/opac/openlink_ebk.php?_SESSION[ADMIN_USER]opac_admin 2.…

多线程笔记5

第六章&#xff1a;Overlapped I/O&#xff0c;在你身后变戏法 1.overlapped I/O 是 Win32 的一项技术&#xff0c;你可以要求操作系统为你传送数据&#xff0c;并且在传送完毕时通知你。这项技术使你的程序在I/O 进行过程中仍然能够继续处理事务。事实上&#xff0c;操作系统内…

腾讯手游助手android版本,腾讯游戏助手下载-腾讯游戏助手 安卓版v3.3.4.22-PC6安卓网...

需要调用以下重要权限- 允许应用程序写入到外部存储器, 允许只读到电话状态访问&#xff0c;包括该装置的电话号码&#xff0c;当前蜂窝网络信息&#xff0c;任何正在进行的呼叫的状态&#xff0c;并且任何一个列表 PhoneAccount的注册在设备上, 允许应用程序从外部存储读取, 需…