참고. 롬 파일에 데이터(사운드, 이미지 등등) 파일 포함 방법

원문 : http://kkamagui.springnote.com/pages/428590

 

들어가기 전에...

 

0.시작하면서...

 사운드를 출력하거나 이미지를 출력하기위해서는 데이터가 필요하다. libfat를 이용해서 직접 디스크에 접근하는 방법도 있지만, 작은 크기의 파일이라면 롬 파일에 포함하는 것이 빠르고 편리하다.

 devkitPro에는 bin2s.exe라는 프로그램을 가지고 있다. bin2s는 binary 파일을 그대로 덤프하여 .s 확장자를 가진 어셈블리어 파일을 만들어 주는데 이것을 이용하면 .s 파일을 같이 링크하여 프로그램에 포함 시킬 수 있다.

 

1.bin2s.exe

 아래는 콘솔창에서 bell.bin 파일의 내용을 bell.s 파일로 덤프한 화면이다.

bin2s.PNG

 

 아래는 bell.s 파일의 내용이다. 단순하게 섹션을 나누고 global 키워드로 레이블을 export 한 것임을 알 수 있다.

  1. /* Generated by BIN2S - please don't edit directly */
     .section .rodata
     .balign 4
     .global bell_bin_size
    bell_bin_size: .int 27842
     .global bell_bin
    bell_bin:
     .byte   2,  0,  9,  0,  7,  0,  5,  0,  3,  0,  1,  0,255,255,  4,  0
     .byte   5,  0,  5,  0,  5,  0,  4,  0,  3,  0,  8,  0,  2,  0,  0,  0
     .byte   2,  0,  1,  0,  2,  0,  3,  0,  6,  0,  6,  0,  7,  0,  7,  0
  2. ......생략......
  3.  .byte   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
     .byte   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
     .byte   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
     .byte   0,  0
  4.  .global bell_bin_end
    bell_bin_end:

 

2.프로젝트에 추가 방법

 위에서 binary 파일을 어셈블리어 파일로 바꾸는 것에 대해서 알아보았다. 만약 프로젝트에 포함할 파일이 100개라면 100개를 다 일일이 바꿔주고 처리해야 할까?

 답은 "그렇지 않다" 이다. 프로젝트가 있는 makefile을 열어보면 맨 아래쪽에 아래와 같은 bin 파일에 대한 처리 부분이 나와있다.

  1. #---------------------------------------------------------------------------------
    %.bin.o : %.bin
    #---------------------------------------------------------------------------------
     @echo $(notdir $<)
     @$(bin2o)

 bin2o를 사용해서 bin 파일로 바꾼다는 것이다. bin2o? 우리가 알고있는 것은 bin2s.exe 인데??? bin2o는 bin2s.exe를 사용하는 쉘 매크로이고 devkitPro 폴더에 있는 base_rules 파일에 아래와 같이 정의되어있다.

  1. #---------------------------------------------------------------------------------
    # canned command sequence for binary data
    #---------------------------------------------------------------------------------
    define bin2o
     bin2s $< | $(AS) $(ARCH) -o $(@)
  2.  echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(<F) | tr . _)`.h
     echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(<F) | tr . _)`.h
     echo "extern const u32" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(<F) | tr . _)`.h
    endef

 위에서 보는 것과 같이 바로 어셈블리어 컴파일러(AS)에 넣어서 .o 파일을 생성한다. 그 아래에 있는 부분은 헤더파일을 생성하는 부분으로 파일명으로 .h파일을 생성하고 그 안에 아래와 같은 내용을 추가해 준다.

  1. extern const u8 bell_bin_end[];
    extern const u8 bell_bin[];
    extern const u32 bell_bin_size;

 즉 소스에서 a = bell_bin[ 3 ]와 같이 사용할 수 있도록 헤더를 구성해 주는 것이다.

 

3.makefile 확인 및 수정 방법

 이제 편리한 사용을 위해 프로젝트의 makefile을 손볼 차례다. makefile을 조금만 수정하면 특정 폴더에 bin 파일을 넣는 것 만으로도 롬파일에 데이터를 포함하고 또 사용할 수 있다.

 보통 데이터는 data 폴더를 사용하므로 bin 파일도 data 폴더에 넣는 걸로 하자.

  1. #---------------------------------------------------------------------------------
    # BUILD is the directory where object files & intermediate files will be placed
    # SOURCES is a list of directories containing source code
    # INCLUDES is a list of directories containing extra header files
    # DATA is a list of directories containing binary files
    # all directories are relative to this makefile
    #---------------------------------------------------------------------------------
    BUILD  := build
    SOURCES  := source MyLibrary 
    INCLUDES := include build
    DATA  :=  data
  2. ...... 생략 ......

  3. #---------------------------------------------------------------------------------
    # you need a rule like this for each extension you use as binary data
    #---------------------------------------------------------------------------------
    %.bin.o : %.bin
    #---------------------------------------------------------------------------------
     @echo $(notdir $<)
     @$(bin2o) 

 위에서 조금 의아한 부분이 INCLUDES에 있는 build 일 것이다. 왜 build 폴더를 Include에 넣느냐 하면, bin2o에 의해 생성된 .o 파일과 .h 파일이 build 폴더에서 생성되기 때문이다. 일단 한번 돌려보면 알 수 있다.

 

4.Wave or MP3 파일을 Raw 파일로 바꾸는 방법

 Wave나 MP3 파일을 NDS에서 출력할 수 있는 Sound 파일로 바꾸려면 일단 Raw Data로 변경한 후, libnds의 PlaySound() 옵션에 적절하게 파라메터를 넘겨서 Play 해주면 된다.

 Raw Data로 바꾸는 방법은 공개 소프트웨어인 Switch(http://www.nch.com.au/switch/plus.html)를 이용하면 쉽게 Raw Data로 변경가능하다. 아래는 Wave 파일을 넣어서 Raw 파일로 변경하는 화면이다.

 Switch.PNG

<Switch 인코딩(Encoding) 화면>

 위의 붉은 색 사각형이 주의깊게 봐야 할 부분이다. 순서는 아래와 같다.

  1. .raw 파일로 output 형식을 설정한다.
  2. Encoder Options 버튼을 누른다.
  3. Codec Settings에서 옵션을 잘 조정하고 주의 깊게 봐둔다.(PlaySound() 함수에서 사용되는 옵션들이다. NDS 배경음악으로는 저정도도 괜찮다. 더 높으면 좋지만 낭비라고 생각한다.)
  4. Convert 버튼을 누른다.

 

결과 파일은 .raw 파일이 나오는데 이것을 data 폴더에 .bin으로 고치고 사용하면 된다. 자세한 사용법은 04 NDS 커널(Kernel) 만들기 소스를 참고하면 된다.

 

5.마치면서...

 지금까지 데이터 파일을 삽입하는 방법에 대해서 알아보았다. 간단한 wave 파일 같은 경우는 쉽게 포함할 수 있으니 한번 테스트 해보도록 하자.

 

 

 

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts