프로그래밍 관련/사운드

[DSound] 15장 Filling and Playing Static Buffers

AlrepondTech 2020. 9. 13. 21:39
반응형



 

 

 

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

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

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

 

 

 

 

 

[DSound] 15장 Filling and Playing Static Buffers  프로그래밍  
2007/02/10 17:39
 http://blog.naver.com/majesticgow/140034472420 

Filling and Playing Static Buffers (정적 버퍼의 채우기와 연주하기)

 

필요한 전체적인 사운드를 가진 두번째버퍼는 정적버퍼라고 불린다.
비록 다른 사운드가 같은 버퍼에서 재사용되는 것은 가능하지만 일반적으로 데이타는
오직 한번 정적버퍼에 쓰여진다.

 

정적버퍼는 스트리밍 버퍼와 비슷하게 생성되고 관리된다 오직 치이점은

그들이 사용되는 방법이다
: 정적버퍼는 오직 한번 채워지고 연주되어진다 하지만 스트리밍버퍼는 끊임없이 사운드가 재생될 때마다 데이타가 갱신된다.


정적버퍼는 반드시 버퍼목적지의 DSBCAPS_STATIC 플래그를 설정함으로써 만들어지는것은 
아니다 이 플래그는 사운드카드에 메모리할당을 요구한다. 그리고 그것은 최신의 하드웨어에서는 이용할수 없다. 정적버퍼는 시스템메모리에서 존재할수있으며 DSBCAPS_LOCHARDWARE 플래그이던지
DSBCAPS_LOCSOFTWARE 플래그에 의해 만들어질수 있다.

 

정적버퍼에 데이타를 담기위한 세가지 단계이다:


IDirectSoundBuffer8::Lock 함수를 사용함으로써 전체버퍼를 잠군다

 

당신은 당신이 쓰기시작할 버퍼안에 오프셋을 기입하고(보통은 0) 그 포인터의 메모리주소를
돌려받는다.
표준 메모리 복사함수를 사용함으로써 반환된 주소에 오디오 데이타를 기록한다.

 

IDirectSoundBuffer8::Unlock을 사용하여 버퍼를 푼다(unlock)
 
이 단계들은 다음의 예제에서 보여진다.
lpdsbStatic은 IDirectSoundBuffer8의 인터페이스 포인터이고 pbData는 데이타소스의 주소이다.

 


LPVOID lpvWrite;
DWORD  dwLength;

if (DS_OK == lpdsbStatic->Lock(
      0,          // Offset at which to start lock.
      0,          // Size of lock; ignored because of flag.
      &lpvWrite,  // Gets address of first part of lock.
      &dwLength,  // Gets size of first part of lock.
      NULL,       // Address of wraparound not needed. 
      NULL,       // Size of wraparound not needed.
      DSBLOCK_ENTIREBUFFER))  // Flag.
{
  memcpy(lpvWrite, pbData, dwLength);
  lpdsbStatic->Unlock(
      lpvWrite,   // Address of lock start.
      dwLength,   // Size of lock.
      NULL,       // No wraparound portion.
      0);         // No wraparound size.
}
else
(
  ErrorHandler();  // Add error-handling here.
}

 


버퍼를 재생하기위해서 다음의 예제와 같이 IDirectSoundBuffer8::Play를 호출한다.

 


lpdsbStatic->SetCurrentPosition(0);
HRESULT hr = lpdsbStatic->Play(
    0,  // Unused.
    0,  // Priority for voice management.
    0); // Flags.
if (FAILED(hr))
(
  ErrorHandler();  // Add error-handling here.
}

 


DSBPLAY_LOOPING 플래그가 이 예제에서는 설정되어 있지 않기때문에  버퍼는 자동적으로
그것이 끝에 도달하면 멈춘다. 당신은 IDirectSoundBuffer8::Stop 를 사용함으로써 사운드를 
일찍 멈출수 있다. 당신이 버퍼를 일찍 멈출때 재생 커서 위치는 그것이 있던 위치에 남겨진다
그러므로 예제에서의 IDirectSoundBuffer8::SetCurrentPosition 호출은 시작점으로부터 버퍼가 시작할수 있도록 해준다

 

 

이 글의 원문링크는 다음과 같습니다
http://msdn2.microsoft.com/en-us/library/bb173384.aspx

 

 

 

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

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

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

 

 

반응형