本文隶属于分类

编程语言

广告推荐

技术交流学习或者有任何问题欢迎加群

编程技术交流群 : 154514123 爱上编程      Java技术交流群 : 6128790  Java

标签:工程文件   一个   creat   init   eat   因此   测试   录音   捕捉   

1, 缘起

某次开发语音对讲windows程序,采用delphi语言,及delphix的TDXSound控件。

DXSound提供了TSoundCaptureStream类,可以实现指定频率、位数、声道的声卡录音。在其OnFilledBuffer事件处理中,将音频数据发给指定设备就能实现流式对讲。

先写了一个测试EXE程序,运行OK。然后需要将其功能封装为DLL函数,供其它应用程序开发时调用,封装完毕,结果发现麦克风的声音发送不出去。WTF?

2,分析

debug发现,调用DLL开始对讲函数后,OnFilledBuffer中的回调事件代码一直未被执行。这在exe程序中是不存在的。记得uDPServer控件有类似的毛病,如果不设置为其ThreadedEvent属性为True,那么在DLL中其ONUDPRead事件基本上也是收不到任何信息。

但DXSound中有类似的属性设置吗?查看DXSounds单元的源码,发现TSoundCaptureStream有一个FNotifyThread属性(又是线程!),当调用start方法开始捕捉声卡时,会创建一个TSoundCaptureStreamNotify通知线程,而这个通知线程调用了Synchronize(Update)方法向主线程发送捕捉到了声卡信息。

 

查询资料发现,若工程文件是DLL而不是EXE的话,Application默认不创建窗口句柄,因此Synchronize 向Application发送消息根本无法响应。

参见:https://www.cnblogs.com/enli/archive/2010/09/28/1837728.html

 

3,解决

解决方案也是采用了上文中提供的方法,在DLL的l工程文件中加入以下语句 ,问题解决。

Application.Initialize;

if Application.Handle = 0 then
begin
    Application.CreateHandle;
end;

Application.Run;

 

DLL线程中坑爹的Synchronize?

标签:工程文件   一个   creat   init   eat   因此   测试   录音   捕捉   

原文:https://www.cnblogs.com/jackkwok/p/8675676.html

技术交流学习或者有任何问题欢迎加群

编程技术交流群 : 154514123 爱上编程      Java技术交流群 : 6128790  Java

广告推荐

讨论区