2013-07-16 5 views
1

내 응용 프로그램에서는 일반적으로 5 개의 버퍼와 5 개의 소스를 사용하지만 일부는 위아래로 다릅니다. 모든 것이 처음부터 잘 작동하지만 잠시 후 일부 유형의 리소스 누출이있는 것처럼 보이므로 소리가 적고 소리가 적습니다. 15 분 정도 달리면 모든 소리가 사라집니다. 며칠 동안 내 코드에서 버그를 찾았으며 리소스 누출이 다른 곳에서 발생했다고 추측합니다. Pseudo :OpenAL은 잠시 후 작동을 멈 춥니 다. (iOS)

context = alcCreateContext(device, attributes); 
    alcMakeContextCurrent(context); 
    alutInitWithoutContext(0, 0); 
    ... 
10: buffer = alutCreateBufferFromFileImage(data, len); 
    ... 
    alGenSources(1, &sid); 
    alSourcei(sid, AL_SOURCE_RELATIVE, AL_FALSE); 
    alSourcef(sid, AL_ROLLOFF_FACTOR, 0.2f); 
    alSourcei(sid, AL_BUFFER, buffer); 
    ... 
    alSourceStop(sid); 
    ... 
    alDeleteSources(1, &sid); 
    alDeleteBuffers(1, &buffer); 
    ... 
    goto 10 

각 호출마다 OpenAL 오류가 있는지 확인하지만 아무 것도보고되지 않습니다. 또한 일시 중지/응용 프로그램을 이동 이력서 코드를 추가 해봤에/배경에서, 그래서 같은 :

// -> background 
alcMakeContextCurrent(0); 
alcSuspendContext(context); 
// -> foreground 
alcMakeContextCurrent(context); 
alcProcessContext(context); 

하지만 그건 눈에 띄는 효과를 (I 배경에 응용 프로그램을 누르면, 다음을 철수하지 않습니다 다시 위로). 이 버그는 iPad2에서 이전 iOS 버전을 실행하는 iPhone3GS와 같은 최신 iOS 버전과 동일합니다. 무엇을해야할까요?

편집 : 디버그 빌드에서 alSourcePlay (sid = 5260)에서 -1이 반환됩니다. 하나 들어, -1은 내가 알 수있는 한 유효한 반환 코드 중 하나가 아닙니다. 일부 오래된 구현은 AL_INVALID를 -1로 정의하는 것으로 보입니다. 이를 무시하고 구현에 따라 alGenSources()에서 sid가 alDeleteSources()를 수행 할 때 재활용되면 5260이 매우 높습니다. 누가 샘플 ID를 삭제할 때 재활용되는지 또는 카운터인지 알 수 있습니까?

답변

0

이 문제를 해결할 방법이 없습니다. iOS의 OpenAL 구현 내에서 리소스가 누출 된 것으로 보입니다. 우회하는 내 길은 OpenAL을 종료하고 다시 초기화하는 것입니다. OpenAL은 꽤 이상한 일을합니다.하지만 대안은 훨씬 더 나쁩니다. 수리 코드 :

if OpenALIrreparableLeakState: 
    for sound in resources_of_type("sound"): 
     sound.release() 
    openal.shutdown() 
    openal.initialize() 
    for sound in resources_of_type("sound"): 
     sound.load()