如何获取物理设备支持的音频格式(WinAPI、Windows)

2024-02-20

我有一个音频设备(USB 麦克风),我想找出它本机支持的音频格式(位深度和采样率),在 OS X 上有一个很好的 kAudioStreamPropertyAvailablePhysicalFormats Core Audio 属性,但我找不到类似的东西视窗。

我知道有这个问题Windows Core Audio Api 获取捕获设备上所有支持的格式 https://stackoverflow.com/q/35604619/307093 but

  • 答案很糟糕......而且我不受 Windows Core Audio API 的限制,我需要任何方式。

  • Windows 本身以某种方式知道这一点,因此很可能应该有一种方法,例如通过 IOCTL、DirectShow 或 WMI 或其他方式。

  • 也许有一种方法可以让 Spy on Windows 找出它用来枚举格式的内容,但我不知道该怎么做。


Hokay,这里有一些示例代码。这些信息就在那里,分散在网络上,但您必须搜索它。谷歌我在下面调用的函数和一些奇怪的清单常量以了解更多信息。用记事本编写的代码可能无法编译。

下面的代码查询默认的输入/输出设备。要获取任何特定系统上安装的所有设备的 device_id,请调用waveInGetNumDevs or waveOutGetNumDevs并从0开始计数。

#define INITGUID

#include "Ks.h"
#include "KsMedia.h"
#include "mmdeviceapi.h"


// Open a query handle for the default input or output device
// Call Closehandle when done.
static HANDLE QueryOpen (bool input)
{
    DWORD device_id, device_status;
    DWORD err = (input) ?
        waveInMessage ((HWAVEIN) (INT_PTR) WAVE_MAPPER,
            DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR) &device_id, (DWORD_PTR) &device_status) :
        waveOutMessage ((HWAVEOUT) (INT_PTR) WAVE_MAPPER,
            DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR) &device_id, (DWORD_PTR) &device_status);
    if (err)
        return INVALID_HANDLE_VALUE;

    DWORD devicePathSize;
    DWORD mm_result = (input) ? 
        waveInMessage ((HWAVEIN) (INT_PTR) device_id, DRV_QUERYDEVICEINTERFACESIZE,
            (DWORD_PTR) &devicePathSize, 0) :
        waveOutMessage ((HWAVEOUT) (INT_PTR) device_id, DRV_QUERYDEVICEINTERFACESIZE,
            (DWORD_PTR) &devicePathSize, 0);
    if (mm_result != 0)
        return INVALID_HANDLE_VALUE;

    /* apparently DRV_QUERYDEVICEINTERFACE returns a unicode interface path, although this is undocumented */
    WCHAR *devicePath = (WCHAR *) malloc (devicePathSize);

    mm_result = (input) ?
        waveInMessage ((HWAVEIN) (INT_PTR) device_id, DRV_QUERYDEVICEINTERFACE,
            (DWORD_PTR) devicePath, devicePathSize) :
        waveOutMessage ((HWAVEOUT) (INT_PTR) device_id, DRV_QUERYDEVICEINTERFACE,
            (DWORD_PTR) devicePath, devicePathSize);

    HANDLE result = (mm_result == 0) ? CreateFileW (devicePath, FILE_SHARE_READ | FILE_SHARE_WRITE,
        0, NULL, OPEN_EXISTING, 0, NULL) : INVALID_HANDLE_VALUE;

    free (devicePath);
    return result;
}


