Articles of directsound

同时向多个audio设备输出声音

好的,第一个问题。 我正试图编写一个虚拟的音板,一次输出到多个设备。 我更喜欢OpenAL,但是如果我必须切换到MS库(我最初在Windows 7上编写这个),我会的。 无论如何,这个想法是,你有一堆声音文件加载和准备播放。 你在Skype上,有人失败了,所以你点击价格是正确的失败小调播放button。 你和你的朋友同时听到了这个声音,并且对此有一个很好的嘲笑。 我已经把OAL带到了可以在默认设备上播放的地步,而在这一点上select一个设备似乎相当微不足道。 然而,据我所知,每个OAL设备需要其上下文是最新的,以便缓冲区正确填充/传播。 这意味着,在一个标准的程序中,声音将在一个设备上播放,然后设备将被切换,并且缓冲的声音将在第二个设备上播放。 这是可能的,所有的audio库? 线程是否会被卷入,并且这些会是安全的? 然后,接下来的问题是,为了与最终用户设置无缝集成,它需要能够输出到默认录音设备,或者拦截录音设备,将其与声音混合并输出作为另一个回放设备。 这两种情况之一是可能的,如果两者都是可行的,哪一个更可行? 我认为最好是能够输出到录音设备本身,因为程序不必为了让麦克风继续工作而不需要运行。

是基于WASAPI的DirectSound和WinMM?

我在这张幻灯片中看到,Vista中的winmm和directsound是基于wasapi的。 这是否意味着winmm和directsound实际上通过调用WASAPI中的函数来完成他们的工作? 经过一番谷歌search,我找不到这个信息,希望这里有人知道。

内存转储分析(应用程序挂起)

我试图分析我的应用程序中发生挂起后从我的最终用户收到的内存转储。 这似乎与我的应用程序的audio播放部分有关。 我相信有两个线程,即即将开始播放声音的主线程,以及一个更新线程,它迭代链表中的声音以不断更新其状态。 但是,我不明白这个挂机的来源是什么。 我的WinDbg的知识是有限的,但我已经设法弄清楚挂起似乎发生在audio库的SetLoop方法(在静态声音代码中)。 我使用DirectSound,在这种情况下应用程序运行在Windows 7 32位(我正在开发自己的XP,我从来没有像这样的问题)。 静态声音类会在检查声音是否正在播放之前locking关键部分,如果不是,则会将循环标记设置为true或false。 在这种情况下,主线程正在调用SetLoop将其设置为false,因为它想要以非循环状态播放声音。 我可以看到,挂起时,主线程停留在对ntdll.dll中的EtwEventEnabled调用,这显然是由静态声音类的SetLoop方法。 我不知道它是否卡在EnterCriticalSection调用中,或者是在调用DirectSound的GetStatus方法的辅助缓冲区的时候进一步下去? 这里是我对内存转储分析知识不足的地方,如果有人花时间看看转储,我将非常感激。 这里是转储的链接,具体应用符号如下: https : //dl.dropbox.com/u/5121962/hangdump.zip 非常感谢您的帮助。

如何在控制台程序中向DirectSound SetCooperativeLevel提供HWND?

我正在编写一个控制台程序,使用DirectSound API来渲染一些audio数据。 遵循DirectSound编程指南(来自Microsoft)时,我偶然发现了一个奇怪的问题。 根据文件 : 创build设备对象后,必须使用IDirectSound8 :: SetCooperativeLevel方法设置设备的协作级别。 除非你这样做,否则听不到任何声音。 问题是我正在编写一个控制台程序, SetCooperativeLevel需要一个HWND作为第一个参数。 我没有任何HWND在控制台程序中处理。 我试图提供一个空指针,但是失败了一个DSERR_INVALIDPARAM错误代码。 什么HWND值应该提供给控制台程序中的IDirectSound8::SetCooperativeLevel ? 该计划的audio部分计划build成共享库,所以它几乎不知道“外部”的程序。 感谢您的任何build议! 注意:我知道有一个更好的解决scheme来简单地渲染audio,比如使用SDL,OpenAL,SFML(基于OpenAL),但是对于我当前的项目DirectSound被强制执行。 编辑 :我发现了一个微软工程师的消息 ,创buildGLOBAL_FOCUS缓冲区时,消除有关使用桌面窗口或控制台窗口作为SetCooperativeLevel的HWND的SetCooperativeLevel 。

如何使我的应用程序被视为Windows中的通信程序

我正在制作一个使用Speech库的程序,当女士正在说话时,我想让所有其他声音静音或减弱。 我一直在寻找一种手动静音其他应用程序的方式,但是我在通讯选项卡(在声音选项内)中看到了Windows中的一个选项,提到该窗口可以为我pipe理这个选项。 就像这张照片一样: 所以基本上,我的应用程序被视为通信应用程序(如Skype)需要什么?

如何从DLL中获取HWND?

我有一个DLL,我想用Direct Sound播放声音。 为了播放声音,我需要可执行文件的HWND。 我没有加载DLL的可执行文件的HWND。 如何在不从可执行文件传入DLL的情况下获取它?

在Windows上使用C将数据stream式传输到声卡

作为大学项目的一部分,我必须做一些信号处理,并希望使用PC声卡输出结果。 该软件必须用C编写,需要与Windows(最好是7和XP)一起工作。 我发现输出.wav和类似文件的代码示例,但我有兴趣连续输出数据,而不是从文件输出。 尽pipe一些声音API似乎有自己的处理缓冲区的方法,但输出的数据很可能会以数组的forms呈现。 任何build议都会很好,代码示例甚至是最好的API。 我已经看过DirectSound和OpenAL,但是我还不确定如何开始。

使用portaudio设置audioinput电平

我正在处理在Windows上使用portaudio的遗留代码。 该代码从台式麦克风获取audio,并具有configurationinput音量的能力。 它在Windows XP下完美运行,但调整audioinput电平在Windows 7下被破坏,改变参数对输出audiostream没有影响。 代码执行以下操作来调整音量 mp_mixer = Px_OpenMixer(mp_inputStream, m_dev_num); if(mp_mixer) Px_SetInputVolume(mp_mixer, m_volume); 我发现,在Windows Vista和更新的版本下,winmme函数不起作用。 我已经更新到最新版本的portaudio pa_stable_v19_20140130,其中混音器function不再可用。 我无法find替代方式来调整input音量在portsound,有没有?