获取语音设备并创建Interface
 
    DirectSound开发中常常需要获取系统当前可用的语音设备列表,在SDK Samples中最先介绍了它。DirectX将它封装成函数DirectSoundEnumerate/DirectSoundCaptureEnumerate,我们所要做的只是以DSEnumCallback作为接口模板,添加一个自定义的回调函数,然后简单的调用一下即可。
    获取设备列表后,创建DirectSound环境使用函数DirectSoundCreate8/DirectSoundCaptureCreate8。

下面是示例源代码:

/*----------------------------------------------------------------------------------
*  File: EnumDevices.cpp
*
*  Desc: This sample shows how to enumerate DirectSound sound and capture devices.
*
*  Copyright (c) Microsoft Corp. All rights reserved.
*
*
*  DirectSoundEnumerate
*  DirectSoundCaptureEnumerate
*  DirectSoundCreate8
*  DirectSoundCaptureCreate8
*  DXTRACE_ERR_MSGBOX : 在DEBUG模式下用来显示错误信息
*  DSEnumCallback     : 用来枚举设备的回调函数
*-----------------------------------------------------------------------------------*/

#include <windows.h>
#include <dxerr9.h>
#include <dsound.h>
#include "resource.h"

#pragma comment( lib,"Dsound.lib" )
#ifdef _DEBUG
    #pragma comment( lib,"dxerr9.lib" )
#endif

INT_PTR CALLBACK MainDlgProc( HWND,UINT,WPARAM,LPARAM );
INT_PTR CALLBACK DSoundEnumCallback( GUID*,LPSTR, LPSTR,VOID* );
HRESULT OnInitDialog( HWND );
HRESULT InitDirectSound( HWND );
HRESULT FreeDirectSound();

#define SAFE_DELETE(p)  { if(p) { delete (p);     (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }

LPDIRECTSOUND8        g_pDS        = NULL; //用来存放IDirectSound8 interface地址
LPDIRECTSOUNDCAPTURE8 g_pDSCapture = NULL; //用来存放IDirectSoundCapture8 interface地址

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pszCmdLine, int iCmdShow)
{
    //初始化COM, 可参考DirectX开发文档中创建COM对象部分(Creating a COM Object)
    CoInitialize( NULL );

// Display the main dialog box.
    DialogBox( hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc );

//释放COM
    CoUninitialize();

return TRUE;
}

//主窗口回调函数
INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
    HRESULT hr;

switch( msg )
    {
        case WM_INITDIALOG:
            if( FAILED( hr = OnInitDialog( hDlg ) ) )
            {
                DXTRACE_ERR_MSGBOX( TEXT("OnInitDialog"), hr );
                MessageBox( hDlg, "枚举DirectSound设备错误,程序退出.", "EnumDevices", MB_OK | MB_ICONERROR );
                EndDialog( hDlg, IDABORT );
            }
            break;

case WM_COMMAND:
            switch( LOWORD(wParam) )
            {
                case IDC_BUTTON_CREATE:
                    //尝试创建
                    if( SUCCEEDED( hr = InitDirectSound( hDlg ) ) )
                        MessageBox( hDlg, TEXT("创建DirectSound interface成功."), TEXT("EnumDevices"), MB_OK );
                    else
                    {
                        DXTRACE_ERR_MSGBOX( TEXT("InitDirectSound"), hr );
                        MessageBox( hDlg, TEXT("创建DirectSound interface失败."), TEXT("EnumDevices"), MB_OK | MB_ICONERROR );
                    }
                    break;

case IDOK:
                    EndDialog( hDlg, IDCANCEL );
                    break;

default:
                    return FALSE;
            }
            break;

case WM_DESTROY:
            FreeDirectSound(); //不要忘记释放设备
            break;

default:
            return FALSE;
    }
    return TRUE;
}

