关键词不能为空

当前您在: 主页 > 英语 >

波形捕捉

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-03-02 20:32
tags:

-

2021年3月2日发(作者:苹果绿)


波形捕捉:(


1


)枚举



捕捉设备




枚 举



捕捉设备





后在网上找到类似翻译:


Direc tSound


学习笔记


(1)


:枚举声 音设备



作者:


pyundeng


而且作者是在


06


年发表的,哎


~~~


犹豫了半天是否有必要继续翻译下去,


最后打算还是继续写吧。


就当做练英文好了。


刚刚又搜了


下博客圆,没有发现类似文章,所以更坚定要继续写下去。



大家可别怀疑我只是复制粘贴哦,我可是一字一句翻译出来的


,


当然也会参考一些已有的资料。





如果你的应用程序只是单纯得通过用户首选设备用 来捕捉声音,那就没有必要来枚举


可用的设备。当你通过调用



DirectSoundCaptureCreate8



DirectSoundFullDuplexCreate8


< /p>


方法来创建一个设备对象时,你可以声明一个默认


设备。更多信息 ,请查看


Creating the Capture Device Object






枚举操作在以下情况下是必须的:




1.


你的应用程序所需的性能并不是所有设备都能满提供。




2.


你的应用程序需要


2


种或以上的设备。




3.


你希望提供用户选择设备的功能。





枚举为了实现三个目的:




1.


指明哪些硬件是可用的。




2.


为每一个设备提供了 一个


GUID


(全局统一标识符)。




3.


允许你为每一个枚举 出来的设备创建一个临时设备对象,这样你就可以获取设备的


性能。




想要枚举设备, 你必须首先设置一个回调函数(在系统中这个函数将会在枚举每个设


备时被调用一次)。


你可以在这个函数内执行任何操作,


你也可以给这个函数随意命 名,但


是你必须根据



DSEnumCallback


的原型声明它。如果想要继续 枚举设备,那么这个回调


函数必须返回


TRUE


,否则返回


FALSE


。比如,在找到一个满足你要求 性能的设备后。




一个回调函数的例子:




下面这个回调函数将每个枚举出来的设备名添加到复选框中,并且将它的


GUID


存储


为数据项。


前三 个参数由设备提供,


第四个参数由



DirectSoundEnumerate



函数传入;


这个参数能被用来传递任何


32

< p>
位的值,在本例中则是这个复选框的窗口句柄。在


Windows.h


中定义的宏被用来向复选框中添加字符串和数据。




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


位值。



第一个被枚举出来的设备通常被称为主声音设备,


此时这个回调函数的



lpGUID


参数




NU LL


。这个设备代表了用户在控制面板中设置的首选播放设备。当用户选择设备时,


它被单独枚举出来以便应用程序能够轻松的将主声音设备添加到列表上。

主设备也是通过它


正确的名字和


GUID

< br>被枚举出来的。






波形捕捉:(


2

)创建捕捉设备对象



创建



捕捉设备对象






你可以通过调用


DirectSoundCaptureCreate8



DirectSoundFullDuplexCreate8



函数来创建一个捕捉设备对象。这两个函数都获取


一个指向

< p>
IDirectSoundCapture8


接口的指针。





DirectSoundCaptureCreate



lpcGUID


参数或


DirectSou ndFullDuplexCreate8



pcGuidR enderDevice


参数可以是一个由枚举


得到的


GUID


,或者是如下预定义的


GUID


之一:



GUID



DSDEVID_DefaultCapture


Description



系统默认的 声音捕捉设备。你也可以通过传递一个


NULL


指针而不是设备


GUID


来指定一个设备。


DSDEV ID_DefaultVoiceCapture


默认声音沟通设备。通常情况下,这 是一个辅助设备如带麦克风的


USB


耳机。



如果当前没有设备驱动,则调用失败。





你也可以使用


CoCreateInstance

< p>
函数来创建一个对象。


这个过程与创建设备对象


类 似。步骤如下:




1.< /p>


在应用程序启动时通过调用


CoInitializeEx


函数初始化


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

< p>
函数来结束


COM


库,


如 下:



CoUninitialize();




如果你使用

< p>
CoCreateInstance



那么用户在 控制面板中选择的默认捕捉设备对象


将被创建。





如果你想要播放设备对 象和捕捉设备对象同时存在,那么你应该在创建和初始化捕捉


设备对象前创建并初始化播 放设备对象,


或者使用


DirectSoundFullDup lexCreate8






有些音频设备默认没有设定为全双工音频。如果你 的应用程序在创建和初始化播放设


备对象和捕捉设备对象时出现问题,

< br>你应该建议用户检查音频设备属性,


从而确保全双工已


经 被启用了。



波形捕捉:(


3




捕捉设备



性能




捕捉设备



性能






调用

IDirectSoundCapture8::GetCaps


方法来获取捕捉 设备的性能。这个方法


的参数是一个指向



DSCCAPS


结构体的指针。


就如 同其它结构体一样,


你在传递这个参数


之前必须初始化



dwSize


成员。返回后,这个结构体中 包含设备支持的声道的数量,一组


设备支持的格式数据集,相当于


Win32 WAV


音频函数中使用的


WAVEINCAPS


结构体中


的值。





在没有



WDM

驱动的情况下,在同一时刻只能有一个应用程序使用捕捉设备。如果驱


动支持多个应 用程序并发使用设备,在



DSCCAPS




dwFlags


成员返回


DSCCAPS_MULTIPLECAPTURE


。每一个应用程序可以为捕捉缓冲区设置它自己的格式。



波形捕捉:(


4


)创建一个



捕捉缓冲区



< p>
创建一个



捕捉缓冲区





调用


ID irectSoundCapture8::CreateCaptureBuffer



方法创建一个捕捉缓冲区。



该方法的其中一个参数是一个


DSCBUFFERDESC


结构体,该结构体描述了你想得到的缓


冲区的特性。该结构体的 最后一个成员是一个



WAVEFORMATEX

< p>
结构体。这个结构体必


须用具体的


WAV


格式来初始化。




注 意:


如果你的应用程序在播放声音的同时捕捉这些声音,


当捕捉 缓冲区的格式和主缓冲区


的不一样,


那么捕捉缓冲区的创建将会 失败。


其原因是有些声卡只有单一的时钟频率,


不支

< p>
持以两种不同的频率来捕捉和播放。




下面的函数创建了一个捕捉缓冲区,这个缓冲区将会容纳


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>”


通知


-


-


-


-


-


-


-


-



本文更新与2021-03-02 20:32,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/692891.html

波形捕捉的相关文章