问题标签 [directsound]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2021 浏览

c# - 如何产生精确定时的音调和静音?

我有一个为 RSS 提要播放摩尔斯电码的 C# 项目。我使用托管 DirectX 编写它,但发现托管 DirectX 已过时且已弃用。我的任务是播放纯正弦波阵发,其间穿插着静默期(代码),它们的持续时间精确计时。我需要能够调用一个在这么多毫秒内播放纯音的函数,然后是 Thread.Sleep() 然后播放另一个,等等。在最快的情况下,音调和空格可以短至 40 毫秒。

它在托管 DirectX 中运行良好。为了获得精确定时的音调,我创建了 1 秒。正弦波进入辅助缓冲区,然后播放一定持续时间的音调,我在缓冲区结束后的 x 毫秒内向前搜索,然后播放。

我试过 System.Media.SoundPlayer。这是一个失败者[编辑 - 请参阅下面的答案],因为您必须 Play()、Sleep(),然后是 Stop() 才能获得任意音调长度。结果是音调太长,因 CPU 负载而异。实际停止音调需要不确定的时间。

然后我开始了漫长的尝试使用NAudio 1.3。我最终得到了一个提供音调数据的内存驻留流,然后再次向前寻找,将所需的音调长度留在流中,然后播放。这在 DirectSoundOut 类上工作了一段时间(见下文),但 WaveOut 类很快就死了,内部断言说尽管 PlayerStopped = true,但缓冲区仍在队列中。这很奇怪,因为我玩到最后,然后在音调结束和下一个音调开始之间等待相同的持续时间。您会认为在开始播放 40 毫秒音调后的 80 毫秒,它不会在队列中有缓冲区。

DirectSoundOut 有一段时间运行良好,但它的问题是,对于每个音调突发 Play(),它都会分离一个单独的线程。最终(5分钟左右)它只是停止工作。在 VS2008 IDE 中运行项目时,您可以在输出窗口中看到一个又一个线程退出的线程。我在播放过程中不创建新对象,我只是 Seek() 音流然后一遍又一遍地调用 Play(),所以我认为孤立缓冲区/任何堆积直到它被阻塞都不是问题。

我对此没有耐心,所以我希望这里有人面临类似的要求,并且可以引导我朝着可能的解决方案前进。

0 投票
1 回答
715 浏览

c# - 如何使用 C# 检测流或 tcplistener 或声卡的音频电平

这可能只使用 C# 吗?我希望能够检测来自:流、麦克风或声卡的音频,并在音频电平高于可设置阈值时开始录制。

谢谢 :-)

0 投票
1 回答
373 浏览

volume - DirectSound 影响 WinXP 上的系统音量

我目前正在开发用于语音网络聊天软件的音频引擎。一切正常 - 捕获/播放/混合通道。

问题在于在 Windows XP 下使用它。我一直在收到用户报告,其中包含启动应用程序后他们的全局系统容量设置为零的信息。

我假设这是由于 WaveOut/DSound 冲突而发生的。

如何强制 DSound 不影响系统音量?播放设备初始化:DirectSoundCreate8(&GUID, &pAudio, NULL);

和:

pAudio->SetCooperativeLevel(parentWnd, DSSCL_PRIORITY);

我目前无法调试应用程序,因为我使用的是 Vista 并且一切正常。

希望你能帮我解决这个问题!多谢!

问候,安东。

0 投票
1 回答
183 浏览

c++-cli - 包装 DirectSound 接口的托管类应该是 IDisposable 吗?

我正在编写一个围绕 DirectSound 的托管包装器。(这是一个简单的部分包装器,它解决了我的特定问题,仅此而已。不要告诉我有关 NAudio 或其他什么的事情。) 包装 IDirectSound8 的托管类应该是 IDisposable 吗?为什么?关于 IDirectSoundBuffer8 的相同问题。

0 投票
1 回答
1120 浏览

directsound - 如何将捕获的立体声从麦克风分成两个单声道 wav