//初始化窗体
HRESULT OnInitDialog( HWND hDlg )
{
    HRESULT hr;

//枚举sound devices并添加到组合框中
    HWND hSoundDeviceCombo = GetDlgItem( hDlg, IDC_COMBO_SOUND_DEVICE );
    if( FAILED( hr = DirectSoundEnumerate( (LPDSENUMCALLBACK)DSoundEnumCallback, (VOID*)hSoundDeviceCombo ) ) )
        return DXTRACE_ERR_MSGBOX( TEXT("DirectSoundEnumerate"), hr );

//枚举capture devices并添加到组合框中
    HWND hCaptureDeviceCombo = GetDlgItem( hDlg, IDC_COMBO_CAPTURE_DEVICE );
    if( FAILED( hr = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK)DSoundEnumCallback, (VOID*)hCaptureDeviceCombo ) ) )
        return DXTRACE_ERR_MSGBOX( TEXT("DirectSoundCaptureEnumerate"), hr );

//选中组合框中的第一个设备
    SendMessage( hSoundDeviceCombo,   CB_SETCURSEL, 0, 0 );
    SendMessage( hCaptureDeviceCombo, CB_SETCURSEL, 0, 0 );

return S_OK;
}

//供枚举函数使用的回调函数
INT_PTR CALLBACK DSoundEnumCallback( GUID* pGUID, LPSTR strDesc, LPSTR strDrvName, VOID* pContext )
{
    //注意定义为静态变量
    static GUID  AudioDriverGUIDs[20]; //预留20个设备的存储空间
    static DWORD dwAudioDriverIndex = 0;

GUID* pTemp  = NULL;

if( pGUID )
    {
        if( dwAudioDriverIndex >= 20 )
            return TRUE;

pTemp = &AudioDriverGUIDs[dwAudioDriverIndex++];
        memcpy( pTemp, pGUID, sizeof(GUID) );
    }

HWND hSoundDeviceCombo = (HWND)pContext;

//把设备名称添加到组合框中
    SendMessage( hSoundDeviceCombo, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)strDesc );

//获取当前设备名称在组合框中的索引值
    int nIndex = (int)SendMessage( hSoundDeviceCombo, CB_FINDSTRING, 0, (LPARAM) (LPCTSTR) strDesc );

//将存储在AudioDriverGUIDs设备数组中的GUID保存到对应项中
    SendMessage( hSoundDeviceCombo, CB_SETITEMDATA, nIndex, (LPARAM) pTemp );

return TRUE;
}

//创建IDirectSound
HRESULT InitDirectSound( HWND hDlg )
{
    HRESULT hr;

//首先释放当前可能使用的DirectSound对象
    FreeDirectSound();

HWND hSoundDeviceCombo   = GetDlgItem( hDlg, IDC_COMBO_SOUND_DEVICE );
    HWND hCaptureDeviceCombo = GetDlgItem( hDlg, IDC_COMBO_CAPTURE_DEVICE );

int nSoundIndex   = (int)SendMessage( hSoundDeviceCombo,   CB_GETCURSEL, 0, 0 );
    int nCaptureIndex = (int)SendMessage( hCaptureDeviceCombo, CB_GETCURSEL, 0, 0 );

//获取当前选择项所对应的GUID数据
    GUID* pSoundGUID   = (GUID*) SendMessage( hSoundDeviceCombo, CB_GETITEMDATA, nSoundIndex, 0 );
    GUID* pCaptureGUID = (GUID*) SendMessage( hCaptureDeviceCombo, CB_GETITEMDATA, nCaptureIndex, 0 );

//使用所选设备创建IDirectSound
    if( FAILED( hr = DirectSoundCreate8( pSoundGUID, &g_pDS, NULL ) ) )
        return DXTRACE_ERR_MSGBOX( TEXT("DirectSoundCreate"), hr );

//作为一个示例,我们尝试创建后马上释放掉.
    SAFE_RELEASE( g_pDS );

//使用所选设备创建IDirectSoundCapture
    if( FAILED( hr = DirectSoundCaptureCreate8( pCaptureGUID, &g_pDSCapture, NULL ) ) )
        return DXTRACE_ERR_MSGBOX( TEXT("DirectSoundCaptureCreate"), hr );

//释放
    SAFE_RELEASE( g_pDSCapture );

return S_OK;
}

//释放对象
HRESULT FreeDirectSound()
{
    SAFE_RELEASE( g_pDSCapture );
    SAFE_RELEASE( g_pDS );

return S_OK;

}

