亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dsutil.cpp

?? 3D俄羅斯方塊源碼.rar
?? CPP
?? 第 1 頁 / 共 4 頁
字號:


//-----------------------------------------------------------------------------
// Name: CSound::IsSoundPlaying()
// Desc: Checks to see if a buffer is playing and returns TRUE if it is.
//-----------------------------------------------------------------------------
BOOL CSound::IsSoundPlaying()
{
    BOOL bIsPlaying = FALSE;

    if( m_apDSBuffer == NULL )
        return FALSE; 

    for( DWORD i=0; i<m_dwNumBuffers; i++ )
    {
        if( m_apDSBuffer[i] )
        {  
            DWORD dwStatus = 0;
            m_apDSBuffer[i]->GetStatus( &dwStatus );
            bIsPlaying |= ( ( dwStatus & DSBSTATUS_PLAYING ) != 0 );
        }
    }

    return bIsPlaying;
}




//-----------------------------------------------------------------------------
// Name: CStreamingSound::CStreamingSound()
// Desc: Setups up a buffer so data can be streamed from the wave file into 
//       buffer.  This is very useful for large wav files that would take a 
//       while to load.  The buffer is initially filled with data, then 
//       as sound is played the notification events are signaled and more data
//       is written into the buffer by calling HandleWaveStreamNotification()
//-----------------------------------------------------------------------------
CStreamingSound::CStreamingSound( LPDIRECTSOUNDBUFFER pDSBuffer, DWORD dwDSBufferSize, 
                                  CWaveFile* pWaveFile, DWORD dwNotifySize ) 
                : CSound( &pDSBuffer, dwDSBufferSize, 1, pWaveFile )           
{
    m_dwLastPlayPos     = 0;
    m_dwPlayProgress    = 0;
    m_dwNotifySize      = dwNotifySize;
    m_dwNextWriteOffset = 0;
    m_bFillNextNotificationWithSilence = FALSE;
}




//-----------------------------------------------------------------------------
// Name: CStreamingSound::~CStreamingSound()
// Desc: Destroys the class
//-----------------------------------------------------------------------------
CStreamingSound::~CStreamingSound()
{
}



