您的位置:首页 > 其它

波形捕捉:(9)写入到WAV文件

2008-10-24 13:42 239 查看
写入到WAV文件

WAV文件为资源交换文件格式(RIFF),包括若干数量的命名块,其中包含头信息(如声音采样格式)或数据(如样本本身)。Win 32 API提供了打开关闭FIFF文件、查找块等函数。这些函数的名字都以“mmio”开头。

DirectSound API 不包括写入WAV文件的方法。但是 DXUTsound.cpp 文件实现了一个 CWaveFile 类,这个类具有以下管理捕捉文件的方法:

·Open 方法。打开一个文件并且写入头部块。

·Write 方法。将数据从缓冲区写入到数据块中并且提高写指针。

·Close 方法。将数据块的大小写入到头部并且关闭文件。

写入到一个WAV文件的第一步是调用 CWaveFile::Open 方法。这样会创建一个文件并且写WAV格式块。参数为文件名,一个指向初始化后的WAVEFORMATEX 结构体的指针和 WAVEFILE_WRITE 标志。这个方法返回一个 HRESULT。

下面的代码为写入打开了一个WAV文件:

Code

HRESULT RecordCapturedData()

{

HRESULT hr;

VOID* pbCaptureData = NULL;

DWORD dwCaptureLength;

VOID* pbCaptureData2 = NULL;

DWORD dwCaptureLength2;

VOID* pbPlayData = NULL;

UINT dwDataWrote;

DWORD dwReadPos;

LONG lLockSize;

if (NULL == g_pDSBCapture)

return S_FALSE;

if (NULL == g_pWaveFile)

return S_FALSE;

if (FAILED (hr = g_pDSBCapture->GetCurrentPosition(

NULL, &dwReadPos)))

return hr;

// Lock everything between the private cursor

// and the read cursor, allowing for wraparound.

lLockSize = dwReadPos - g_dwNextCaptureOffset;

if( lLockSize < 0 ) lLockSize += g_dwCaptureBufferSize;

if( lLockSize == 0 ) return S_FALSE;

if (FAILED(hr = g_pDSBCapture->Lock(

g_dwNextCaptureOffset, lLockSize,

&pbCaptureData, &dwCaptureLength,

&pbCaptureData2, &dwCaptureLength2, 0L)))

return hr;

// Write the data. This is done in two steps

// to account for wraparound.

if (FAILED( hr = g_pWaveFile->Write( dwCaptureLength,

(BYTE*)pbCaptureData, &dwDataWrote)))

return hr;

if (pbCaptureData2 != NULL)

{

if (FAILED(hr = g_pWaveFile->Write(

dwCaptureLength2, (BYTE*)pbCaptureData2,

&dwDataWrote)))

return hr;

}

// Unlock the capture buffer.

g_pDSBCapture->Unlock( pbCaptureData, dwCaptureLength,

pbCaptureData2, dwCaptureLength2 );

// Move the capture offset forward.

g_dwNextCaptureOffset += dwCaptureLength;

g_dwNextCaptureOffset %= g_dwCaptureBufferSize;

g_dwNextCaptureOffset += dwCaptureLength2;

g_dwNextCaptureOffset %= g_dwCaptureBufferSize;

return S_OK;

}

When capturing is finished, the application closes the WAV file.

g_pWaveFile->Close();

查看其它:

导 言

1.枚举“捕捉设备”

2.创建“捕捉设备对象”

3.“捕捉设备”性能

4.创建一个“捕捉缓冲区”

5.“捕捉缓冲区”信息

6.“捕捉缓冲区”通知

7. “捕捉缓冲区”特效

8.使用“捕捉缓冲区”

9.写入到WAV文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: