=================================
=================================
=================================
//====================== 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;
}
}
}
=================================
=================================
=================================
'프로그래밍 관련 > 사운드' 카테고리의 다른 글
[DSound] 15장 Filling and Playing Static Buffers (0) | 2020.09.13 |
---|---|
Direct Sound Creating Secondary Buffers (0) | 2020.09.13 |
ogg 파일을 스트림 버퍼로 읽어 들이기 (0) | 2011.01.06 |
엘리시아 이브의 심심강좌 사운드 (0) | 2011.01.06 |
다이렉트 사운드 더블 버퍼링 또는 다중버퍼관리출력 (0) | 2011.01.05 |