//-----------------------------------------------------------------------------
// Name: CStreamingSound::HandleWaveStreamNotification()
// Desc: Handle the notification that tell us to put more wav data in the 
//       circular buffer
//-----------------------------------------------------------------------------
HRESULT CStreamingSound::HandleWaveStreamNotification( BOOL bLoopedPlay )
{
    HRESULT hr;
    DWORD   dwCurrentPlayPos;
    DWORD   dwPlayDelta;
    DWORD   dwBytesWrittenToBuffer;
    VOID*   pDSLockedBuffer = NULL;
    VOID*   pDSLockedBuffer2 = NULL;
    DWORD   dwDSLockedBufferSize;
    DWORD   dwDSLockedBufferSize2;

    if( m_apDSBuffer == NULL || m_pWaveFile == NULL )
        return CO_E_NOTINITIALIZED;

    // Restore the buffer if it was lost
    BOOL bRestored;
    if( FAILED( hr = RestoreBuffer( m_apDSBuffer[0], &bRestored ) ) )
        return DXTRACE_ERR( TEXT("RestoreBuffer"), hr );

    if( bRestored )
    {
        // The buffer was restored, so we need to fill it with new data
        if( FAILED( hr = FillBufferWithSound( m_apDSBuffer[0], FALSE ) ) )
            return DXTRACE_ERR( TEXT("FillBufferWithSound"), hr );
        return S_OK;
    }

    // Lock the DirectSound buffer
    if( FAILED( hr = m_apDSBuffer[0]->Lock( m_dwNextWriteOffset, m_dwNotifySize, 
                                            &pDSLockedBuffer, &dwDSLockedBufferSize, 
                                            &pDSLockedBuffer2, &dwDSLockedBufferSize2, 0L ) ) )
        return DXTRACE_ERR( TEXT("Lock"), hr );

    // m_dwDSBufferSize and m_dwNextWriteOffset are both multiples of m_dwNotifySize, 
    // it should the second buffer should never be valid
    if( pDSLockedBuffer2 != NULL )
        return E_UNEXPECTED; 

    if( !m_bFillNextNotificationWithSilence )
    {
        // Fill the DirectSound buffer with wav data
        if( FAILED( hr = m_pWaveFile->Read( (BYTE*) pDSLockedBuffer, 
                                                  dwDSLockedBufferSize, 
                                                  &dwBytesWrittenToBuffer ) ) )           
            return DXTRACE_ERR( TEXT("Read"), hr );
    }
    else
    {
        // Fill the DirectSound buffer with silence
        FillMemory( pDSLockedBuffer, dwDSLockedBufferSize, 
                    (BYTE)( m_pWaveFile->m_pwfx->wBitsPerSample == 8 ? 128 : 0 ) );
        dwBytesWrittenToBuffer = dwDSLockedBufferSize;
    }

    // If the number of bytes written is less than the 
    // amount we requested, we have a short file.
    if( dwBytesWrittenToBuffer < dwDSLockedBufferSize )
    {
        if( !bLoopedPlay ) 
        {
            // Fill in silence for the rest of the buffer.
            FillMemory( (BYTE*) pDSLockedBuffer + dwBytesWrittenToBuffer, 
                        dwDSLockedBufferSize - dwBytesWrittenToBuffer, 
                        (BYTE)(m_pWaveFile->m_pwfx->wBitsPerSample == 8 ? 128 : 0 ) );

            // Any future notifications should just fill the buffer with silence
            m_bFillNextNotificationWithSilence = TRUE;
        }
        else
        {
            // We are looping, so reset the file and fill the buffer with wav data
            DWORD dwReadSoFar = dwBytesWrittenToBuffer;    // From previous call above.
            while( dwReadSoFar < dwDSLockedBufferSize )
            {  
                // This will keep reading in until the buffer is full (for very short files).
                if( FAILED( hr = m_pWaveFile->ResetFile() ) )
                    return DXTRACE_ERR( TEXT("ResetFile"), hr );

                if( FAILED( hr = m_pWaveFile->Read( (BYTE*)pDSLockedBuffer + dwReadSoFar,
                                                          dwDSLockedBufferSize - dwReadSoFar,
                                                          &dwBytesWrittenToBuffer ) ) )
                    return DXTRACE_ERR( TEXT("Read"), hr );

                dwReadSoFar += dwBytesWrittenToBuffer;
            } 
        } 
    }

    // Unlock the DirectSound buffer
    m_apDSBuffer[0]->Unlock( pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0 );

    // Figure out how much data has been played so far.  When we have played
    // passed the end of the file, we will either need to start filling the
    // buffer with silence or starting reading from the beginning of the file, 
    // depending if the user wants to loop the sound
    if( FAILED( hr = m_apDSBuffer[0]->GetCurrentPosition( &dwCurrentPlayPos, NULL ) ) )
        return DXTRACE_ERR( TEXT("GetCurrentPosition"), hr );

    // Check to see if the position counter looped
    if( dwCurrentPlayPos < m_dwLastPlayPos )
        dwPlayDelta = ( m_dwDSBufferSize - m_dwLastPlayPos ) + dwCurrentPlayPos;
    else
        dwPlayDelta = dwCurrentPlayPos - m_dwLastPlayPos;

    m_dwPlayProgress += dwPlayDelta;
    m_dwLastPlayPos = dwCurrentPlayPos;

    // If we are now filling the buffer with silence, then we have found the end so 
    // check to see if the entire sound has played, if it has then stop the buffer.
    if( m_bFillNextNotificationWithSilence )
    {
        // We don't want to cut off the sound before it's done playing.
        if( m_dwPlayProgress >= m_pWaveFile->GetSize() )
        {
            m_apDSBuffer[0]->Stop();
        }
    }

    // Update where the buffer will lock (for next time)
    m_dwNextWriteOffset += dwDSLockedBufferSize; 
    m_dwNextWriteOffset %= m_dwDSBufferSize; // Circular buffer

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: CStreamingSound::Reset()
// Desc: Resets the sound so it will begin playing at the beginning
//-----------------------------------------------------------------------------
HRESULT CStreamingSound::Reset()
{
    HRESULT hr;

    if( m_apDSBuffer[0] == NULL || m_pWaveFile == NULL )
        return CO_E_NOTINITIALIZED;

    m_dwLastPlayPos     = 0;
    m_dwPlayProgress    = 0;
    m_dwNextWriteOffset = 0;
    m_bFillNextNotificationWithSilence = FALSE;

    // Restore the buffer if it was lost
    BOOL bRestored;
    if( FAILED( hr = RestoreBuffer( m_apDSBuffer[0], &bRestored ) ) )
        return DXTRACE_ERR( TEXT("RestoreBuffer"), hr );

    if( bRestored )
    {
        // The buffer was restored, so we need to fill it with new data
        if( FAILED( hr = FillBufferWithSound( m_apDSBuffer[0], FALSE ) ) )
            return DXTRACE_ERR( TEXT("FillBufferWithSound"), hr );
    }

    m_pWaveFile->ResetFile();

    return m_apDSBuffer[0]->SetCurrentPosition( 0L );  
}




//-----------------------------------------------------------------------------
// Name: CWaveFile::CWaveFile()
// Desc: Constructs the class.  Call Open() to open a wave file for reading.  
//       Then call Read() as needed.  Calling the destructor or Close() 
//       will close the file.  
//-----------------------------------------------------------------------------
CWaveFile::CWaveFile()
{
    m_pwfx    = NULL;
    m_hmmio   = NULL;
    m_dwSize  = 0;
    m_bIsReadingFromMemory = FALSE;
}




//-----------------------------------------------------------------------------
// Name: CWaveFile::~CWaveFile()
// Desc: Destructs the class
//-----------------------------------------------------------------------------
CWaveFile::~CWaveFile()
{
    Close();

    if( !m_bIsReadingFromMemory )
        SAFE_DELETE_ARRAY( m_pwfx );
}




//-----------------------------------------------------------------------------
// Name: CWaveFile::Open()
// Desc: Opens a wave file for reading
//-----------------------------------------------------------------------------
HRESULT CWaveFile::Open( LPTSTR strFileName, WAVEFORMATEX* pwfx, DWORD dwFlags )
{
    HRESULT hr;

    m_dwFlags = dwFlags;
    m_bIsReadingFromMemory = FALSE;

    if( m_dwFlags == WAVEFILE_READ )
    {
        if( strFileName == NULL )
            return E_INVALIDARG;
        SAFE_DELETE_ARRAY( m_pwfx );

        m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF | MMIO_READ );

        if( NULL == m_hmmio )
        {
            HRSRC   hResInfo;
            HGLOBAL hResData;
            DWORD   dwSize;
            VOID*   pvRes;

            // Loading it as a file failed, so try it as a resource
            if( NULL == ( hResInfo = FindResource( NULL, strFileName, TEXT("WAVE") ) ) )
            {
                if( NULL == ( hResInfo = FindResource( NULL, strFileName, TEXT("WAV") ) ) )
                    return DXTRACE_ERR_NOMSGBOX( TEXT("FindResource"), E_FAIL );
            }

            if( NULL == ( hResData = LoadResource( NULL, hResInfo ) ) )
                return DXTRACE_ERR( TEXT("LoadResource"), E_FAIL );

            if( 0 == ( dwSize = SizeofResource( NULL, hResInfo ) ) ) 
                return DXTRACE_ERR( TEXT("SizeofResource"), E_FAIL );

            if( NULL == ( pvRes = LockResource( hResData ) ) )
                return DXTRACE_ERR( TEXT("LockResource"), E_FAIL );

            CHAR* pData = new CHAR[ dwSize ];
            memcpy( pData, pvRes, dwSize );

            MMIOINFO mmioInfo;
            ZeroMemory( &mmioInfo, sizeof(mmioInfo) );
            mmioInfo.fccIOProc = FOURCC_MEM;
            mmioInfo.cchBuffer = dwSize;
            mmioInfo.pchBuffer = (CHAR*) pData;

            m_hmmio = mmioOpen( NULL, &mmioInfo, MMIO_ALLOCBUF | MMIO_READ );
        }

        if( FAILED( hr = ReadMMIO() ) )
        {
            // ReadMMIO will fail if its an not a wave file
            mmioClose( m_hmmio, 0 );
            return DXTRACE_ERR_NOMSGBOX( TEXT("ReadMMIO"), hr );
        }

        if( FAILED( hr = ResetFile() ) )
            return DXTRACE_ERR( TEXT("ResetFile"), hr );

        // After the reset, the size of the wav file is m_ck.cksize so store it now
        m_dwSize = m_ck.cksize;
    }
    else
    {
        m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF  | 
                                                  MMIO_READWRITE | 
                                                  MMIO_CREATE );
        if( NULL == m_hmmio )
            return DXTRACE_ERR( TEXT("mmioOpen"), E_FAIL );

        if( FAILED( hr = WriteMMIO( pwfx ) ) )
        {
            mmioClose( m_hmmio, 0 );
            return DXTRACE_ERR( TEXT("WriteMMIO"), hr );
        }
                        
        if( FAILED( hr = ResetFile() ) )
            return DXTRACE_ERR( TEXT("ResetFile"), hr );
    }

    return hr;
}




//-----------------------------------------------------------------------------
// Name: CWaveFile::OpenFromMemory()
// Desc: copy data to CWaveFile member variable from memory
//-----------------------------------------------------------------------------
HRESULT CWaveFile::OpenFromMemory( BYTE* pbData, ULONG ulDataSize, 
                                   WAVEFORMATEX* pwfx, DWORD dwFlags )
{
    m_pwfx       = pwfx;
    m_ulDataSize = ulDataSize;
    m_pbData     = pbData;
    m_pbDataCur  = m_pbData;
    m_bIsReadingFromMemory = TRUE;
    
    if( dwFlags != WAVEFILE_READ )
        return E_NOTIMPL;       
    
    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: CWaveFile::ReadMMIO()
// Desc: Support function for reading from a multimedia I/O stream.
//       m_hmmio must be valid before calling.  This function uses it to
//       update m_ckRiff, and m_pwfx. 
//-----------------------------------------------------------------------------
HRESULT CWaveFile::ReadMMIO()
{
    MMCKINFO        ckIn;           // chunk info. for general use.
    PCMWAVEFORMAT   pcmWaveFormat;  // Temp PCM structure to load in.       

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久国产福利国产秒拍| 欧美人动与zoxxxx乱| 色国产综合视频| 日韩欧美国产电影| 婷婷综合久久一区二区三区| 懂色av一区二区三区免费看| 日韩欧美电影在线| 亚洲成av人片一区二区三区| 色综合色狠狠综合色| 久久欧美一区二区| 麻豆极品一区二区三区| 欧美亚一区二区| 亚洲婷婷国产精品电影人久久| 国产一区二区在线免费观看| 欧美电影一区二区三区| 一级做a爱片久久| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美精品一区二区三区蜜桃视频| 午夜精品久久久久久| 91国产成人在线| 亚洲免费在线观看| 99vv1com这只有精品| 国产精品第四页| av不卡在线播放| 中文字幕一区二区三区乱码在线| 国产成人综合在线播放| 久久久www成人免费毛片麻豆| 麻豆精品蜜桃视频网站| 日韩视频一区二区在线观看| 日韩1区2区3区| 欧美电视剧在线观看完整版| 看电影不卡的网站| 久久亚洲综合色一区二区三区| 久久99久久精品| 亚洲精品在线观看视频| 精品一区二区三区影院在线午夜| 精品免费视频一区二区| 日韩精品亚洲一区二区三区免费| 91精品国产综合久久久蜜臀粉嫩| 美女视频黄免费的久久 | 久久爱www久久做| 精品久久久久久久久久久久久久久久久| 日韩电影一区二区三区| 欧美一区二区三区在线电影| 麻豆国产一区二区| 国产欧美一区二区精品性| av一区二区三区四区| 亚洲综合久久av| 日韩午夜精品电影| 国产乱色国产精品免费视频| 久久精品视频网| 91免费国产在线| 天使萌一区二区三区免费观看| 日韩欧美成人午夜| 成人免费毛片aaaaa**| 一区二区在线观看免费视频播放| 欧美日韩在线三级| 国产精品一区专区| 亚洲国产乱码最新视频| 精品人伦一区二区色婷婷| 9久草视频在线视频精品| 亚洲小说春色综合另类电影| 精品国一区二区三区| 94色蜜桃网一区二区三区| 日韩精品三区四区| 国产精品情趣视频| 欧美一区欧美二区| 99视频超级精品| 免费观看30秒视频久久| 亚洲人成小说网站色在线| 欧美一区二区三区免费观看视频| 粉嫩久久99精品久久久久久夜| 亚洲宅男天堂在线观看无病毒| 26uuu欧美| 欧美三电影在线| 国产成人欧美日韩在线电影| 亚洲第一狼人社区| 国产精品国产三级国产普通话99 | 国产精品一区二区果冻传媒| 亚洲视频一区二区免费在线观看| 日韩你懂的在线播放| 日本高清不卡在线观看| 国产98色在线|日韩| 午夜婷婷国产麻豆精品| 亚洲欧洲综合另类在线| 国产欧美精品区一区二区三区 | 狠狠v欧美v日韩v亚洲ⅴ| 亚洲精品第1页| 国产欧美日产一区| 精品粉嫩超白一线天av| 欧美日韩国产精选| 在线影视一区二区三区| 成人激情黄色小说| 国产69精品久久久久毛片| 免费成人你懂的| 日韩中文字幕91| 亚洲成人免费观看| 亚洲激情综合网| 亚洲视频在线一区| 中文字幕在线不卡一区二区三区| 久久久精品日韩欧美| 2024国产精品| 日韩欧美美女一区二区三区| 欧美日韩在线免费视频| 91久久一区二区| 欧美亚洲丝袜传媒另类| 在线观看免费亚洲| 在线看一区二区| 欧美亚洲综合一区| 欧美美女视频在线观看| 色av一区二区| 欧美综合视频在线观看| 欧美探花视频资源| 欧美日韩情趣电影| 欧美日韩高清一区| 日韩一区二区在线免费观看| 欧美成人高清电影在线| 精品国产乱码久久久久久浪潮| 日韩欧美一二三| 久久久www免费人成精品| 欧美激情一区三区| 最新中文字幕一区二区三区| 成人欧美一区二区三区在线播放| 自拍偷在线精品自拍偷无码专区| 成人欧美一区二区三区黑人麻豆 | 男男成人高潮片免费网站| 毛片av一区二区三区| 国产精品88av| 97成人超碰视| 欧美日韩久久一区| 欧美一区二区在线视频| 337p日本欧洲亚洲大胆精品| 久久久综合激的五月天| 亚洲欧美激情一区二区| 亚洲v日本v欧美v久久精品| 男男视频亚洲欧美| 成人美女视频在线看| 欧美主播一区二区三区美女| 日韩欧美一区中文| 国产精品三级av在线播放| 一区二区激情小说| 久久se精品一区精品二区| 成人午夜私人影院| 欧美日韩国产精品自在自线| 久久久久久久久蜜桃| 亚洲精品国久久99热| 美女诱惑一区二区| 99re这里只有精品6| 日韩精品影音先锋| 17c精品麻豆一区二区免费| 午夜一区二区三区视频| 国产成人在线色| 欧美高清视频www夜色资源网| 久久久久久久久久久99999| 一区二区三区不卡视频| 国产在线不卡一区| 欧美日韩一区中文字幕| 国产欧美精品一区| 免费在线一区观看| 一本大道久久a久久精品综合| 日韩欧美第一区| 性做久久久久久免费观看欧美| 国产一区二区女| 91精品欧美一区二区三区综合在| 国产精品久久网站| 精品中文字幕一区二区小辣椒| 欧美在线免费播放| 国产精品国产三级国产普通话99 | 欧美高清dvd| ...av二区三区久久精品| 国内精品不卡在线| 欧美日韩精品专区| 亚洲欧美另类小说| 成人动漫一区二区在线| 国产亚洲午夜高清国产拍精品| 天天亚洲美女在线视频| 91免费版pro下载短视频| 久久理论电影网| 狠狠色丁香九九婷婷综合五月| 69堂成人精品免费视频| 亚洲精品第一国产综合野| 成人综合婷婷国产精品久久| 精品动漫一区二区三区在线观看| 五月天婷婷综合| 欧美三级日韩在线| 亚洲成va人在线观看| 99国产精品久久久久久久久久久| 久久久www免费人成精品| 国产一区二区福利视频| 欧美大片一区二区| 麻豆精品久久久| 精品日韩在线观看| 久久精品国产久精国产爱| 日韩欧美123| 国产一区二区精品久久99| 久久久精品国产免费观看同学| 国产综合色在线视频区| 久久天天做天天爱综合色| 国产老妇另类xxxxx| 国产人久久人人人人爽|