HRESULT CAudioPlay::OnSample( /* [in] */ DWORD dwOutputNum,
/* [in] */ QWORD cnsSampleTime,
/* [in] */ QWORD cnsSampleDuration,
/* [in] */ DWORD dwFlags,
/* [in] */ INSSBuffer __RPC_FAR *pSample,
/* [in] */ void __RPC_FAR *pvContext )
{
if( dwOutputNum != m_dwAudioOutputNum )
{
return( S_OK );
} BYTE *pData = NULL;
DWORD cbData = 0;
HRESULT hr = S_OK;
MMRESULT mmr; hr = pSample->GetBufferAndLength( &pData, &cbData );
if( FAILED( hr ) )
{
return( hr );
}
//在软件退出的时候,该处大量内存没有释放!是这个samples处理的不对么?还是另有高招!各位帮忙看看!
LPWAVEHDR pwh = ( LPWAVEHDR ) new BYTE[ sizeof( WAVEHDR ) + cbData ];
if( NULL == pwh )
{
return( HRESULT_FROM_WIN32( GetLastError() ) );
}
pwh->lpData = ( LPSTR )&pwh[1];
pwh->dwBufferLength = cbData;
pwh->dwBytesRecorded = cbData;
pwh->dwUser = ( DWORD )cnsSampleTime;
pwh->dwLoops = 0;
pwh->dwFlags = 0;
CopyMemory( pwh->lpData, pData, cbData );
do
{
mmr = waveOutPrepareHeader(m_hWaveOut,pwh,sizeof(WAVEHDR));
if( MMSYSERR_NOERROR != mmr )
{
break;
}
hr = waveOutWrite(m_hWaveOut,pwh,sizeof(WAVEHDR));
if( MMSYSERR_NOERROR != hr )
{
break;
}
InterlockedIncrement(&m_cHeadersLeft); if( m_bIsBroadcast )
{
SetTime( cnsSampleTime, 0 );
}
else
{
SetTime( cnsSampleTime, m_cnsFileDuration );
}
}
while( FALSE );
if( MMSYSERR_NOERROR != mmr )
{
delete [] (BYTE*)pwh;
Stop();
} return( S_OK );
}
/* [in] */ QWORD cnsSampleTime,
/* [in] */ QWORD cnsSampleDuration,
/* [in] */ DWORD dwFlags,
/* [in] */ INSSBuffer __RPC_FAR *pSample,
/* [in] */ void __RPC_FAR *pvContext )
{
if( dwOutputNum != m_dwAudioOutputNum )
{
return( S_OK );
} BYTE *pData = NULL;
DWORD cbData = 0;
HRESULT hr = S_OK;
MMRESULT mmr; hr = pSample->GetBufferAndLength( &pData, &cbData );
if( FAILED( hr ) )
{
return( hr );
}
//在软件退出的时候,该处大量内存没有释放!是这个samples处理的不对么?还是另有高招!各位帮忙看看!
LPWAVEHDR pwh = ( LPWAVEHDR ) new BYTE[ sizeof( WAVEHDR ) + cbData ];
if( NULL == pwh )
{
return( HRESULT_FROM_WIN32( GetLastError() ) );
}
pwh->lpData = ( LPSTR )&pwh[1];
pwh->dwBufferLength = cbData;
pwh->dwBytesRecorded = cbData;
pwh->dwUser = ( DWORD )cnsSampleTime;
pwh->dwLoops = 0;
pwh->dwFlags = 0;
CopyMemory( pwh->lpData, pData, cbData );
do
{
mmr = waveOutPrepareHeader(m_hWaveOut,pwh,sizeof(WAVEHDR));
if( MMSYSERR_NOERROR != mmr )
{
break;
}
hr = waveOutWrite(m_hWaveOut,pwh,sizeof(WAVEHDR));
if( MMSYSERR_NOERROR != hr )
{
break;
}
InterlockedIncrement(&m_cHeadersLeft); if( m_bIsBroadcast )
{
SetTime( cnsSampleTime, 0 );
}
else
{
SetTime( cnsSampleTime, m_cnsFileDuration );
}
}
while( FALSE );
if( MMSYSERR_NOERROR != mmr )
{
delete [] (BYTE*)pwh;
Stop();
} return( S_OK );
}
解决方案 »
- VC是否支持vc的printf/scanf语法检查?
- 对话框背景图切换问题
- 求 fft vc源代码(希望详细讲解,本人系菜鸟) 谢谢~~~
- 请问如何得到DIB的大小?
- CString 中的ReverseFind只能反向查找单个字符,比如string.ReverseFind( 'd' ),但是我想反向查找"abc"就不能用ReverseFind,那该怎么办呢
- 100分,用PulseEvent的问题
- 请教各位大侠: 如何在win98环境下编程找出系统硬件
- 为什么CDialog的滚动条不能象ListView等视图的滚动条一样随着RANGE的变化滚动条的大小发生相应变化??我应该怎么做啊?
- 求救:请问谁有可用的代理服务器源程序?
- listCtrl怎么改变字体后刷新总是有点问题
- 太恶心了,看到贴近身照的就想抽Y耳光
- 求指导 网页游戏服务器技术VC)
{
Stop();
}
delete [] (BYTE*)pwh;
这样试一试