日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DirectSound开发

發(fā)布時(shí)間:2025/3/15 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DirectSound开发 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
獲取語音設(shè)備并創(chuàng)建Interface
?
??? DirectSound開發(fā)中常常需要獲取系統(tǒng)當(dāng)前可用的語音設(shè)備列表,在SDK Samples中最先介紹了它。DirectX將它封裝成函數(shù)DirectSoundEnumerate/DirectSoundCaptureEnumerate,我們所要做的只是以DSEnumCallback作為接口模板,添加一個(gè)自定義的回調(diào)函數(shù),然后簡單的調(diào)用一下即可。
??? 獲取設(shè)備列表后,創(chuàng)建DirectSound環(huán)境使用函數(shù)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模式下用來顯示錯(cuò)誤信息
*? DSEnumCallback???? : 用來枚舉設(shè)備的回調(diào)函數(shù)
*-----------------------------------------------------------------------------------*/

#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開發(fā)文檔中創(chuàng)建COM對象部分(Creating a COM Object)
??? CoInitialize( NULL );

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

??? //釋放COM
??? CoUninitialize();

??? return TRUE;
}

//主窗口回調(diào)函數(shù)
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設(shè)備錯(cuò)誤,程序退出.", "EnumDevices", MB_OK | MB_ICONERROR );
??????????????? EndDialog( hDlg, IDABORT );
??????????? }
??????????? break;

??????? case WM_COMMAND:
??????????? switch( LOWORD(wParam) )
??????????? {
??????????????? case IDC_BUTTON_CREATE:
??????????????????? //嘗試創(chuàng)建
??????????????????? if( SUCCEEDED( hr = InitDirectSound( hDlg ) ) )
??????????????????????? MessageBox( hDlg, TEXT("創(chuàng)建DirectSound interface成功."), TEXT("EnumDevices"), MB_OK );
??????????????????? else
??????????????????? {
??????????????????????? DXTRACE_ERR_MSGBOX( TEXT("InitDirectSound"), hr );
??????????????????????? MessageBox( hDlg, TEXT("創(chuàng)建DirectSound interface失敗."), TEXT("EnumDevices"), MB_OK | MB_ICONERROR );
??????????????????? }
??????????????????? break;

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

??????????????? default:
??????????????????? return FALSE;
??????????? }
??????????? break;

??????? case WM_DESTROY:
??????????? FreeDirectSound(); //不要忘記釋放設(shè)備
??????????? 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 );

??? //選中組合框中的第一個(gè)設(shè)備
??? SendMessage( hSoundDeviceCombo,?? CB_SETCURSEL, 0, 0 );
??? SendMessage( hCaptureDeviceCombo, CB_SETCURSEL, 0, 0 );

??? return S_OK;
}

//供枚舉函數(shù)使用的回調(diào)函數(shù)
INT_PTR CALLBACK DSoundEnumCallback( GUID* pGUID, LPSTR strDesc, LPSTR strDrvName, VOID* pContext )
{
??? //注意定義為靜態(tài)變量
??? static GUID? AudioDriverGUIDs[20]; //預(yù)留20個(gè)設(shè)備的存儲(chǔ)空間
??? 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;

??? //把設(shè)備名稱添加到組合框中
??? SendMessage( hSoundDeviceCombo, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)strDesc );

??? //獲取當(dāng)前設(shè)備名稱在組合框中的索引值
??? int nIndex = (int)SendMessage( hSoundDeviceCombo, CB_FINDSTRING, 0, (LPARAM) (LPCTSTR) strDesc );

??? //將存儲(chǔ)在AudioDriverGUIDs設(shè)備數(shù)組中的GUID保存到對應(yīng)項(xiàng)中
??? SendMessage( hSoundDeviceCombo, CB_SETITEMDATA, nIndex, (LPARAM) pTemp );

??? return TRUE;
}

//創(chuàng)建IDirectSound
HRESULT InitDirectSound( HWND hDlg )
{
??? HRESULT hr;

??? //首先釋放當(dāng)前可能使用的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 );

??? //獲取當(dāng)前選擇項(xiàng)所對應(yīng)的GUID數(shù)據(jù)
??? GUID* pSoundGUID?? = (GUID*) SendMessage( hSoundDeviceCombo, CB_GETITEMDATA, nSoundIndex, 0 );
??? GUID* pCaptureGUID = (GUID*) SendMessage( hCaptureDeviceCombo, CB_GETITEMDATA, nCaptureIndex, 0 );

??? //使用所選設(shè)備創(chuàng)建IDirectSound
??? if( FAILED( hr = DirectSoundCreate8( pSoundGUID, &g_pDS, NULL ) ) )
??????? return DXTRACE_ERR_MSGBOX( TEXT("DirectSoundCreate"), hr );

??? //作為一個(gè)示例,我們嘗試創(chuàng)建后馬上釋放掉.
??? SAFE_RELEASE( g_pDS );

??? //使用所選設(shè)備創(chuàng)建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;

?
?}

總結(jié)

以上是生活随笔為你收集整理的DirectSound开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。