파일 확장자란 해당파일의 종류를 표시하기 위해 사용한다.
FAT에서는 기본적으로 파일명은 8자리, 확장자는 3자리를 사용했으나, 긴 파일명도 지원하기에
파일명도 255자, 확장자도 .xlxs 같이 4자리도 사용한다.
이번에 하는 프로젝트에서 USB 메모리 스틱에서 특정 파일 리스트를 정리하는 함수가 필요했다.
음악파일인 MP3만 정리해서 파일 리스트를 뽑아주는 함수였다.
폴더내 파일중에 확장자 .mp3 만 찾아 변수에 정리만 하면 되는데, 특정mp3들이 추가가 안되는 이슈가 발생했다.
mp3를 구분하는 함수는 다음과 같다.
bool APP_SDCARD_AUDIO_Card_isSupportedAudioFile(int8_t *name)
{
int i = 0;
if(name == NULL) return false;
do{
i++;
}while(name[i]!= '.' && name[i] != '\0');
if(name[i] == '\0')
return false;
if(AppSdCardAudioData.player.MP3_decoder_enabled)
{
if((name[i+1] == 'm' && name[i+2] == 'p' && name[i+3] == '3') ||
(name[i+1] == 'M' && name[i+2] == 'P' && name[i+3] == '3'))
return true;
}
if(AppSdCardAudioData.player.WAV_decoder_enabled){
if((name[i+1] == 'w' && name[i+2] == 'a' && name[i+3] == 'v') ||
(name[i+1] == 'W' && name[i+2] == 'A' && name[i+3] == 'V'))
return true;
}
return false;
}
파일명이 배경음악.mp3 이면 "." 을 찾은다음, 확장자 3자리가 wav인자 mp3인지 구분한다.
파일명이 한글이든 영문이든 문제가 없었는데, 특정 파일들만 리스트에서 빠졌다.
USB도 포맷하고 해봤지만 원인은 함수에 버그가 있었다.
문제가 되는 파일명을 보니 아래와 같았다.
01.안내문구.mp3
...원인이 눈에 보이는가? 바로 01 뒤에 있는 "."가 문제였다. 위 소스는 확장자를 구분하기 위한 "."를 찾기 위한 소스인데
파일 중간에 "."가 들어가면 그 다음 문구를 확장자로 처리하는게 문제였다.
그래서 확장자 앞의 .을 찾는 소스로 변경이 필요했다. 문자열의 끝부터 검사하는 str 계열 함수를 써도 됬으나,
간단하게 파일명을 이용하는 방법을 썻다.
bool APP_SDCARD_AUDIO_Card_isSupportedAudioFile(int8_t *name,int fLen)
{
int i = 0;
if(fLen < 4 ||name == NULL || name[0] == '\0') return false;
i = fLen -4;
if(name[i] != '.')
return false;
fLen은 파일명의 길이가 넘어오게 했다. 파일명이 4자리보다 작으면 ".mp3"조차 없는 파일이니 false로 리턴되고
파일명 길이에서 4를 빼면 01.안내문구.mp3 에서 mp3파일명 앞의 . 를 나타낸다.
테스트 해보니 정상동작한다. 역시 샘플소스를 그대로 사용하는 건 문제가 있다는 걸 알게 된 하루이다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
'개발이야기' 카테고리의 다른 글
MP3 현재 재생시간 계산하기 (플레이타임) (0) | 2022.01.24 |
---|---|
MP3 총 재생 시간 계산하기 (0) | 2022.01.24 |
Helix MP3 Decoder 와 ID3 처리 (0) | 2022.01.18 |
동적 라이브러리 SO의 체크섬이 달라지는 이유 (0) | 2021.12.18 |
크로스컴파일러 개발환경 구축에 대한 팁 (0) | 2021.12.18 |