프로그래밍 관련/사운드

동일 사운드 반복 플레이 DuplicateSoundBuffer (칼, 총기류 난사시 사운드)

AlrepondTech 2011. 1. 6. 18:52
반응형

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

 

//====================== DuplicateSoundBuffer 를 이용해서 여러 버퍼 만들어 저장 하기

LoadOggMemory(...)
{
    LPDIRECTSOUND8 lpSound = m_pSoundManager->GetDirectSound();
  
    IDirectSoundBuffer* pSndBuffer;
    LPDIRECTSOUNDBUFFER pSndBufferTmp;

    pSndBuffer = CreateSoundBuffer(vi->rate, 16, vi->channels, pcm_total);

    ...
    ...
    ...

    vector<IDirectSoundBuffer*> *pVBuf = new vector<IDirectSoundBuffer*>;
    for(WORD i=0; i<nCnt; i++)
    {
       
        if(pSndBuffer)
        {
            pSndBufferTmp = NULL;         
           
            // 첫번째 원본 사운드 버퍼, 두번쨰는 연속반복한 버퍼들
            // DuplicateSoundBuffer 사용하여 반복할 버퍼를 만든다.
            lpSound->DuplicateSoundBuffer(pSndBuffer,&pSndBufferTmp);

            if(i == 0)
            {
                pVBuf->push_back(pSndBuffer);
            }
            else
            {
                pVBuf->push_back(pSndBufferTmp); // 벡터에 연속 플레이할 버퍼들을 놓아둔다.

            }
           
        }
    }


//======================================================= 연속된 버퍼 플레이 연주


play()
{
                DWORD state = 0;
               
                pVBuffTmp =  넘겨받을 버퍼를 담은 벡터 인자;

                for(auto it = pVBuffTmp->begin(); it!=pVBuffTmp->end(); it++)
                {

                    (*it)->GetStatus(&state);
                    if(DSBSTATUS_PLAYING == state) // 플레이중인 버퍼는 넘어간다.
                    {
                        continue;
                    }
                    else
                    {
                        m_pSoundBufferEf = (*it);
                        (*it)->SetCurrentPosition(0);

                        //플레이중이지 않으면 플레이 하고 LOST 할경우 RESTORE 해주고 다시 플레이해준다. 
                        if((*it)->Play(0, NULL, 0) == DSERR_BUFFERLOST)
                        {
                            if(SUCCEEDED((*it)->Restore()))
                                (*it)->Play(0,0,0);
                        }
                        break;
                    }
                }
}



 

=================================

=================================

=================================

 

 

 











반응형