博文
waveOut waveWrite播放声音需注意的一点(2011-11-02 15:22:00)
摘要:最近用windows底层API函数作为我播放声音的函数。程序开发好后,给别人使用。不就就反馈说在使用一段时间(大概30分钟)后,就会跳出 waveOut或者wavePrepare, waveUnprepare等API函数就不正常了。导致不能正常的播放声音了。思来想去,检查程序多次,没有发现什么问题。
今天,在看网上房子装修效果图的时候,一同事突然说了句,好整齐呀,两边对的非常齐整。真是一句话点醒梦中人。没错,就是这个问题,没有对齐的问题。 现在网上有很多的使用wave 底层API函数录音和放音的程序,但都忽略了这个细节。那就是,一般来说,播放一个语音文件,有3步,结束播放一个语音文件,也有3步。 这两个3步必须对齐。具体如下
播放语音文件3部曲
waveOutOpen
waveOutPrepareHeader
waveOutWrite
结束播放3部曲
waveOutReset
waveOutUnprepareHeader
waveOutClose
播放3部曲和结束3部曲不能颠倒。 其中 waveOutWrite 和 waveOutReset 对应。 waveOutPrepareHeader和waveOutUnprepareHeader对应, waveOutOpen 和 waveOutClose 对应。
关系和位置不要颠倒了。
&nb......
C++一个经典的超前问题(2011-10-24 15:42:00)
摘要:今天遇到了这样的错误:error C2079: 'xxx' uses undefined class 'yyy'
不得不承认自己有土鳖的基因。本来是很普通的一件事情。
自己居然不知道。
刚好碰到网上一个达人的分析文章,觉得非常经典的分析了这个经典的问题。固转载如下:
比如说,我们先定义一个b类再定义一个a类,a的一个成员就是b,如下:
class b{
int i;
};
class a {
b val ;
};
这显然是可以的。
如果这个时候,要把b的定义放到后面去,大家都知道在前面先声明b,那么:
class b;
class a {
b val ;
};
class b{
int i;
};
这段对不对呢?如果不编译,直观感觉,我以前总以为是可以的。。
但其实是通过不了编译的。那么再改,把val换成对b的指针,这样:
class b;
class a {
b * val ;
};
class b{
int i;
};
然后就可以了。
那么,直接给出一条重要的结论:
超前引用不可使用类名来定义变量和函数的变量参数,只可用来定义引用或者指针。
要解释其实是很简单的,因为编译器在处理类的时候,要为他的成员分配空间。
如果我们用指针,那么直接分配4个字节就可以了,就像:
class b;
class a;
class a {
b *val ;
};
class b{
a *val ;
};
但是,如果成员变量是类呢??
class b;
class a;
class a {
b val ;
};
class b{
a val ;
};
这种情况下,就好比把两面镜子对着放置一样。。
当处理到a的val的时候,发现是个b,那么给b留出空间,
为了知道给b留出多少空间,再看b,发现b的val是a,
那么又需要再知道该给a多少空间。。。
这个道理......
重回我的博客(2011-10-10 15:50:00)
摘要:在微博盛行的今日,我重返我的博客生活了。
经历了2010年10月份的跳槽到现在已经一年的时间了,我又回到了我的博客来。
以后我将专注于发布一些语音相关的内容。
谢谢大家关注。......
VC 中启动另外一个应用程序的方法(2010-12-07 14:30:00)
摘要:转至:
http://hi.baidu.com/superacacia/blog/item/27e4e58237a793d5bd3e1e7e.html
最近在做一个文档管理的软件时需要在程序中打开一个其他格式的文件,需要在文档管理里面点击链接使用特定的应用程序打开;这时就要用到 WinExec、ShellExecute和CreateProcess等方法了;
比如需要打开excel需要使用:
ShellExecute(NULL, "Open", "c:\\books.xsl", NULL, NULL, SW_SHOWNOACTIVATE);
其他方法引用网上的文章:
Q: 如何打开一个应用程序?
A: ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );
或 ShellExecute(this->m_hWnd,"open","notepad.exe", "c:\\MyLog.log","",SW_SHOW );
正如您所看到的,我并没有传递程序的完整路径。
Q: 如何打开一个同系统程序相关连的文档?
A: ShellExecute(this->m_hWnd,"open", "c:\\abc.txt","","",SW_SHOW );
Q: 如何打开一个网页?
A: ShellExecute(this->m_hWnd,"open", " http://www.google.com","",""......
const 用法大全(2010-11-04 10:30:00)
摘要:哎,今天又要普及基本知识了。可是这个const的用法确实是很多C/C++程序员很容易混淆的东西。今天好好整理一番,以供大家参考。
const主要是为了程序的健壮型,减少程序出错.
最基本的用法:
const int a=100; b的内容不变,b只能是100也就是声明一个int类型的常量(#define b =100)
int const b=100; //和上面作用一样
const指针和引用一般用在函数的参数中
int* m = &a; //出错,常量只能用常指针
int c= 1;const int*pc = &c;//常指针可指向常量
const int* pa = &a; //指针指向的内容为常量(就是b的值不变)
int const *a = &b; //指针指向的内容为常量(就是b的值不变)*p=3//error
int* const a = &b; //指针为常量,不能更改指针了如 a++但可以改值*p=3;
从这可以看出const放在*左侧修饰的是指针的内容,const放在*右侧修饰的是指针
本身.
const引用的用法和指针一样
int const & a=b; 和指针一样
const int& a=b; 和指针一样
但没有 int& const a=b 的用法因为引用不能做移位运算,但只是出个warning
const int* const a = &b; //综合应用,一般用来传递多维的数组
类如:char* init[] = {"Paris","in the","Spring"};
void fun(const int* const a){}
fun(init)//保护参数不被修改
int A(int)const; /......
C语言中的位运算(2010-11-03 15:42:00)
摘要:在此特别声明,此文转载至http://www.cnblogs.com/911/archive/2008/05/20/1203477.html。
如果您此前参考过这篇文章了,那么这里道歉,害您又一次进入。
不过,之后,我将再写一篇关于16进制一起其他进制的数据如何直接进行位运算,以作补偿。
位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。
C语言提供的位运算符列表:
运算符 含义 描述
& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
1、“按位与”运算符(&)
按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,
则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其
实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,
A=true,B=true,则A∩B=true 例如:3&5 3的二进制编码是11(2)。(为了区分十进制和其他进制,本文规
定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据
的基本单位是字节(Byte),一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位。二
进制系统中,每......
C语言下求每种变量类型的最大值(2010-10-29 17:44:00)
摘要:以前总是需要人工的写上如果某个short型数据是否大于 32767。总是觉得程序很难看,每次需要输入数字总是很烦。
下面介绍一种求每种变量类型的最大数值和最小数值的简便方法。
假如是要求 int 型的最大值和最小值,可以按照如下求。
unsigned int a;
int b;
a = (unsigned int) -1; //获得unsigned int 的最大值,最小值为0
b = ((unsigned int)-1) >>1; //获得 int 的最大值
b = ~(((unsigned int)-1) >>1); //获得int的最小值
其他类型也是类推
......
Linux下 UTF16转 UTF8(2010-08-17 13:55:00)
摘要:int UTF16ToUTF8(unsigned char *out, int *outlen, const unsigned char *inb, int *inlenb)
{
unsigned char* outstart = out;
const unsigned char* processed = inb;
unsigned char* outend = out + *outlen;
unsigned short* in = (unsigned short*) inb;
unsigned short* inend;
unsigned int c, d, inlen;
unsigned char *tmp;
int bits;
int isLittleEndian = 1;
if((*inlenb % 2) == 1) (*inlenb)--;
inlen = *inlenb / 2;
inend = in + inlen;
while((in < inend) && (out - outstart + 5 < *outlen))
{
if(isLittleEndian)
&n......
C2059和C2733同时出现的错误解决(2010-07-27 13:44:00)
摘要:症状
在 Microsoft Visual Studio 2005 中创建一个 c + + 应用程序。 您定义 _CRTDBG_MAP_ALLOC,然后编译的时候会出现 C2059和C2733的错误。
loadTOCNode(1, 'symptoms');
例如对于假定 c + + 应用程序中包含下面的代码
#define _CRTDBG_MAP_ALLOC
#include <malloc.h>
#include <crtdbg.h>
#include <stdlib.h>
在此的示例编译 c + + 应用程序时您会收到以下编译器错误消息:
错误 C2059: 语法错误: 常量
错误 C2733: 第二个重载函数 _dupenv_s_dbg 不允许使用的 C 链接
解决方法 要变通解决此问题,请按照下列步骤操作: 启动 Visual Studio 2005。 在 文件 菜单上指向 打开,然后单击 项目/解决方案。 找到该项目或您要打...
loadTOCNode(1, 'workaround');
要变通解决此问题,请按照下列步骤操作:
启动 Visual Studio 2005。 在 文件 菜单上指向 打开,然后单击 项目/解决方案。 找到该项目或您要打开,该解决方案,然后单击 打开。 复制并粘贴以下代码在代码窗口中。下面代码应该黏贴在 # include <stdlib.h> 语句 前。
#pragma push_macro("_dupenv_s")
#pragma push_macro("_wdupenv_s")
#undef _dupenv_s
#undef _wdupenv_s
复制并粘贴以下代码在代码窗口中。该代码应粘贴在 # include <stdlib.h> 语句 之后。
#pragma pop_macro("_dupe......
关于视音频信号处理编程的深入要求(2010-05-26 11:41:00)
摘要:不知不觉,我已经用C语言编程达5年了。在这中间,从最基本的 Ansi C 开始,控制台下一行行的代码敲入开始,到中间面向对象的C++,知道了原来还可以利用C++以达到面向对象,以及代码包装和模块化功能。后来开始接触MFC,知道原来可以把自己的东西通过UI形式向别人展示,太好了。再到后来,觉得MFC非常傻,C#是那么的聪明和简单。
这中间,我有过疯狂的迷恋某一种方式的编程,也有过很痛恨某一种方式的编程。现在回过头来看,其实最本质,最基本的还是基本C。 可以这么说,没几个人感声称自己很精通C,其实标准C还是很博大精深的,以至于我现在还会经常性的阅读一些关于标准C方面的基本资料来加深我对标准C的了解。
由于我是做音视频处理的,所以我这里要补充一些内容。 光掌握上述编程技能对音视频 处理只能说是个入门。要想深入熟悉音视频编程的话,我觉得应该掌握如下一些基本编程技术。这也是我所要努力的方向。
1. STL, 这里面把数组,列表等基本数据结构和算法都包装的很好,用起来很方便,也很简捷。
2. OpenCV, 这个对快速图像和视频编程绝对是个好东西,像图像读入,显示,变换,转换等都非常方便,可以使用户可以专心与处理上,而不是专心在图像编程上。
3. DirectShow,这个主要是对音视频编程,特别是游戏编程非常方便也快速。以至于原来一直是游戏编程必不可少的工具。
此外,一些类似信号处理的工具箱,图像处理工具箱也是非常有用的。如CxImage, HTK等等。......