// Interrogate the default input / output device (demo code)
void InterrogateDefaultDevice (bool input)
{
    HANDLE hQuery = QueryOpen (input);
    if (hQuery == INVALID_HANDLE_VALUE)
        return;

    int pin_count = GetKSFilterPinCount (hQuery);

    for (int pinId = 0; pinId < pin_count; ++pinId)
    {
        KSPIN_COMMUNICATION communication = GetKSFilterPinPropertyCommunication (hQuery, pinId);
        KSPIN_DATAFLOW dataflow = GetKSFilterPinPropertyDataflow (h, pinId);

        if ((communication == KSPIN_COMMUNICATION_SINK || communication == KSPIN_COMMUNICATION_BOTH) &&
            (KSFilterPinPropertyIdentifiersInclude (hQuery, pinId, KSPROPERTY_PIN_INTERFACES,
                &KSINTERFACESETID_Standard, KSINTERFACE_STANDARD_STREAMING) ||
             KSFilterPinPropertyIdentifiersInclude (hQuery, pinId, KSPROPERTY_PIN_INTERFACES,
                &KSINTERFACESETID_Standard, KSINTERFACE_STANDARD_LOOPED_STREAMING)) &&
             KSFilterPinPropertyIdentifiersInclude (hQuery, pinId, KSPROPERTY_PIN_MEDIUMS,
                &KSMEDIUMSETID_Standard, KSMEDIUM_STANDARD_DEVIO))
        {
            KSMULTIPLE_ITEM *item = NULL;

            if (WdmGetPinPropertyMulti (hQuery, pinId, KSPROPERTY_PIN_DATARANGES, &item))
            {
                KSDATARANGE_AUDIO *dr = (KSDATARANGE_AUDIO *) (item + 1);

                for (ULONG i = 0; i < item->Count; ++i )
                {
                    printf ("%ul - %ul Hz (%ul - %ul bits per sample, upto %ul channels)\n",
                        dr->MinimumSampleFrequency, dr->MaximumSampleFrequency,
                        dr->MinimumBitsPerSample, dr->MaximumBitsPerSample, dr->MaximumChannels);

                    dr = (KSDATARANGE_AUDIO *) ((BYTE *) dr + dr->DataRange.FormatSize);
                }

                free (item);
            }
        }
    }

    CloseHandle (hQuery);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取物理设备支持的音频格式(WinAPI、Windows) 的相关文章

  • 如何使用VerQueryValue?

    我有一个 exe 需要从特定 dll 检索版本信息 例如 FileDescription 我的代码已经调用了 GetFileVersionInfoSize 和 GetFileVersionInfo 但我不知道如何应用 VerQueryVal
  • 隐藏错误报告窗口

    我有以下问题 我的 ASP Net 应用程序接收简单控制台程序的 C 源代码 使用 cl exe 命令行 VC 编译器 对其进行编译 并使用 System Diagnostics Process 运行它 ASP Net应用程序运行在PC上
  • Win32 控制台禁用系统菜单按钮

    我想禁用 灰色控制台窗口上的系统菜单按钮 特别是最小化按钮 我已经尝试过上面提到的功能另一个线程 https stackoverflow com questions 15834818 c prevent the console window
  • 在 C# 中打开的资源管理器窗口中获取文件/目录列表

    我试图拉出打开的资源管理器窗口中列出的文件和目录列表 与显示的顺序相同 以便我可以查看它 然后将焦点设置到特定项目 我找到了这段代码here https stackoverflow com questions 14193388 how to
  • 预注册 ATL 窗口类

    我在一个项目中使用了 ATL 和 WTL 的组合 并从中派生了我自己的类CWindowImpl 看起来像这样 class CMyControl public CWindowImpl
  • Windows.Automation 中的旧版 IAccessible

    如何使用C 获取AutomationElement的LegacyIAccessible State和其他LegacyIAccessibles 就像工具中的 Inspect exe 一样 The LegacyIAccessible是新的 并且
  • 向 Windows 服务发送 Windows 消息

    有没有任何工具可以将 WM ENDSESSION 等 Windows 消息发送 模仿 到 Windows 服务 OR 如何使用 C 向进程发送 Windows 消息 我只懂C 编辑 目的 基本上我必须调试 Windows 服务来修复仅在系统
  • 在 C++ 程序中多次使用 FindWindows?

    我使用以下代码 C 来获取窗口 另一个应用程序 的句柄并向其中一个按钮发送消息以模拟单击 并且它可以正常工作 BOOL CALLBACK EnumChildProc HWND hwnd LPARAM lParam mdv test list
  • 为什么 SetCursorPos 将光标位置重置到显示屏的左侧?

    SetCursorPos https learn microsoft com en us windows win32 api winuser nf winuser setcursorpos将光标移动到指定的屏幕坐标 然而 它似乎有一个错误
  • 屏幕截图忽略了一些窗口

    我正在 MFC 中工作 我正在尝试捕获桌面的 bmp 我正在使用 GetDC NULL 来执行此操作 但它似乎忽略了特殊的皮肤窗口 它似乎忽略了用 UpdateLayeredWindow 绘制的窗口 此行为似乎仅发生在 Vista x64
  • 使用 StretchDIBits 使用 Delphi 6 处理条形码图像 - 输出中缺少条形线

    我的应用程序是在 Delphi 6 中开发的 由于后台处理和大量数据 它消耗大约 60MB 120MB 物理内存 这是一个资源密集型应用程序 该应用程序的功能之一是在进行某些处理后创建条形码图像 如果用户继续生成条形码 那么至少十分之一的条
  • Windows 上的 wchar_t 和 char16_t 是一样的吗?

    我有一个实例std u16string 我可以通过它吗c str 到一个 Win32 API 它期望LPCWSTR 没有任何类型的转换 例如 我可以安全地这样做吗 auto u16s std u16string u Hello SetWin
  • VirtualAlloc 对齐方式与分配大小一致吗?

    当使用VirtualAlloc用于分配和提交具有页面边界的两倍大小的虚拟内存区域的 API 例如 void address VirtualAlloc 0 0x10000 MEM COMMIT PAGE READWRITE Get 64KB
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 具有自定义镶边的 WPF 窗口在右侧和底部有不需要的轮廓

    我使用 Microsoft Windows Shell dll 创建了带有自定义镶边的 WPF 窗口 这是代码
  • 如何为 C++ Visual Studio 2019 指定应用程序图标?

    我见过本文档 https learn microsoft com en us visualstudio ide how to specify an application icon visual basic csharp view vs 2
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • 使用 BitBlt 捕获程序窗口始终返回相同的图像

    我编写了以下代码 C Win32 来捕获游戏窗口屏幕并从图像中获取像素颜色数组 函数 autoB 完成这项工作 然后我将结果数组绘制到窗口中以直观地检查我得到的结果 问题是 这个程序在我启动计算机后只工作一次 在第一次 缓存 从游戏中获取的
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 有没有一种方法可以移动文件并能够在中间取消移动?

    我在用着CopyFileEx具有该功能的复制文件 有没有类似的东西可以移动文件 请记住 并非每次移动都很快 移动到不同的驱动器实际上是一个副本 我现在的解决方案是 如果移动到不同的根目录 则复制并删除原始文件 如果移动到相同的根目录 则简单

随机推荐

  • BULK INSERT 失败,行终止符位于最后一行

    我正在将使用 cygwin shell 命令编译的 CSV 导入 MS SQL 2014 使用 BULK INSERT import from D tail csv WITH FIELDTERMINATOR ROWTERMINATOR r
  • 如何使用 QSettings 在 Qt 应用程序中加载设置

    有两种可能的方法 将所有设置加载到某个结构中 按需加载值 哪种方法更好 这取决于您将如何使用您的设置文件 您是否希望允许您的应用程序的用户动态地更改文件中的设置 例如 ini 文件 或者必须通过 GUI 来设置设置 如果您使用某些 GUI
  • d3.js v5 - Promise.all 替换 d3.queue

    我已经使用 d3 js v4 一段时间了 我了解到 Mike Bostock 已将 v5 版本中的 d3 queue 替换为 Promise 原生 JavaScript 对象 我想与您核实一下我编写的这段代码是否正确地 异步 这些 URL
  • Java 中 Date(String s) 的未弃用的完全等效项?

    我有旧代码使用new Date dateString 解析日期字符串 编译代码会产生弃用警告Date java lang String in java util Date has been deprecated javadoc无益地建议我使
  • 带有 lxml 子路径的 XPath 谓词?

    我试图理解发送给我的用于 ACORD XML 表单 保险中的常见格式 的 XPath 他们发给我的 XPath 是 为了简洁而被截断 PersApplicationInfo InsuredOrPrincipal InsuredOrPrinc
  • Hudson -CI 屏幕保护程序设置

    您好 有没有我可以设置一个屏幕保护程序 其中包含在 hudson 中运行的项目列表 该列表指示项目的状态 假设屏幕保护程序的部分表示项目成功 则显示绿色 如果项目构建失败 则显示红色 可能屏幕保护程序必须分区到多个项目 您可以在任何合适的环
  • 将一个时间序列分割为另一个不规则时间序列

    我正在尝试用一个独特的不规则时间序列分割多个 xts 对象 split xts按天 分钟 秒等进行分割 使用断点需要相等长度的向量 当我尝试分割数据时 这会产生错误 dd lt c 2014 02 23 2014 03 12 2014 05
  • 如何正确地将 IsPressed 属性绑定到我的命令参数?

    我制作了一个自定义按钮来将命令绑定到 自定义 路由 IsPressedChanged事件 以便在按下按钮和释放按钮时执行该命令
  • Python - TypeError:“int64”类型的对象不可 JSON 序列化

    我有一个存储商店名称和每日销售额的数据框 我正在尝试使用下面的 Python 脚本将其插入到 Salesforce 但是 我收到以下错误 TypeError Object of type int64 is not JSON serializ
  • Windows 10 上的 VersionNT MSI 属性

    我发现当我更新引导程序的清单以支持 Windows 10 兼容性时 MSI 的 InstallUISequence 将正确设置 VersionNT 1000 但 InstallExecuteSequence 将设置 VersionNT 60
  • 将 UserID 从 ASP.Net 安全地传递到 Javascript

    在我当前正在开发的应用程序中 我们使用 ASP Net 表单身份验证来授予用户对站点的进一步访问权限 该网站面向移动用户 因此我们试图尽可能摆脱服务器的束缚 并利用 KnockoutJS 进行 Web 服务调用并加载数据 以便用户可以查看它
  • Azure 存储将 blob 移动到其他容器

    我正在寻找一种将 Azure 中的 blob 从一个容器移动到另一个容器的方法 我找到的唯一解决方案是使用 Azure 存储数据移动库 但这似乎适用于不同帐户 我想将同一帐户内的 blob 移动到另一个容器 我没用过Azure Storag
  • JUnit。并行运行。但所有测试方法都处理单例实例。怎么解决?

    所以 我有几个JUnit类 每个类都包含一个测试方法列表 每个方法都是相互独立的 没有直接的联系 但我们有间接联系 所有方法都处理一个单例对象 它是Selenium Web Driver实例 是的 我用1Web Driver我所有测试的实例
  • 如何优雅地结束 spring @Schedule 任务?

    我正在尝试让 Spring Boot 服务优雅地结束 它有一个方法 Scheduled注解 该服务使用 spring data 作为数据库 使用 spring cloud stream 作为 RabbitMQ 在计划的方法结束之前 数据库和
  • CSS,如何使水平菜单和子菜单居中?

    我正在学习 css 但我不知道菜单和子菜单居中 我正在使用 margin auto 或 margin left 和 margin right 为 auto 但它不起作用 任何帮助 将不胜感激 谢谢 HTML div ul li a href
  • 如何在JavaScript中不使用输入类型文件读取包含html的文本文件?

    我有一个文本文件assets包含一些要在特定组件的 div 中呈现的 html 的文件夹 有没有一种方法可以读取该文件并将内容分配给字符串变量 而无需用户与 ngOnInit 中的视图 具有输入文件类型 进行交互 我的发现如果我将 html
  • 如何覆盖 CSS

    我有基本的 CSS 经验 所以我想知道如何删除由 Primefaces 设置的 CSS 样式 ui inputfield ui widget content ui inputfield ui widget header ui inputfi
  • Hadoop:映射器和缩减器的数量

    我使用不同数量的映射器和缩减器 例如 1 个映射器和 1 个缩减器 1 个映射器和 2 个缩减器 1 个映射器和 4 个缩减器 在 1 1GB 文件上多次运行 Hadoop MapReduce Hadoop安装在具有超线程的四核机器上 以下
  • JS:未捕获类型错误:对象不是函数(onclick)

    Edit 这是一个 JSfiddle http jsfiddle net XpmZG Edit2 错误在这一行
  • 如何获取物理设备支持的音频格式(WinAPI、Windows)

    我有一个音频设备 USB 麦克风 我想找出它本机支持的音频格式 位深度和采样率 在 OS X 上有一个很好的 kAudioStreamPropertyAvailablePhysicalFormats Core Audio 属性 但我找不到类