2010-06-28 3 views
3

C++로 작은 .wav 파일을 재생하는 프로그램을 작성하려고합니다. 필자는 DirectX SDK 문서를 따라 프로그래밍하여 보조 정적 버퍼에서 쓰기 및 재생할 수 있습니다. 그것은 .wav 파일의 재생이 끝날 때 매우 눈에 띄는 "딸깍"하는 소리가 나는 것을 제외하고는 올바르게 실행됩니다. DirectSound를 사용하는 다른 게임에는 없기 때문에 오디오 하드웨어의 결함이 아니라고 확신합니다.재생 "클릭"노이즈

모든 사이클에 대해 GetCurrentPosition을 폴링하고 끝나기 직전에 중지했지만 신뢰할 수 없습니다. .wav가 기본 버퍼에서 재생해야하므로 반복하지 않아야하므로 기본 버퍼에서 재생할 수 없습니다.

누구든지이 문제의 수정 사항을 알고 있습니까? 미리 감사드립니다.

+0

DirectSound 프로그래밍을 해본 이후로 오랜 시간이 걸렸지 만, 메모리가 작동하는 경우 이는 일반적으로 재생 중에 실행중인 버퍼를 나타내는 것이라고 생각합니다. 비행 중에 WAV를 생성하고 있습니까? 그렇다면 재생 코드를 수정하여 끝 부분을 클릭하지 않아도 재생 코드가 충분하고 클릭이 발생하지 않는다는 것을 확인하는 WAV를 허용 할 수 있습니까? –

답변

4

사운드 버퍼에 WAV 파일을로드하려면 해당 WAV 파일과 코드를 모두 확인해야합니다. 하지만 여기에 몇 가지 추측이 있습니다.

내 첫 번째 추측은 WAV 파일을로드하는 경우 시각적 인 오디오 편집기를 사용하면 소리가 갑자기 끝나는 대신 뾰족한 소리가 들리는 것을 볼 수 있습니다. 이렇게하면 거의 모든 오디오 플레이어에서 "터지는"노이즈가 발생합니다.

두 번째 추측은 끝에 사운드 버퍼에 가비지 데이터를 복사하는 것입니다. 일부 WAV 파일은 DATA 덩어리가 끝난 파일 끝 부분에 여분의 메타 데이터가 있습니다. 샘플을 복사 할 사운드 파일의 위치를 ​​어떻게 결정했는지는 확실하지 않지만이 점을 쉽게 알아볼 수 있습니다. Visual Studio와 같은 16 진수 편집기를 사용하여 WAV 파일을 검사하여 DATA 덩어리의 길이가 클 수 있음을 확인 했습니까? 파일에서 버퍼로 데이터를 복사하기 위해 ReadFile 호출을 디버깅 할 때 16 진수 편집기에서 본 내용과 일치하는 버퍼의 마지막 몇 바이트를 검사 했습니까?

+0

첫 번째 추측은 맞았고, wav는 갑작스런 끝을 보였으며, 소음을 없애기 위해 페이딩 아웃 한 후 사라졌습니다. 시작 부분에도 클릭 노이즈가 있었고 이후에 주목했습니다. 문제는 버퍼에 fmt 덩어리로로드되고있었습니다. 모든 것을 정확하게 고치면 클릭 한 번으로 원하는대로 작동합니다. 귀하의 성원에 진심으로 감사드립니다. – kaykun