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 );
}