|
|
[em24]
我的代码:
// 创建次缓冲区
BOOL
MyDirectSound::CreateSecondaryBuffer( const char* const pSoundData, // 声音数据的指针
DWORD SoundDataSize ) // 声音数据的大小
{
if( NULL == pSoundData )
{
::MessageBox( NULL, _T("声音数据为空"), _T(""), MB_OK );
return FALSE;
}
WAVEFORMATEX WaveFormat;
::ZeroMemory( &WaveFormat, sizeof( WAVEFORMATEX ) );
WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
WaveFormat.nChannels = 2;
WaveFormat.nSamplesPerSec = 22050;
WaveFormat.wBitsPerSample = 16;
WaveFormat.nBlockAlign = 4;
WaveFormat.nAvgBytesPerSec = ( WaveFormat.nSamplesPerSec ) * ( WaveFormat.nBlockAlign );
DSBUFFERDESC BufferDesc; // 缓冲区描述
::ZeroMemory( &BufferDesc, sizeof( DSBUFFERDESC ) );
BufferDesc.dwSize = sizeof( DSBUFFERDESC );
BufferDesc.dwFlags = DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS | DSBCAPS_STATIC; // 缓冲区可设置
BufferDesc.dwBufferBytes = SoundDataSize;
BufferDesc.lpwfxFormat = &WaveFormat;
LPDIRECTSOUNDBUFFER pSoundBuffer; // 次缓冲区指针
if ( FAILED( DSoundObject->CreateSoundBuffer( &BufferDesc, &pSoundBuffer, NULL ) ) )
{
::MessageBox( NULL, _T(" DSoundObject->CreateSoundBuffer() 失败 "), _T(""), MB_OK );
return FALSE;
}
// 获取 IDrictSoundBuffer8 缓冲区接口给 Buffer8InterFace( 类型为 LPDIRECTSOUNDBUFFER8 )
if( FAILED( pSoundBuffer->QueryInterface( IID_IDirectSoundBuffer8,
( LPVOID* )&Buffer8InterFace ) ) )
{
pSoundBuffer->Release();
::MessageBox( NULL, _T(" pSoundBuffer->QueryInterface() 失败 "), _T(""), MB_OK );
return FALSE;
}
pSoundBuffer->Release();
LPVOID BufferPointer = NULL; // 缓冲区的位置指针
DWORD LumpSize = 0; // 锁定块的大小
if( FAILED( Buffer8InterFace->Lock( 0, 0, &BufferPointer, &LumpSize,
NULL, 0, DSBLOCK_ENTIREBUFFER ) ) ) // 锁定缓冲区
{
::MessageBox( NULL, _T(" Buffer8InterFace->Lock() 失败 "), _T(""), MB_OK );
return FALSE;
}
::CopyMemory( BufferPointer, pSoundData, LumpSize ); // 向缓冲区的锁定块写入数据
if( FAILED( Buffer8InterFace->Unlock( BufferPointer, LumpSize, NULL, 0 ) ) ) // 解锁缓冲区
{
::MessageBox( NULL, _T(" Buffer8InterFace->Unlock() 失败 "), _T(""), MB_OK );
return FALSE;
}
Buffer8InterFace->SetCurrentPosition( 0 );
if( FAILED( Buffer8InterFace-> lay( 0, 0, NULL ) ) )
{
::MessageBox( NULL, _T(" Buffer8InterFace->Play() 失败 "), _T(""), MB_OK );
return FALSE;
}
return TRUE;
}
以上的代码,前面执行时没发现问题,
执行到 if( FAILED( Buffer8InterFace->Play( 0, 0, NULL ) ) ) 时出现问题。
::MessageBox( NULL, _T(" Buffer8InterFace->Play() 失败 "), _T(""), MB_OK );
被调用。
请问是何原因?
|
|