2012-06-12 7 views
4

그래서 저는 OpenAL 에 오디오 데이터를 스트리밍하는 스레드 된 IMA ADPCM 디코더를 구축하고 있습니다 (짧은 설명은 아래 참조).하지만 약간의 문제가 있습니다. 내 문제의OpenAL : 입력 변수 *가 * 확인 되어도 alBufferData가 AL_INVALID_VALUE를 반환합니다.

하나는 가끔 alBufferData에 내 전화 : 비록

alBufferData(*bufferID, format, pcmData, sizeInBytes, bitRate);

반환 AL_INVALID_VALUE, 매개 변수를 점검 할 때이 같은 예를 들어 보면 :

bufferID='109770616', format='AL_FORMAT_STEREO16', dataPtr='109754188', sizeInBytes='8164'

실마리, 누구? 실제로 발생하는 소리는 스투 테르 (stutteres)와 같은 일을합니다. 오류는 대개 10 번 연속으로 발생합니다 (동일한 사운드에서). (AN LMG와 짧은 버스트 촬영 ... 예를 들어) 나는 반복적으로 같은 소리를 시작할 때 그것은 또한 일반적으로 발생) 스트리밍 디코더 모듈 - 일의

빠른 간단한 투어를

사운드가 재생되는 방식 :

  1. 사운드가 재생되도록 재생됩니다.
  2. 하나의 bufferSize 상당의 오디오가 디코딩되고 나머지는 추가 디코딩을 위해 대기합니다.
  3. OpenAL이 트리거되어 사운드 재생이 시작됩니다.

디코딩/스트리밍 각 음향 루프

  1. 는 디코딩 된 오디오의 디코딩 버퍼 크기 상당 큐잉.
  2. 디코딩 된 오디오는 적절한 bufferID를 사용하여 alBuffer (위의 호출 참조)에 추가됩니다.
+0

bufferID 포인트에 유효한 bufffer ID가있는 정수는 있습니까? 그것이 alGenBuffers로 생성 되었습니까? –

+0

bufferID 값은 dataPtr 값과 매우 유사합니다. 포인터 일 가능성이 높습니다. bufferID 또는 * bufferID를 인쇄하고 있습니까? 나는 bufferID에 더 관심이있다. –

+0

위의 설명을 무시하고 편집 속도가 너무 느림 : Hiya @ Mārtiņš! 'bufferID'의 값은 위에 표시된 값입니다 (' '109770616 ''). bufferID가 생성되어 다음과 같이 사용됩니다 : 'alGenBuffers' ->'alBufferData' ->'alSourceQueueBuffers'. 나는 계속해서 'alGetSourcei (sID, AL_BUFFERS_PROCESSED, & processedBuffers)'로 처리 된 버퍼를 검사하고, 처리 된 bufferID를'alSourceUnqueueBuffers'로 언 큐링하여 다시 사용하고'alBufferData'로 다시 채 웁니다. – happytrooper

답변

3

너무 늦지 않았다면 BufferData와 비슷한 문제를 알려 드리겠습니다. 여기에 제가 고쳤습니다. 비록, 당신의 쓰레 디드 프로그램의 세부 사항을 모르겠다.

여러 가지 이유로 잘못된 값이 반환됩니다. 내가 아는 것들은 ...
- 소스에 이미 bufferID가 할당되어 있으면 새 버퍼링 (스트리밍 소스로) 버퍼 ID를 설정하면). 그렇다면 source 속성에서 ID를 제거하십시오.
- 버퍼 포맷 중간 재생을 연다. 소스가 재생을 시작하면 버퍼 데이터 자체를 제외하고 다른 대기중인 버퍼 설정 (fmt, samplerate)을 변경할 수 없습니다.

다른 스레드에서이 설정 중 하나를 변경하는 것처럼 들립니다.

또 다른 문제는 소리를 재생하는 것입니다. 다시 재생을 호출하면 소스 감기가 중지되고 현재 버퍼가 되감기 시작하여 처음부터 재생되기 시작합니다. 그런 총소리를 연주하면 네가 원하는 것처럼 들리지 않을거야. 2 옵션을 사용하여 남아있는 총 소리를 버퍼에 섞은 다음 다시 재생하지만 작동하지 않을 수 있습니다. 또 다른 어리석은 증거는 여러 소스를 사용하여 각각의 총기 발사시 호출되는 소스를 회전시키는 것입니다.

프로젝트에 행운을 빕니다.

+0

우수 답변, @extracrispy 감사합니다! 나는 아직이 프로젝트에 대한 작업을 계속할 시간이 없지만 (나는 언젠가는 그렇게 할 것입니다), 당신이 지적하는 이유는 타당합니다! 이 프로젝트를 다시 시작하자마자이 문제를 자세히 조사하고 답장을 보내 드리겠습니다. 그때까지, 나는 단지 당신의 대답을 업 그레 이드 할 수 없다 (15 명의 담당자가 필요하다.) 나는 받아 들인 것으로 표시 할 것이다! – happytrooper