DirectSound开发相关推荐

  1. DirectSound开发指南(1)

    1DirectSound简介(Introduction to DirectSound) 曾经学习过Directshow的开发,对于Dsound一直没有仔细的莱学习,以前只是知道Dsound是做音频开发 ...

  2. DirectSound开发指南

    1DirectSound简介(Introduction to DirectSound) 曾经学习过Directshow的开发,对于Dsound一直没有仔细的莱学习,以前只是知道Dsound是做音频开发 ...

  3. Directsound开发指南(4)

    4DirectSound开发高级技巧 4.1Dsound驱动模型(DirectSound Driver Models) 在VXD驱动模型下,所有的DirectSound的混音工作都是由Dsound.v ...

  4. Directsound开发指南(2)

    3.2Dsound的buffer对象(DirectSound Buffers) 在存储和播放几个音频流的时候,你的应用程序要给每一个音频流都要创建一个辅助缓冲区(buffer)对象. 辅助缓冲区可以和 ...

  5. DirectSound播放音频应用程序开发快速入门

    [来源天极网] 摘要:DirectSound编程的入门介绍,通过实例讲解了如何利用DirectSound最基本的功能-----播放音频,并提供了DirectSound播放音频文件的两种方式(Stati ...

  6. Directsound 详解

    关键词: Directsound stream buffer ,static buffer wave 文件播放 一.配置DirectDounf的开发环境 在进行DirectSound开发之前,一定要设 ...

  7. 用DirectX Audio和DirectShow播放声音和音乐

    项目中的声音播放效果,原来使用MFC对话框的播放测试例子已经通过.但是和项目结合起来有莫名异常发生还需要再继续研究一下声音的播放. 现在暂时使用playSound方法实现,但是还是要实现混音播放效果才 ...

  8. java知识体系介绍

    国内最牛七星级团队马士兵.高淇等11位十年开发经验专家录制 目 录 百战程序员Java1573题 2百战程序员介绍 3JavaSE编程基础 9第一章 初识Java 9阶段项目课程1 11第二章 数据类 ...

  9. TXT音乐播放器与DirectSound与C++,开发笔记与EXE免费下载(一)

    一.前言 之前提到,使用C语言开发TXT音乐播放器.使用PlaySound方法播放wav文件时,无法同时播放多个wav文件:当开始播放下一个wav文件时,之前正在播放的wav文件就会停止,导致音乐播放 ...

最新文章

  1. mysql用户控制登录_MySql用户权限控制_MySQL
  2. 重载和覆盖的区别?(overload vs override)
  3. BidNet:无视差估计的双目图像去雾(CVPR2020)
  4. vbs代码炫酷效果_Python|实现黑客帝国代码雨效果
  5. mybatis xml 参数 使用
  6. android 手机内存uri_android 的各种目录详解
  7. java中aop和aoc的区别_AOC与AOP的区别
  8. 【测试沉思录】3. 如何测试微信公众号?
  9. 100个经典C语言程序(益智类问题)
  10. 审车的时候环保怎样安全通过_车审环保过不了如何处理
  11. 商城店铺入驻系统_商家入驻开设店铺功能逻辑与流程设计
  12. 解决win10下WIFI无法连接到网络
  13. tensorflow-----张量的合并
  14. WORD设置从开始页数算总页数
  15. 关于蓝桥杯/STEMA(青少年创意编程组),你应该了解的那些事
  16. php7.0 官网下载,PHP For Windows
  17. 1046: 奇数的乘积 C语言
  18. 图压---介绍一款好用的图像压缩软件
  19. 我会接受长期出差而高工资的工作
  20. java读取csv文件行数_java读取巨大csv的行数

热门文章

  1. IntelliJ IDEA tomcat配置
  2. eureka注册中心HA集群搭建
  3. 最全的B端产品经理干货知识(2)
  4. 波音737-800座位图哪个好_「科普」汽车哪个座位才安全?很多人都不知道
  5. 【Java】Maven报错 Dependency ‘aspectj:aspectjrt:1.5.4‘ not found 的解决方法
  6. Python 中的解析命令行参数
  7. C++学习笔记系列三
  8. Gym-100935I Farm 计算几何 圆和矩形面积交
  9. UI组件-UITabbarController
  10. SPARK全栈 全流程 大数据实战 之 技术选型篇