-
波形捕捉:(
1
)枚举
捕捉设备
枚
举
捕捉设备
后在网上找到类似翻译:
Direc
tSound
学习笔记
(1)
:枚举声
音设备
作者:
pyundeng
而且作者是在
06
年发表的,哎
~~~
犹豫了半天是否有必要继续翻译下去,
最后打算还是继续写吧。
就当做练英文好了。
刚刚又搜了
p>
下博客圆,没有发现类似文章,所以更坚定要继续写下去。
大家可别怀疑我只是复制粘贴哦,我可是一字一句翻译出来的
,
当然也会参考一些已有的资料。
如果你的应用程序只是单纯得通过用户首选设备用
来捕捉声音,那就没有必要来枚举
可用的设备。当你通过调用
DirectSoundCaptureCreate8
或
p>
DirectSoundFullDuplexCreate8
<
/p>
方法来创建一个设备对象时,你可以声明一个默认
设备。更多信息
,请查看
Creating the Capture Device
Object
。
枚举操作在以下情况下是必须的:
1.
你的应用程序所需的性能并不是所有设备都能满提供。
p>
2.
你的应用程序需要
2
种或以上的设备。
3.
你希望提供用户选择设备的功能。
枚举为了实现三个目的:
1.
指明哪些硬件是可用的。
2.
为每一个设备提供了
一个
GUID
(全局统一标识符)。
3.
允许你为每一个枚举
出来的设备创建一个临时设备对象,这样你就可以获取设备的
性能。
想要枚举设备,
你必须首先设置一个回调函数(在系统中这个函数将会在枚举每个设
备时被调用一次)。
你可以在这个函数内执行任何操作,
你也可以给这个函数随意命
名,但
是你必须根据
DSEnumCallback
的原型声明它。如果想要继续
枚举设备,那么这个回调
函数必须返回
TRUE
,否则返回
FALSE
。比如,在找到一个满足你要求
性能的设备后。
一个回调函数的例子:
下面这个回调函数将每个枚举出来的设备名添加到复选框中,并且将它的
GUID
存储
为数据项。
前三
个参数由设备提供,
第四个参数由
DirectSoundEnumerate
函数传入;
这个参数能被用来传递任何
32
位的值,在本例中则是这个复选框的窗口句柄。在
Windows.h
p>
中定义的宏被用来向复选框中添加字符串和数据。
BOOL CALLBACK
DSEnumProc(LPGUID lpGUID,
LPCTSTR lpszDesc,
LPCTSTR
lpszDrvName,
LPVOID
lpContext )
{
HWND
hCombo = (HWND)lpContext;
LPGUID
lpTemp = NULL;
if
(lpGUID != NULL)
// NULL only for
{
if
((lpTemp = (LPGUID)malloc(
sizeof
(GUID))) == NULL)
{
return
(TRUE);
}
memcpy(lpTemp, lpGUID,
sizeof
(GUID));
}
ComboBox_AddString(hCombo, lpszDesc);
ComboBox_SetItemData(hCombo,
ComboBox_FindString(hCombo,
0
, lpszDesc),
lpTemp );
free(lpTemp);
return
(TRUE);
}
枚举在包含复选框的对话框被初始化的时候启动。假设
hCombo
是这个复选框的句
柄而
hDlg
是这个对话的句柄。
if
(FAILED(DirectSoundEnumer
ate((LPDSENUMCALLBACK)DSEnumProc,
(VOID*)&hCombo)))
{
EndDialog(hDlg, TRUE);
return
(TRUE);
}
在这个例子中,复选框的句柄地址被传递到
DirectSoundEnumerate
中,而
DirectSoundEnumerate
则传递它到回调
函数中。这个参数可以是任何你想在回调函数
中访问的
32
p>
位值。
第一个被枚举出来的设备通常被称为主声音设备,
此时这个回调函数的
lpGUID
参数
为
NU
LL
。这个设备代表了用户在控制面板中设置的首选播放设备。当用户选择设备时,
p>
它被单独枚举出来以便应用程序能够轻松的将主声音设备添加到列表上。
主设备也是通过它
正确的名字和
GUID
< br>被枚举出来的。
波形捕捉:(
2
)创建捕捉设备对象
创建
“
p>
捕捉设备对象
”
你可以通过调用
DirectSoundCaptureCreate8
或
DirectSoundFullDuplexCreate8
函数来创建一个捕捉设备对象。这两个函数都获取
一个指向
IDirectSoundCapture8
接口的指针。
DirectSoundCaptureCreate
的
p>
lpcGUID
参数或
DirectSou
ndFullDuplexCreate8
的
pcGuidR
enderDevice
参数可以是一个由枚举
得到的
GUID
,或者是如下预定义的
GUID
之一:
GUID
DSDEVID_DefaultCapture
Description
系统默认的
声音捕捉设备。你也可以通过传递一个
NULL
指针而不是设备
GUID
来指定一个设备。
DSDEV
ID_DefaultVoiceCapture
默认声音沟通设备。通常情况下,这
是一个辅助设备如带麦克风的
USB
耳机。
如果当前没有设备驱动,则调用失败。
你也可以使用
CoCreateInstance
函数来创建一个对象。
这个过程与创建设备对象
类
似。步骤如下:
1.<
/p>
在应用程序启动时通过调用
CoInitializeEx
p>
函数初始化
COM
对象
HRESULT hr =
CoInitializeEx(NULL,
0
);
if
(FAILED(hr))
{
ErrorHandler(hr);
// Add error-
handling here.
}
2.
< br>通过调用
CoCreateInstance
方法和<
/p>
IDirectSound8::Initialize
方法创建
设备对象,而不是使用
DirectSoundCreate8
函数
LPDIRECTSOUND8 lpds;
hr =
CoCreateInstance(&CLSID_DirectSound8,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDirectSound8,
(LPVOID*) &lpds);
if
(FAILED(hr))
{
ErrorHandler(hr);
// Add error-handling here.
}
CLSID_DirectSound8
是
DirectSound
驱动对象类的类标识符,
I
ID_IDirectSound8
是接口标识符。
lpds
参数接收这个接口的指针。
3.
调用
IDirectSound8
::Initialize
方法来关联对象和设备。
这个方法使
用的参数
与
DirectSoundCreate8
使用的设备
GUID
参数相同。
hr =
lpds->Initialize(NULL);
if
(FAILED(hr))
{
ErrorHandler(hr);
// Add error-handling here.
}
4.
在你结束应用程
序的时候,
通过调用
CoUninitialize
函数来结束
COM
库,
如
下:
CoUninitialize();
如果你使用
CoCreateInstance
,
那么用户在
控制面板中选择的默认捕捉设备对象
将被创建。
如果你想要播放设备对
象和捕捉设备对象同时存在,那么你应该在创建和初始化捕捉
设备对象前创建并初始化播
放设备对象,
或者使用
DirectSoundFullDup
lexCreate8
。
有些音频设备默认没有设定为全双工音频。如果你
的应用程序在创建和初始化播放设
备对象和捕捉设备对象时出现问题,
< br>你应该建议用户检查音频设备属性,
从而确保全双工已
经
被启用了。
波形捕捉:(
3
)
捕捉设备
性能
捕捉设备
性能
调用
IDirectSoundCapture8::GetCaps
方法来获取捕捉
设备的性能。这个方法
的参数是一个指向
DSCCAPS
结构体的指针。
就如
同其它结构体一样,
你在传递这个参数
之前必须初始化
dwSize
成员。返回后,这个结构体中
包含设备支持的声道的数量,一组
设备支持的格式数据集,相当于
Win32 WAV
音频函数中使用的
WAVEINCAPS
结构体中
的值。
在没有
WDM
驱动的情况下,在同一时刻只能有一个应用程序使用捕捉设备。如果驱
动支持多个应
用程序并发使用设备,在
DSCCAPS
的
dwFlags
成员返回
DSCCAPS_MULTIPLECAPTURE
。每一个应用程序可以为捕捉缓冲区设置它自己的格式。
p>
波形捕捉:(
4
)创建一个
“
捕捉缓冲区
”
创建一个
“
捕捉缓冲区
”
调用
ID
irectSoundCapture8::CreateCaptureBuffer
方法创建一个捕捉缓冲区。
该方法的其中一个参数是一个
DSCBUFFERDESC
结构体,该结构体描述了你想得到的缓
冲区的特性。该结构体的
最后一个成员是一个
WAVEFORMATEX
结构体。这个结构体必
须用具体的
WAV
格式来初始化。
注
意:
如果你的应用程序在播放声音的同时捕捉这些声音,
当捕捉
缓冲区的格式和主缓冲区
的不一样,
那么捕捉缓冲区的创建将会
失败。
其原因是有些声卡只有单一的时钟频率,
不支
持以两种不同的频率来捕捉和播放。
下面的函数创建了一个捕捉缓冲区,这个缓冲区将会容纳
1
秒钟的数据。注意:捕捉设备
对象的接口要作为一个参数传入时,该接口必须
通过
DirectSoundCaptureCreate8
函数得到,而不是使用以前的
DirectSoundCapt
ureCreate
函数;否则这个缓冲区将不支持
IDire
ctSoundCaptureBuffer8
接口。
HRESULT
CreateCaptureBuffer(LPDIRECTSOUNDCAPTURE8 pDSC,
LPDIRECTSOUNDCAPTUREBUFFER8* ppDSCB8)
{
HRESULT hr;
DSCBUFFERDESC dscbd;
LPDIRECTSOUNDCAPTUREBUFFER pDSCB;
WAVEFORMATEX wfx =
{WAVE_FORMAT_PCM,
2
,
44100
,
176400
,
4
,
16
,
0
};
// wFormatTag, nChannels,
nSamplesPerSec, mAvgBytesPerSec,
//
nBlockAlign, wBitsPerSample, cbSize
if
((NULL ==
pDSC) || (NULL == ppDSCB8))
return
E_INVALIDARG;
=
sizeof
(DSCBUFFERDESC);
s =
0
;
erBytes = tesPerSec;
rved =
0
;
ormat
= &wfx;
unt =
0
;
XDesc =
NULL;
if
(SUCCEEDED(hr =
pDSC->CreateCaptureBuffer(&dscbd, &pDSCB, NULL)))
{
hr = pDSCB->QueryInt
erface(IID_IDirectSoundCaptureBuffer8,
(LPVOID*)ppDS
CB8);
pDSCB->Release();
}
return
hr;
}
波形捕捉:(
5
)
“<
/p>
捕捉缓冲区
”
信息
“
捕捉缓冲区
”
< br>信息
你可以使用
IDirectSoun
dCaptureBuffer8::GetCaps
方法获
取
捕捉缓冲区
的大小。
在使用
DSCBCAPS
结构体做为参数传递前,
确保已经对该结构体的
dwSize
成
员进行了初始化。
想要获取缓冲区创建时的格式信息,可以调
用
IDirectSoundCapture
Buffer8::GetFormat
方法。该方法以一
个
WAVEFORMATEX
结构体的形式返回格式信息。
注意:你的应用程序能够允许因第一次使用
NULL
作为
pwfxFormat
参数调用这个
GetFormat
方法时
WAVEFORMATEX
结构体中存在额外的格式信息。在
这种情况下,
由
lpdwSizeWritten
参数所指向的
DWORD
需要完整的格式信息才能接收到这个结构
体的大小。
想要探知一个捕捉缓冲区当前正在处理的操作
,可以调用
IDirectSoundCaptureBuffer8::GetSta
tus
方法。这个方法利用相结合的标志位来
填充一个
DWORD
类型的变量。
< br>这些标志位用于表明缓冲区当前是否忙于捕捉,
如果是的
话,那么是否循环;如果循环,那么在最后一次调用
IDirectSoundCapt
ureBuffer8::Start
方法时
DSCBSTART_LOOPING
标志是否
被设置。
IDirectSoundCaptureBuff
er8::GetCurrentPosition
方法返回读指针和捕
捉指针在缓冲区内的偏移量。
读指针位于当前已经被完全捕捉到缓冲区的数据
末尾。
捕捉指
针位于当前将要从硬件中复制的数据块的末尾。<
/p>
你可以安全地从小于读指针偏移量的缓冲区
中拷贝数据。
波形捕捉:(
6
)<
/p>
“
捕捉缓冲区
”
通知
“
捕捉缓冲区
< br>”
通知
-
-
-
-
-
-
-
-
-
上一篇:描写星空的词语
下一篇:实验二用Ethereal软件工具捕获报文并进行分析