关于音频播放接口阻塞的问题

shn521 2013-01-31 09:36:29
waveOutPrepareHeader
waveOutWrite
waveOutUnprepareHeader
用的这3个API接口,正常情况下是可以播放的,但播放的工程中如果对计算机的音频设置进行更改,可能会造成这3个函数中的一个阻塞,请问有什么办法让其继续往下执行或返回错误,而不是堵在那里,感谢啊!
...全文
438 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shn521 2013-02-18
  • 打赏
  • 举报
回复
引用 8 楼 RobertBaker 的回复:
我发现里面少了些代码,看这里 http://blog.csdn.net/robertbaker/article/details/8559609 接口不用我说了吧, struct WAVE_EX : public WAVEHDR { BYTE byBuffer[xxx]; // 录音的数据, } DWORD WINAPI SR_Record(HANDLE hHandle, PW……
这些我不熟啊,能不能帮写个简单的demo,我下载看看是怎么调用的,感谢啊。
jimette 2013-01-31
  • 打赏
  • 举报
回复
疑难杂症!
shn521 2013-01-31
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
有没有处理它们的返回值, 正常来说应该会返回异常的吧
堵住了,没返回呢
zgl7903 2013-01-31
  • 打赏
  • 举报
回复
有没有处理它们的返回值, 正常来说应该会返回异常的吧
shn521 2013-01-31
  • 打赏
  • 举报
回复
引用 1 楼 dream238 的回复:
看看这几个函数的MSDN Remark部分,有没有什么调用上的逻辑问题。 特别是既然需要更改音频设置,那么是不是可以先Pause一下当前的播放再进行设置,设置完后继续。
逻辑上应该是没问题的。 “那么是不是可以先Pause一下当前的播放再进行设置,设置完后继续。”是可以的,但如果用户非法操作,会对软件影响很大,所以还是要解决非法操作阻塞的问题。
ArcRain 2013-01-31
  • 打赏
  • 举报
回复
看看这几个函数的MSDN Remark部分,有没有什么调用上的逻辑问题。 特别是既然需要更改音频设置,那么是不是可以先Pause一下当前的播放再进行设置,设置完后继续。
看不见的裂痕 2013-01-31
  • 打赏
  • 举报
回复
我觉得这是这API的缺陷所致,MSDN已经说的很清楚了。一定要Pause才能设置的。 The buffer must be prepared with the waveOutPrepareHeader function before it is passed to waveOutWrite. Unless the device is paused by calling the waveOutPause function, playback begins when the first data block is sent to the device. 楼主为啥不用MCI呢?MCI控制和执行都要方便许多呢。
LiuYinChina 2013-01-31
  • 打赏
  • 举报
回复
SP_Play 也一样,要你 Play 才有声音!有点像 IOCP 的 Post 的动作,
LiuYinChina 2013-01-31
  • 打赏
  • 举报
回复
我发现里面少了些代码,看这里 http://blog.csdn.net/robertbaker/article/details/8559609 接口不用我说了吧, struct WAVE_EX : public WAVEHDR { BYTE byBuffer[xxx]; // 录音的数据, } DWORD WINAPI SR_Record(HANDLE hHandle, PWAVEHDR pWaveHeader); 调用 SR_Open 以后,可以调用 N (N >= 3) 次 SR_Record (记得填好 WAVEHDR 的参数),就开始录了,在回调里 copy 走数据,再 SR_Record,就这样循环,你懂的!
shn521 2013-01-31
  • 打赏
  • 举报
回复
引用 6 楼 RobertBaker 的回复:
http://download.csdn.net/detail/robertbaker/5019096,里面有代码,
里面有demo吗?
LiuYinChina 2013-01-31
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/robertbaker/5019096,里面有代码,
【源码免费下载链接】:https://renmaiwang.cn/s/4j3mv PCM音频采集与异步播放SDK是针对音频处理领域的一个重要工具,主要解决了在进行音频采集和播放时可能遇到的应用程序阻塞问题。PCM(Pulse Code Modulation)是一种无损的数字音频编码格式,它是模拟音频信号数字化的基本过程,通过采样、量化和编码将连续的音频信号转换为离散的数字数据。在传统的音频采集过程中,通常会直接调用操作系统提供的API,如Windows下的waveIn*系列函数,来进行音频数据的获取。然而,这种直接调用方式可能会导致应用程序的主线程被阻塞,因为音频采集是一个实时性要求高的任务,需要不断地从硬件设备读取数据,如果这一过程在主线程执行,将严重影响应用的其他功能,造成用户界面反应迟钝甚至冻结。为了解决这个问题,这个SDK采用了异步线程模式。这意味着音频采集操作被放在一个单独的线程中执行,不会影响主线程的正常运行。这样,即使采集过程需要大量计算或长时间等待硬件响应,也不会阻塞用户界面。同时,SDK还包含了音频播放接口,同样利用异步机制,确保播放过程不会影响到其他系统资源的使用。在异步处理中,回调函数扮演了关键角色。当音频数据准备好或者播放完成时,SDK会触发预设的回调函数,通知应用程序进行下一步处理。但是,如果在回调函数内部直接调用API,仍然可能导致阻塞。因此,SDK的设计需要考虑到回调函数的优化,确保它们能够快速地执行并返回,避免阻塞问题。在提供的"AudioCaptureSdk"压缩包中,可能包含了以下内容:1. SDK的头文件(.h):定义了音频采集和播放接口,包括函数原型、结构体和常量等。2. 库文件(.lib/.dll):实现了SDK的功能,供应用程序链接使用。3. 示例代码或测试程序(.cpp/.exe):展示了如何正确使用SDK进行音频采集和播放

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