我需要帮助..我在从麦克风(或声卡)捕获的流中分离左声道和右声道时遇到问题 下面的代码正确地从麦克风录制声音并保存到 wav 文件对左声道、右声道、左声道...... 如何识别(拆分)在 CapturedData 左右声道 ?? [方法 CreateCaptureBuffer()]

For InPos = 1 To 24000 - 1 Step 2 buffLeft(OutPos) = CaptureData(InPos) OutPos += 1 Next InPos


我厌倦了失败的尝试...

问候,席夫特

0 投票
1 回答
1487 浏览

c++ - 播放“咔哒”声

我正在尝试编写一个程序来在 C++ 中播放一个小的 .wav 文件。我已经按照 DirectX SDK 文档对其进行了编程,以在辅助静态缓冲区上进行写入和播放。它运行正常,只是在任何 .wav 文件的播放结束时,都会出现非常明显的“咔哒”声。我确信这不是我的音频硬件方面的缺陷,因为我知道使用 DirectSound 的任何其他游戏都没有它。

我试过在每个周期都为它轮询 GetCurrentPosition 并在它结束之前停止它,但不可靠。我不能在主缓冲区上播放它,因为在主缓冲区上播放的 .wav 必须循环播放,这是我不想要的。

有人知道解决这个问题的方法吗?提前致谢。

0 投票
1 回答
467 浏览

c++ - 获得对音频输出、DirectSound 的单独控制

我正在创建一个基本的信号发生器,并决定使用我的声卡作为模拟输出。我选择使用 DirectSound 是因为……这似乎是一个不错的选择。

我已经将它启动并运行得非常好,但我现在意识到我的代码使用辅助缓冲区以及计算机上的任何其他声音都与我生成的信号混合在一起。这是一个问题,因为当我正在运行电机时,我不希望它收到一个 MSN 戳噪声作为命令。

为了获得完全控制,我试图通过将合作级别设置为 DSSCL_WRITEPRIMARY 来接管系统。总而言之,这个策略真的让我很头疼,因为我在尝试设置此设置后遇到错误。关于使用主缓冲区的文档不是很好,我找不到任何真正好的例子。

所以我的问题是:

  1. 有没有人有一个很好的工作示例来接管和写入主缓冲区。

  2. 有没有更简单的方法可以将波形输出到声卡,并确保我的应用程序具有完全和唯一的控制权?

谢谢

0 投票
3 回答
5360 浏览

c# - C# 将音频从 8khz 重新采样到 44.1/48khz

我在 DirectShow .NET 中遇到了一个错误,我在其中创建了一个采样率为 8khz 的辅助缓冲区,并且在播放时,声音以大约 8khz 的速度播放。8.1khz 代替。

谷歌搜索,我发现我可能被迫自己将 8khz 音频上采样到 48khz 或 44.1khz,具体取决于 PC 中的声卡。

我可以为此使用任何 C# 库或通用算法吗?

谢谢!!

罗伊

0 投票
1 回答
302 浏览

c++ - DSSCL_EXCLUSIVE 不提供专有的声音输出。直接声音

很简单的问题。在 DirectSound API 的MSDN 文档中,他们声明当我的应用程序处于焦点时,它将是唯一可听的程序。这正是我想要发生的事情,但是当设置这个标志并通过我的应用程序播放声音时,我仍然可以听到我电脑上的背景音乐。

那么问题来了,为什么?是因为应用程序使用不同的低级 API 播放背景音乐,因此使用不同的混合缓冲区?还是我需要调整一些其他小技巧才能成为唯一可听的应用程序。

我在这里问了一个类似/相关的问题,没有回应。但是,如果您不知道特定 DirectSound 问题的答案,但您知道如何成为唯一具有不同 API 的可听应用程序,请再次告诉我!

谢谢,我使用的是 Windows XP 32Bit Professional,如果它有所作为的话。

0 投票
3 回答
1514 浏览

delphi - 如何从声卡录制任何东西?

我想录制声卡中产生的任何声音。请帮忙,我可以在哪里获得免费软件组件或商业(试用版)。德尔福7/2009