- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对了,我正在努力在我们的 Delphi voip 应用程序中实现 DirectSound(该应用程序允许多个用户通过网络连接使用 radio )数据通过 UDP 广播传入。就像现在一样,我们在原始数据级别上进行,并自己从多个源进行音频混合,并有一个用于播放所有这些的集中组件。
该应用程序本身是一个 Delphi 5 应用程序,我的任务是将其移植到 Delphi 2010。一旦我到达这个音频播放部分,我们得出的结论是,最好能够摆脱这个旧代码并替换它带有直接声音。
因此,我们的想法是每个 radio 都有一个SecondaryBuffer(我们每个 radio 连接都有一个“面板”,基于我们为每个特定 radio 创建的一组组件),然后让这些将数据添加到各自的SecondaryBuffers每当他们获取数据时,只有在数据耗尽时才会暂停以填充缓冲区中半秒的音频数据。
现在,我陷入了向测试应用程序中的缓冲区添加数据的部分,在开始编写组件以按照我们的方式使用它之前,我只是想让它正常工作想要。
我正在使用 Delphi 的移植 DirectX header ( http://www.clootie.ru/delphi/download_dx92.html )
这些 header 的目的是将常规 DirectSound 接口(interface)移植到 Delphi,因此希望使用 DirectSound 的非 Delphi 程序员也能知道我的问题的原因是什么。
我的SecondaryBuffer(IDirectSoundBuffer)创建如下:
var
BufferDesc: DSBUFFERDESC;
wfx: tWAVEFORMATEX;
wfx.wFormatTag := WAVE_FORMAT_PCM;
wfx.nChannels := 1;
wfx.nSamplesPerSec := 8000;
wfx.wBitsPerSample := 16;
wfx.nBlockAlign := 2; // Channels * (BitsPerSample/2)
wfx.nAvgBytesPerSec := 8000 * 2; // SamplesPerSec * BlockAlign
BufferDesc.dwSize := SizeOf(DSBUFFERDESC);
BufferDesc.dwFlags := (DSBCAPS_GLOBALFOCUS or DSBCAPS_GETCURRENTPOSITION2 or DSBCAPS_CTRLPOSITIONNOTIFY);
BufferDesc.dwBufferBytes := wfx.nAvgBytesPerSec * 4; //Which should land at 64000
BufferDesc.lpwfxFormat := @wfx;
case DSInterface.CreateSoundBuffer(BufferDesc, DSCurrentBuffer, nil) of
DS_OK: ;
DSERR_BADFORMAT: ShowMessage('DSERR_BADFORMAT');
DSERR_INVALIDPARAM: ShowMessage('DSERR_INVALIDPARAM');
end;
我省略了定义 PrimaryBuffer 的部分(它被设置为使用循环标志,并且完全按照 MSDN 所说的那样创建)和 DSInterface,但它就像您想象的 IDirectSoundInterface 一样。
现在,每次我收到音频消息(由我们制作的其他组件检测、解码并转换为适当的音频格式,这些组件已被确认可以工作七年多),我会执行以下操作:
DSCurrentBuffer.Lock(0, 512, @FirstPart, @FirstLength, @SecondPart, @SecondLength, DSBLOCK_FROMWRITECURSOR);
Move(AudioData, FirstPart^, FirstLength);
if SecondLength > 0 then
Move(AudioData[FirstLength], SecondPart^, SecondLength);
DSCurrentBuffer.GetStatus(Status);
DSCurrentBuffer.GetCurrentPosition(@PlayCursorPosition, @WriteCursorPosition);
if (FirstPart <> nil) or (SecondPart <> nil) then
begin
Memo1.Lines.Add('FirstLength = ' + IntToStr(FirstLength));
Memo1.Lines.Add('PlayCursorPosition = ' + IntToStr(PlayCursorPosition));
Memo1.Lines.Add('WriteCursorPosition = ' + IntToStr(WriteCursorPosition));
end;
DSCurrentBuffer.Unlock(@FirstPart, FirstLength, @SecondPart, SecondLength);
AudioData 包含我的消息中的数据。消息始终包含 512 字节的音频数据。我添加了 Memo1.Lines.Add 行,以便能够获得一些调试输出(因为使用断点不太有效,因为 directsound 无论如何都会继续播放主缓冲区的内容)
现在,当我使用循环标志(根据 Hte MSDN 文档足以使其成为流缓冲区)播放 DSCurrentBuffer 并让此代码按需要运行时,备忘录中的输出文本显示:我被允许一直写到缓冲区末尾...但它不会换行。
SecondPart 始终为零。它永远不会绕到缓冲区的开头,这意味着我会一遍又一遍地播放相同的几秒钟音频数据。
是的,我在网上搜索了可以为我们做这些事情的组件,并得出结论,唯一可靠的方法就是我们自己这样做。
是的,这个应用程序播放的音频数据不稳定。我推迟编写半秒缓冲代码,直到我能让写入缓冲区代码按其应有的方式换行:/
我一直在读到人们建议跟踪你自己的写入光标,但从我读到的“锁定和解锁”应该可以帮助我绕过这个需求。我还宁愿避免必须有两个来回交替的缓冲区(或分割缓冲区,本质上是相同的东西,只是编写起来更复杂一点)
非常感谢任何帮助!
最佳答案
所以我找到了问题所在^^;
也很简单。
DSCurrentBuffer.Unlock(@FirstPart, FirstLength, @SecondPart, SecondLength);
我认为我应该将与 Lock() 所需的指针相同的指针传递给指针。
更改为
DSCurrentBuffer.Unlock(FirstPart, FirstLength, SecondPart, SecondLength);
解决了问题,缓冲区现在可以正确换行。
抱歉浪费了您的时间,不过还是谢谢您^^;
关于delphi - 带流缓冲区的 Directsound - 锁不会换行!使用 Delphi 移植的 DirectX header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2116459/
我有一些关于 Directsound 和 Windows 混音器的问题。我的目标是枚举所有麦克风并能够更改每个麦克风的输入音量。我想我离解决方案不远了,但我没有发现我的代码有什么问题。这是我所做的:-
我正在创建一个基本的信号发生器,并决定使用我的声卡作为模拟输出。我选择使用 DirectSound 是因为……它似乎是一个不错的选择。 我已经很好地启动并运行了它,但我现在意识到我的代码使用辅助缓冲区
我需要为我的 C# 应用程序使用直接声音库。 我需要下载 SDK 并安装吗? 库是否已作为 windows xp sp3 的一部分安装? 在 C# 中的引用下,我只包含 microsoft.direc
我正在尝试使用DirectSound从输入中捕获原始数据。 我的问题是,从一个缓冲区到另一个缓冲区的数据只是不一致的,例如,如果捕获一个正弦波,我会看到从上一个缓冲区和新缓冲区的跳跃。为了检测到这一点
是否可以使用 DirectSound 的托管版本向后读取声音?如果没有,是否有另一个库可以轻松实现? 最佳答案 您可以使用 NAudio 中的 WaveFileReader 和 WaveFileWri
我正在做一些涉及 DirectSound 缓冲区的维护工作。我想知道如何解释缓冲区中的元素,即知道缓冲区中的每个值代表什么。此数据来自麦克风。 正在使用此波形格式: WAVEFORMATEXTENSI
我正在尝试通过以下方式初始化 Direct Sound: // Somewhere in my header... #define DIRECT_SOUND_CREATE(name) HRESULT
很简单的问题。在MSDN documentation对于 DirectSound API,他们声明当我的应用程序处于焦点时,它将是唯一可听见的程序。这正是我想要发生的,但是当设置这个标志并通过我的应用
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我正在枚举所有 DirectSound 输出设备并存储它们的描述以供以后在我的进程运行时使用。当我使用 OutputDebugStringW 检查结果时,我得到了正确的设备名称,但附加了不必要的问号。
我正在启动一个最低要求为 Windows 7 的项目。我将使用 NAudio 作为我的音频接口(interface)。我不确定我应该使用什么:DirectSound 还是 WASAPI?我将执行以下操
DirectSound 是 Windows 的最佳音频抽象层吗? 将我的应用程序从构建到特定芯片组的非常糟糕的声音实现切换到抽象层。 应用程序是 native Winform,.net 3.5。 Di
嘿,我有一个简单的 16 位 PCM 播放器,是我使用 DirectSound 制作的。但是当它播放时,它似乎只播放一个扬声器而不是两个扬声器。 我不知道要发布什么代码,所以如果你需要的话,你必须告诉
1。我需要所有设备名称和类型(播放或录音)的列表。我怎样才能得到它们? 2。我还需要确定设备是播放设备还是录音设备。 我所说的设备名称是指在“播放和录制”选项卡下可见的名称(下面的屏幕截图)。我不熟悉
我正在创建一个简单的应用程序,用于记录来自麦克风的输入并将其存储到字节数组中。所以我对此进行了很多搜索,最终使用了 Directx DirectSound。这是我正在使用的代码: using Micr
我正在玩 DirectSound 并尝试使用以下代码播放简单的随机 wav 数据: int _tmain(int argc, _TCHAR* argv[]) { LPDIRECTSOUND8
当我的自定义捕获过滤器不暴露时钟时,谁能给我一个简明的解释,说明 DirectShow DirectSound Audio Renderer 如何以及为什么会调整速率? 我根本无法理解它。当音频开始时
我想知道这样的事情是否可行(并且相对容易做到),如果可行,我该怎么做? 我想对正在复制的波形文件进行频带过滤。类似于您在大多数类似 Winamp 的应用程序中看到的“均衡器”。 然而,我的想法不是均衡
我找到了this有关如何使用 .NET 枚举声音设备信息的信息,但我真的不知道如何在 Python 中使用这些信息。正如您可能知道的那样,我的 Windows API 编程经验几乎为零。 我可以弄清楚
我想将大量音频从其源格式转码为 PCM,而无需重新采样或弄乱样本大小。我想如果 Windows Media Player 可以播放该文件并且它不使用遗留的 ACM 编解码器它必须使用 DirectSo
我是一名优秀的程序员,十分优秀!