[SDL] mp3 play

SDL에서 mp3를 재생시키기 위해 SDL_mixer 라이브러리를 사용한다.

SDL_mixer는 기본적으로 mp3 decoder로 SMPEG 라이브러리를 사용한다. 하지만 이것은 성능이 떨어져 사운드가 끊기는 현상이 발생하였다. 물론 윈도우PC에서는 문제가 없지만, 상대적으로 자원이 빈약한 Kit에 돌리다 보니 그런거 같다.

그래서 decoder만 mad라이브러리로 교체 하였다. 이상없이 동작시키는 중.. 어느날 심각한 버그가 발생하였다.
!!! 어느정도 프로그램이 동작하다가 더이상 파일을 읽지 못하는 것이다. !!!

playmus 예제로 스트레스 테스트 한 결과 약 1000번의 파일을 읽으면 더이상 파일이 열리지 않는것이었다.
메모리 누수가 원인이지 않을까 싶었다.

하지만 mad라이브러리를 쓰지 않고 SMPEG으로 재생시에는 문제가 없었고. 또한 WAV재생시에도 문제가 발생하지 않았다.
그럼 mp3의 mad라이브러리와 관련되었다는 건데..??

mad라이브러리를 의심해보았지만.. 대중적으로 쓰고 있는 오픈소스인데 차마 이놈을 배신할수가 없었다.
그래서 SDL_mixer를 의심했다..-_-ㅋ 이놈이 더 만만해보이길래;;


구글에서 SDL_mixer memory leak을 치면 midi 쪽 라이브러리에서 메모리 누수가 발생한다고 나온다. 하지만 mp3관련은 거의 없었다. 윈도우라면.. 아니 이게 임베디드가 아니라면 그냥 메모리 디텍터를 사용하면 되겠지만.. (혹시 arm용 그런게 있을까..?)
어쩔수 없이 의심나는 구문들을 직접 테스트 해보았다.

Mix_LoadMUS() -> mad_openFile() -> SDL_RWFromFile() 이렇게 들어가진다.
이 구문을 실행 안하면 에러 발생하지 않았다.
그럼 SDL에 문제가 있단 말인가..?

최초 수정은 SDL_rwops.c 파일의 SDL_RWFromFile 함수에서 file을 오픈하는데 이 파일을 SDL_RWops *rwops의 rwops->hidden.stdio.fp 에 집어 넣는다. 그런데.. 여기서 문제는 autoclose 옵션이 있는데 이 옵션이 실제로 1로 셋팅 되어 있지만. log를 찍어보니 호출되지 않았다.. 그렇다.. 이파일이 close안되서 리눅스의 파일 오픈 제한에 걸려 더이상 파일이 열리지 않는 버그였다.

그래서 SDL_FreeRW 함수내에 

    if(area->hidden.stdio.fp)
              fclose(area->hidden.stdio.fp);

위의 구문을 추가하여 에러를 잡았다. 하지만 이것은 나의 짧은 생각..
위 함수는 mp3뿐 아니라 wav나 다른 포멧의 사운드 함수도 호출한다는 것.. 그래서 오동작하는 경우가 있었다.

그럼 mad를 쓰고 mp3를 재생하는 경우만 위 작업을 하기 위해 SDL_mixer의 music_mad.c파일의 mad_closeFile 함수에 
다음을 추가하였다. 

    if(mp3_mad->rw->hidden.stdio.fp)
        fclose(mp3_mad->rw->hidden.stdio.fp);

일단 정상 동작 하는 것을 확인하였다. 하지만 의심스러운건 SDL의 autoclose옵션과 왜 그함수가 호출 안되는 문제이다.
이것이 해결되어야 모든 의문점이 풀리는 것이다. ㅠㅠ 이문제 제보바랍니다.. (--)(__);;

이렇게 3일간의 갖은 삽질끝에 버그를 해결하였다. 그동안 검색으로 편하게 버그를 잡던내가 벽에 부딪혀 무모하게도(?) 소스 안쪽까지 살펴본후 결국 어느정도 해결하였다. 가끔씩 이런생각을 했었다. 내기술은 암것두 아니다.. 다 어디엔가 인터넷상에 있는 기술이니깐.. 하지만 나는 그렇기 때문에 내가 못하는 건 없다고 생각한다. 다 어디엔가 있으니깐.. 이런 자세를 가지고 일하려한다. 개발자라는건 아니 모든일이란게 내가 할수있다는 자신감으로부터 시작하는것 같다. 일단 내가 못한다고 생각하면 정말 못하는게 이일이니깐.. 후후. 재창작이란 것도 분명 매리트있는 분야이다.. (저작권은?? ㅠㅠ)

by 이카로스 | 2008/11/17 15:14 | SDL | 트랙백 | 덧글(3)

트랙백 주소 : http://icarosss.egloos.com/tb/2140226
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 솜사탕 at 2008/12/28 02:47
MAD 라이브러리와 SDL 결합 테스트 ... 재미있네요 ...

저같으면 3 일만에 버그 찾기가 쉽지 않았을것 같은데 대단하시네요 ....

Commented by 이카로스 at 2008/12/29 14:04
방문감사합니다..^^

SDL이 잼있는데 현재 다른 일때메 손을 못대고 있네요..ㅠ_ㅠ

이런거 잡으면서 보람을 느끼는거 아니겠어요? ㅎㅎ
Commented by pk at 2012/10/01 10:49
남이 만들은 라이브러리 버그수정까지 하다니.... 제가 만든 프로그램 버그수정하는것도 녹록찮은데..... ㅎㅎ
수고하십니다~~

:         :

:

비공개 덧글

<< 이전 페이지     다음 페이지 >>