草庐IT

c++ - 修改音频样本缓冲区的音量增益

我想增加语音数据缓冲区的音量。关键是我正在使用DirectSound,并且我有一个主缓冲区和一个辅助缓冲区-所有流混合都是手动完成的。在语音聊天中,所有参与者都可以有独立的音量级别。我将每个流数据乘以一个值(增益)并将其加到一个缓冲区中。一切正常,但当我尝试将数据乘以大于1.0f的值时-我听到一些削波或其他声音。我试过使用Audacity效果压缩器,但这无助于减少奇怪的噪音。也许我应该以其他方式修改增益?或者只是使用另一种后处理算法?更新:哇,我刚刚发现了一件有趣的事情!我在增加音量之前和之后都转储了音频。这是图片对不起质量-我认为这就是声音应该出现的方式(我自己画了红线)。看起来值确

c++ - 使用缓冲区从未知大小的文件中读取

我正在尝试从文件中读取block,但遇到了问题。char*inputBuffer=newchar[blockSize]while(inputFile.read(inputBuffer,blockSize)){inti=inputFile.gcount();//Dostuff}假设我们的block大小是1024字节,文件是24,3KiB。读取第23个block后,将有0,3KiB剩余可读取。我还想读取0,3KiB,实际上我稍后使用gcount()这样我就可以知道有多少缓冲区read(...)修改(以防万一)但是当它访问第24个block时,read(...)返回一个值使得程序没有进入循环

使用shellcode的缓冲区溢出练习

我正在对C程序上的缓冲区过载进行练习,该问题的目的是将根外壳插入程序中,以获取根壳。这就是我到目前为止所拥有的:步骤1.首先,让我们在文件中查看我的C代码file.c:root@kali:~#cat./file.c#include#includevoidpremio(){printf("Ihavealteredtheprogramsflow\n");}intmain(intargc,char*argv[]){charbuffer[100];if(argc!=2){printf("Use:%sargument\n",argv[0]);return-1;}strcpy(buffer,argv[1]

c++ - 实现循环缓冲区以在一次调用中写入/读取任意数量的数据

大多数循环缓冲区假设每次只读/写一个对象,我发现以(constchar*bytes,size_tbyte_count)形式对二进制数据进行操作的唯一链接是http://www.asawicki.info/news_1468_circular_buffer_of_raw_binary_data_in_c.html,我觉得不对,而且有点长。什么是正确的实现方式?我自己创建了一个。但它仍然很长。谁能分享一个更优雅的版本?或者您能指出我的代码有什么可以改进的地方吗?classPipe{Pipe(size_tcapacity):_capacity(capacity){init();}~Pipe(

C++ 在带有右值缓冲区的 ostream 中使用 snprintf,格式是否正确?

我想知道我是否可以在ostream中使用snprintf格式,这样我就可以在流表达式本身中嵌入对snprintf的调用.这在GCC4.9中编译,但是可以吗?cout 最佳答案 这是格式正确且定义明确的。{}用于复制列表初始化对char[12]的右值引用,它创建一个临时char[12]数组以引用是绑定(bind)的。这个临时值一直存在到完整表达式的末尾-在本例中,直到分号,因此可以安全地返回指向数组中元素的指针并用于在该表达式中打印。(lambda返回一个char*指向这个数组的第一个元素。)标准语:§8.5[dcl.init]/p1

c++ - 在双缓冲区多线程系统中执行指针交换

当双缓冲数据将在线程之间共享时,我使用了一个系统,其中一个线程从一个缓冲区读取,一个线程从另一个缓冲区读取并从第一个缓冲区读取。问题是,我要如何实现指针交换?我需要使用临界区吗?没有可用的Interlocked函数可以实际交换值。我不能让线程1从缓冲区1读取,然后开始从缓冲区2读取,在读取过程中,这将是appcrash,即使另一个线程没有开始写入它也是如此。我在Windows上的VisualStudioUltimate2010RC中使用nativeC++。 最佳答案 使用临界区是公认的做法。只需在您的所有线程之间共享一个CRITIC

c++ - 多个 GLSL 统一缓冲区

我在使用多个统一缓冲区时遇到问题。这是我的GLSL代码:layout(std140)uniformMaterialInfo{vec3Ka;vec3Ks;vec3Kd;};layout(std140)uniformLightInfo{vec3La;vec3Ls;vec3Ld;};这就是我创建和填充缓冲区的方式:blockIndex=glGetUniformBlockIndex(program,"MaterialInfo");if(blockIndex==-1){fprintf(stderr,"Couldnotbinduniformblock\n");}glGenBuffers(1,&ma

c++ - 使用指向内部缓冲区的指针 move 语义

假设我有一个管理指向内部缓冲区的指针的类:classFoo{public:Foo();...private:std::vectorm_buffer;unsignedchar*m_pointer;};Foo::Foo(){m_buffer.resize(100);m_pointer=&m_buffer[0];}现在,假设我也正确地实现了3条规则,包括复制内部缓冲区的复制构造函数,然后将指针重新分配给内部缓冲区的新拷贝:Foo::Foo(constFoo&f){m_buffer=f.m_buffer;m_pointer=&m_buffer[0];}如果我还实现了move语义,那么只复制指针

C++:将读取的二进制文件存储到缓冲区中

我正在尝试读取二进制文件并将其存储在缓冲区中。问题是,二进制文件中有多个以null结尾的字符,但它们不在末尾,而是在其他二进制文本之前,所以如果我将文本存储在'\0'之后,它只会将其删除缓冲区。例子:char*a="thisisa\0test";cout这只会输出:thisisa这是我的真实代码:这个函数读取一个字符boolCStream::Read(int*_OutChar){if(!bInitialized)returnfalse;intiReturn=0;*_OutChar=fgetc(pFile);if(*_OutChar==EOF)returnfalse;returntrue

c++ - 为什么 cin 命令在缓冲区中留下 '\n'?

这与:cinandgetlineskippinginput有关但他们不回答为什么会发生这种情况,只回答如何解决它。为什么cin会在缓冲区中留下一个'\n'但cin.getline会接受它?例如:cin>>foo;cin>>bar;//Noproblemcin>>baz;//Noproblem.但是使用cin.getlinecin>>foo;cin.getline(bar,100);//willtakethe'\n'那么为什么它不会发生在cin而会发生在cin.getline上呢? 最佳答案 因为,当你说getline时,你说你想得到