问题标签 [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 投票
2 回答
4280 浏览

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

我正在编写一个使用 DirectSound API 呈现一些音频数据的控制台程序。在遵循DirectSound Programming Guide (from Microsoft)时,我偶然发现了一个奇怪的问题。根据文档

创建设备对象后,您必须使用IDirectSound8::SetCooperativeLevel方法设置设备的协作级别。除非您这样做,否则不会听到任何声音。

问题是我正在编写一个控制台程序,并且SetCooperativeLevel需要一个 HWND 作为第一个参数。我在控制台程序中没有任何 HWND 需要处理。我尝试提供一个空指针,但失败并出现DSERR_INVALIDPARAM错误代码。

IDirectSound8::SetCooperativeLevel在控制台程序中应该提供什么 HWND 值?该程序的音频部分计划构建为一个共享库,因此它对“外部”程序几乎一无所知。

感谢您的任何建议!

注意:我知道简单渲染音频有更好的解决方案,例如使用 SDL、OpenAL、SFML(基于 OpenAL),但对于我当前的项目,DirectSound 是强制执行的。


编辑:我发现了一条来自 Microsoft 工程师的消息SetCooperativeLevel,它消除了在创建 GLOBAL_FOCUS 缓冲区时使用桌面窗口或控制台窗口作为 HWND 的疑虑。

0 投票
1 回答
2269 浏览

c# - 将 DirectSound CaptureBuffer 的内容写入 C# 中的 WAV 文件

我已将音频录制到 CaptureBuffer,但我不知道如何将其保存到 wav 文件中。我试过这个(http://www.tek-tips.com/faqs.cfm?fid=4782),但它没有用,或者我没有正确使用它。有谁知道如何解决这个问题?示例代码将不胜感激。

0 投票
1 回答
5151 浏览

c# - 播放流式音频数据 (C#)

我试图使用 C# 开发一个可以播放流式音频数据的 Windows 应用程序。基本上,我将有一个负责播放不同音频文件的客户端应用程序。目前,从客户端应用程序中,我从文件头中提取硬件配置参数,然后通过网络传输文件数据(PCM 流)。

那么是否可以使用从客户端发送的硬件配置参数来配置实际的硬件(在服务器端),然后将文件数据流提供给它,以便它可以播放音频数据。

在搜索的过程中,我了解了NAudio. NAudio 是否能够做这些事情,或者对我来说更好的选择是使用 Directsound APIS 切换到 nativ C/C++ 代码。

更新: 通过配置硬件,我的意思是设置与音频播放相关的参数。这些参数将包括sample rate(例如:44100 Hz)、number of channels(例如:立体声)、storage format(例如:16 位小端)等。

我的客户端应用程序在 Linux 上,我已经植入了一个 ALSA 驱动程序,它拦截 PCM 流和 hw_params 配置,然后将它们发送到服务器。

更新结束

谢谢。

0 投票
1 回答
3058 浏览

c# - 使用 NAudio 在运行时更改波形格式

我已经使用以下方法初始化了设备:

我正在使用以下方法向其中添加 pcm 流:

waveProvider.AddSamples(samples, 0, size);

只要流数据具有相同的配置,上述工作就可以正常工作。

我有另一个接收采样率和通道数的函数,我想重新配置 waveprovider 以使用新提供的配置。这是我正在使用的代码:

这是行不通的,我相信这也不是正确的做法。知道如何重新配置​​设备以使用新的 sample_rate 和 num_channels

谢谢。

0 投票
1 回答
256 浏览

delphi - 如何处理 Delphi 6 DSPACK 程序中遗留过滤器“Wav Dest”的 NIL 响应?

我正在尝试使用 DSPACK 创建一个 Delphi 6 程序,该程序记录来自 PC 输入设备(Windows XP)的音频,然后将捕获的音频写入 MS 格式的 WAV 文件。我遇到的问题是,当我尝试获取名为“WAV Dest”的旧过滤器时,我得到了 NIL:

filWaveDest.BaseFilter.Moniker 在这些调用之后包含 NIL。我该如何纠正这个问题,因为尝试写入使用 filWaveDest 捕获的 WAV 数据的后续代码显然失败了?

0 投票
2 回答
931 浏览

c# - DirectSound:“值不在预期范围内。” 初始化通知时

当我尝试运行一个简单的 DirectSound 程序时,我遇到了这个异常。这是代码:

var notify = new Notify(outputBuffer);我在最后一行( )上得到了异常。

不知道出了什么问题。缓冲区已正确初始化。

0 投票
1 回答
978 浏览

c# - 使用 DirectSound 进行音高转换

如何在 C# 中使用 DirectSound 进行音高转换?我在 Google 中没有发现任何有用的东西。SetFrequency 对我不利,因为这也会改变声音的速度。我不想为每个音高创建一个 wav 文件,因为这会导致一个非常大的软件。

谢谢你!

0 投票
2 回答
480 浏览

delphi - 当 MP3 对专辑封面进行编码时 DirectX 出现 MP3 播放问题

我在 Delphi 2007 中使用 Clootie DirectShow9 标头。我创建了一个播放音频和视频的包装组件。一切都很好,直到我得到一个包含专辑封面编码的 MP3。像这样的 mp3 文件将无法播放。当我调用 pMediaControl.Run; 时,我的代码没有收到错误消息。pMediaControl 是 IMediaControl。他们只是没有开始玩。我还有许多其他未使用专辑封面编码的 MP3 文件,它们可以正常播放。一定有什么我错过了,但我无法弄清楚。

这些艺术编码的 mp3 文件可以在同一台 PC 上的 WMP 和 Winamp 中正常播放。

有人可以为我解释一下吗?

谢谢

0 投票
1 回答
331 浏览

playback - 在 DirectSound 中从头开始创建声音

有没有办法使用 DirectSound 从头开始​​创建声音,例如播放音符 ac、d、e、f、g 等?然而,声音必须是真实的,并且听起来至少有点像真正的声音。

谢谢。我尽量做到简明扼要。

0 投票
2 回答
966 浏览

c# - 使用 DirectSound 和 C# 将声音从麦克风流式传输到扬声器时,如何避免无声的滴答声?

我尝试使用DirectSoundC#将声音样本麦克风流式传输到扬声器。它应该类似于“听麦克风”,但后来我想用它来做其他事情。通过测试我的方法,我注意到背景中有无声的搔痒声和噼啪声。我猜这与写入和播放缓冲区之间的延迟有关,该延迟必须大于写入块的延迟。

如果我将录制和播放之间的延迟设置为小于 50 毫秒。大多数情况下它都有效,但有时我会听到非常响亮的开裂声。所以我决定延迟至少 50 毫秒。这对我来说没问题,但是系统“听设备”的延迟似乎要短得多。我猜它大约是 15-30 毫秒,几乎不明显。对于 50 毫秒,我至少得到一点混响效果。

在下面,我将向您展示我的麦克风代码(部分):初始化是这样完成的:

捕获将在一个额外的线程中像这样运行:

捕获ReportChunk时将数据作为可以订阅的事件发送给扬声器。扬声器部分初始化如下:

数据由事件方法放入队列中,只需:

填充播放缓冲区和启动/停止播放缓冲区由另一个线程完成:

writeToBuffer简单地将入队的块写入缓冲区,this.buffer.Write(wp, data, LockFlag.None);并关心bufferSizeand chunkSizewp它表示最后的写入位置。我认为这就是我的代码重要的一切。也许定义丢失了,至少还有另一种方法可以启动/停止=控制线程。

我已经发布了这段代码,以防我在填充缓冲区时出错或我的初始化错误。但我猜这个问题的发生是因为 C# 字节码的执行太慢或类似的东西。但最后我的问题仍然悬而未决:我的问题是如何减少延迟以及如何避免不应该存在的噪音?