강좌,팁

[강좌:018] 따라하기 13. AudioPlayer(MP3, WMA, ASF, WAV 등) (1)

이번 강좌에서는 앞 강좌(강좌:017)에서 만든 KD_MCI.dll 파일을 이용하여 AudioPlayer 프로그램을 만들어 보겠습니다. 제가 원래 만들려고 했던 것은 MP3 Player였는데,Windows의 MCI를 이용하기 때문에 MP3 파일 뿐아니라, WMA, ASF, WAV 등의 파일들도모두 지원합니다. Windows가 지원하는 사운드 포맷은 모두 지원한다고 볼 수 있습니다.MID, RMI 등의 파일도 Play 되는데, 이들 파일은 아마도 파일 자체 내에 timecode가 들어 있지 않은 것 같더군요. 그래서 진행 시간이 숫자로 표시되지 않기 때문에파일 선택 메뉴에서는 제외하였습니다.

이번 강좌의 테스트용으로 이용될 MP3 파일은 저작권 문제를 받지 않을 수 있는에스라 하우스(www.ezrahouse.org)와창원극동방송에서 제작한 "그리스도를 아십니까?"라는 예전의 방송프로중에서 하나를 이용하였습니다. "그리스도를 아십니까?"라는 타이틀로방송된 내용은 에스라 하우스에서 CD로 판매되고 있습니다. 관심있으신 분은 참고하십시오.

그리고, 제가 AudioPlayer(정식 버전은 극동테크의 KDPlayer로 만들어져 있음)를만들게 된 이유도 에스라 하우스의 각종 강좌 CD를 잘 듣기 위해 만들었으므로 적절한예가 될 수 있으리라고 봅니다. 강좌 MP3 파일을 듣기 위해서는 이어듣기 기능이유용한데, Winamp 같은 플레이어에서는 파일 내의 위치를 기억하는 기능은 없더라구요.그래서 이어듣기 기능이 추가된 AudioPlayer를 만들어 보도록 하겠습니다.

KDPlayer를 만들면서 작업한 소스를 상당부분 그대로 가져와서 작업하였고, AudioPlayer라는이름의 강좌용으로 소개하기 위해 복잡하고 겉치레에 해당되는 기능들은 과감히 제거하였습니다.그리고 Playlist에 관련된 부분도 설명을 복잡하게 하므로 제외하였습니다. Playlist구현에 관련된 부분은 본 강좌 끝부분에서 방향을 제시하는 것으로 갈음하겠습니다.

또 한가지 먼저 알려드릴 것은 이번 강좌도 될 수 있는 한 간단하게 만들려고했지만, 그리 쉽지는 않더군요. 그래서 일일이 모든 문장, 모든 함수에 대해서 설명을다 드리기는 어렵구요, 앞번의 강좌들에서 했던 것처럼 실제 작업하는 순서대로 설명을하려면 너무 많은 노력이 필요하기 때문에 모듈(파일)별로 설명을 하도록 하겠습니다.

 

1. 본 강좌에 필요한 파일 다운로드하기
CVI 정보나눔 사이트(본 사이트)의자료실에서 그림 18.1의 빨간 네모로 표시된 파일들을 다운로드 받으십시오. 다음의제목으로 업로드되어 있습니다.

[DLL]극동테크의 범용 함수 모음(kdtechno_dll.dll)
[DLL]극동테크의 Audio Play 모듈(KD_MCI.dll) 
[소스]극동테크의 INI 프로그래밍 템플릿(DEFPROG_INI build 2) 
[강좌자료]강좌:018 AudioPlayer의 Resourece 

다운로드 받은 다음에는 그림 18.1과 같이 폴더를 만들어서 그 폴더 안에다 압축파일들을해제하십시오.

그림 18.1 AudioPlayer 작업에 필요한 파일들

2. Project 파일 구성 및 속성 설정
이제 LabWindows/CVI를 실행시켜서L018_AudioPlayer.prj 라는 이름으로 프로젝트 파일을 만드십시오. 그리고, 그림18.1에 있는 파일들 중에서 KD_MCI.h, KD_MCI.lib, kdtechno_dll.h, kdtechno_dll.lib,AudioPlayer.uir 파일을 먼저 프로젝트에 포함시키십시오.

그 다음, Project 창에서 Build-Target Settings 메뉴를 선택하여, ApplicationTitle로는 AudioPlayer를 입력하고, Application Icon File에는
"MetallicAutio CD.ico" 파일을 지정하십시오.

이제는 Project 창에서 AudioPlayer.uir 파일을 더블클릭하여 UIR 창을 연 다음,UIR 파일을 Save하십시오. 현재는 수정된 것이 없기 때문에 File-Save 메뉴는 비활성화되어있을 겁니다. UIR의 컨트롤 중에서 아무거나 하나를 선택하여 위치를 옆으로 옮겼다가다시 원래 위치로 옮겨놓으면, File-Save 메뉴가 활성화 될 것입니다. 그때 Save를하십시오. 이렇게 하면, uir 파일 저장시에 AudioPlayer.h 파일이 만들어 집니다.이 AudioPlayer.h 파일도 프로젝트에 포함시키십시오.

계속해서 이제는 UIR 창의 Code-Generate-All Code... 메뉴를 선택하여, 그림18.2와 같이 설정하여 OK 버튼을 클릭합니다.

그림 18.2 Generate All Code 대화상자

OK 버튼을 누르면, AudioPlayer.c 라는 파일이 만들어지면서 Project에 포함됩니다.
또,DEFPROG_INI.h와 DEFPROG_INI.c라는 파일은 각각 AudioPlayer_INI.h와 AudioPlayer_INI.c파일로 이름을 변경하여 프로젝트에 포함시킵니다. 이들 파일 내의 내용은 나중에수정하도록 하구요.

또, 있습니다. 통합헤더파일 AudioPlayer_DEF.h 파일을 비어있는 채로 만들어서프로젝트에 포함시키고, AudioPlayer_common.h, AudioPlayer_common.c 파일도 만들어서프로젝트에 포함시킵니다. 일단은 프로젝트에 필요한 파일들을 집어 넣은 후, 나중에내용을 채워나가도록 하겠습니다.

이제 프로젝트 창이 그림 18.3과 같이 다 준비되었습니다.

그림 18.3 AudioPlayer 프로그램의 프로젝트

3. UIR 파일 구성 및 속성
UIR 파일은 이미 만들어진 것을 AudioPlayer_Res.zip파일에 포함시켜 두었기 때문에 별로 설명은 필요없으리라 생각됩니다만, 정리하는차원에서 적어보겠습니다. 우선 화면을 보면 그림 18.4와 같습니다.

그림 18.4 AudioPlayer.uir 파일

표 18.1에 AudioPlayer Panel의 속성설정 내용을 보였습니다. 표시하지는 않았지만,Other Attributes에서 Sizable과 Can Maximize를 체크해제하도록 합니다. 필요없는옵션이겠죠?

표 18.1 AudioPlayer의 Main Panel의 속성설정

속성

내용

Constant Name

PANEL

Callback Function

PanelCB

Panel Title

Audio Player

 

표 18.2에는 포함된 컨트롤들의 속성설정 내용을 열거하였습니다.

표 18.2 컨트롤의 속성 설정

컨트롤 종류

Constant
Name

Callback Function

Label

Data Type

Default Value 혹은 InitialState

비고

String

strFilename

 

 

 

 

Control Mode:Indicator

String

strCurrTime

 

 

 

 

Control Mode:Indicator
Font: NI7SegMetaFont
Size: 33 Points
Font 색: 연두색

Numeric Slide

numBalance

numBalance

 

int

0

Min.:-100
Max:100

Numeric Slide

nsVolume

nsVolume

 

unsigned short int

10000

Min: 0
Max:65535

Numeric Slide

nsProgress

nsProgress

 

unsigned int

0

Control Mode: Validate

Check Box

chkRepeat

chkRepeat

반복

 

Off

 

Check Box

chkMemFile

chkMemFile

이어듣기

 

Off

 

Picture Button

cmdPlay

cmdPlay

 

 

 

Play 버튼 그림

Picture Button

cmdPause

cmdPause

 

 

 

Pause 버튼 그림

Picture Button

cmdStop

cmdStop

 

 

 

Stop 버튼 그림

Picture Button

cmdOpen

cmdOpen

 

 

 

Open 버튼 그림

Picture Button

cmdPlay

cmdPlay

 

 

 

Play 버튼 그림

String

strJumpTo

strJumpTo

Jump to

 

 

Control Mode:Normal

Timer

TIMER

TimerCB

 

 

 

Enable 체크해제

 

4. 통합헤더파일 작성
AudioPlayer_DEF.h 파일은 여러개의 헤더파일들을하나로 통합하기 위해 만든 파일입니다. 그림 18.5와 같이 만들었습니다.

그림 18.5 통합헤더파일 AudioPlayer_DEF.h

6라인의 KD_MCI.h 파일은 windows.h와 mmsystem.h라는 Windows의 중요한 헤더파일을포함하고 있으므로, 다른 헤더파일보다 먼저 include 되도록 합니다.

5. INI 파일 작업
INI 파일을 이용할 때의 전통적인 저의 절차대로DEFPROG_INI.h와 DEFPROG_INI.c 파일을 수정해 나갑니다. 그 전에 먼저 결정해야할것은 AudioPlayer 프로그램에서 프로그램 종료 후에 저장되어야할 설정이 어떤 것인지를결정해야합니다.

그림 18.4를 보면서 유추할 수 있는 것은 "반복" 옵션과 "이어듣기"옵션은 반드시 저장되어야겠죠? 그리고, 스피커의 좌우를 나타내는 Balance 정보도저장되어 있다가 다시 실행되었을 때 그 상태가 유지되면 좋겠죠?

그리고, 이어듣기 기능(프로그램이 종료되었다가 다시 시작되었을 때 이전에 Play되던파일의 최종 Play 위치 정보를 기억하였다가 다시 Play해주는 기능)이 제대로 되려면,현재 Play되는 파일의 전체경로명, 파일명, Play되던 시간 등의 정보가 필요합니다.현재 Play되는 파일의 전체 시간 정보도 기억해 두었다가 나중에 불러올 때 대조를해볼 수 있도록 하면 더욱 견실한 프로그램이 될 수 있겠죠?

이러한 의도를 갖고 AudioPlayer_INI.h와 AudioPlayer_INI.c 파일을 다음 순서대로수정해 나갑니다.

먼저, AudioPlayer_INI.h와 AudioPlayer_INI.c 파일 내의 DEFPROG라는 문자열을AudioPlayer라는 문자열로 대체합니다.
소문자에 대해서는 defprog를 ap라고 줄여서대체합니다.

그리고, AudioPlayer.h 파일에 AudioPlayer_INI_SETTING 구조체 내에 그림 18.6과같은 멤버변수들을 추가합니다.

그림 18.6 AudioPlayer_INI.h 파일의 수정

그리고, AudioPlayer_INI.c 파일에는 각 함수들의 내용을 추가하도록 합니다.먼저, 그림 18.7에는 Initialize_AudioPlayer_INI() 함수의 수정내용입니다.

그림 18.7 Initialize_AudioPlayer_INI() 함수의 수정내용(AudioPlayer_INI.c파일)

그림 18.8에는 Open_AudioPlayer_INI() 함수를 수정한 화면을 보였습니다.

그림 18.8 Open_AudioPlayer_INI() 함수의 수정내용(AudioPlayer_INI.c파일)

72라인은 71라인에서 파일명도 함께 저장되었기 때문에 굳이 저장할 필요가 없습니다.그래서 코멘트 처리를 하였습니다. 그림 18.9에는 Save_AudioPlayer_INI() 함수의수정내용을 보였습니다.

그림 18.9 Save_AudioPlayer_INI() 함수의 수정내용(AudioPlayer_INI.c파일)

그리고, INI 함수 중 마지막으로 Refresh_AudioPlayer_INI() 함수의 수정내용을그림 18.10에 보였습니다.

그림 18.10 Refresh_AudioPlayer_INI() 함수의 수정내용(AudioPlayer_INI.c파일)

6. AudioPlayer_common.h(c) 파일 작업
이제 일반적인 용도의 사용자정의 함수 등의 정보를 갖는 AudioPlayer_common.h와 AudioPlayer_common.c 파일에대한 작업으로 들어갑니다. 실제로는 KDPlayer 작업을 하면서 여러번의 수정작업으로만들어졌는데, 그 과정을 다 소개하기는 어렵고, 만들어진 결과만을 보고 설명드리겠습니다.

그림 18.11 AudioPlayer_common.h 파일의 내용

이제 AudioPlayer_common.c 파일의 내용을 하나씩 살펴보겠습니다. 그림 18.12에는AudioPlayer_common.c 파일의 첫부분과 Initialize_AudioPlayer() 함수에 대한 정의부분이 나옵니다.

그림 18.12 AudioPlayer_common.c 파일의 첫부분과 Initialize_AudioPlayer()함수 내용

그림 18.13에는 Finish_AudioPlayer()함수에 대한 내용입니다.

그림 18.13 Finish_AudioPlayer() 함수 내용(AudioPlayer_common.c파일)

그림 18.14에는 Audio file 명이 주어졌을 때, 그 파일을 Open하는 함수입니다.

그림 18.14 KDPlayer_OpenFile() 함수 내용(AudioPlayer_common.c파일)

그림 18.15~17까지의 함수들은 이어듣기를 위해 중요한 함수들인데, 마지막 Play위치 정보를 저장하고, 불러오고, 그 정보 파일을 삭제하는 함수들입니다.

그림 18.15 Save_LastPlayPosition() 함수의 내용(AudioPlayer_common.c파일)

 

그림 18.16 Open_LastPlayPosition() 함수의 내용(AudioPlayer_common.c파일)

 

그림 18.17 Delete_LastPlayPosition() 함수의 내용(AudioPlayer_common.c파일)

그림 18.18에는 Timer를 Enable하고 Disable 하는 함수입니다.

그림 18.18 Start_Timer(), Stop_Timer() 함수의 내용(AudioPlayer_common.c파일)

그림 18.19에는 Str_ms2MinSec() 함수와 GetDirectoryName_Only() 함수의 내용을보여주고 있는데, Str_ms2MinSec() 함수는 밀리초(ms) 값을 분과 초로 분리하는 함수이고,GetDirectoryName_Only() 함수는 전체 경로 중에서 파일명을 제외한 Directory명만뽑아내는 함수입니다.

그림 18.19 Str_ms2MinSec() 함수와 GetDirectoryName_Only()함수의 내용(AudioPlayer_common.c 파일)

여기까지 작업하게 되면, 여러 콜백 함수들을 구성하기 위한 기초 함수들은 다갖추어진 셈입니다. 이제는 콜백함수들을 구성하도록 하겠습니다.


석상수

2006.09.05 14:01:57
*.23.198.196

GetFileSize(filepath, &fsize);
이 구문에서요...
처음 실행시.. 혹은 ini, pos 파일이 삭제되어 파일이 존재하지
않을경우... Error Message가 뜨네요.
그렇다면 이것보다 FileExist(filepath, &fsize) 함수로
파일 존재여부를 확인하는것이 맞지 않을까요?
List of Articles
번호 제목 글쓴이 날짜 조회 수
56 [팁:6] 배포판(설치) 프로그램에 데이터 폴더 포함하기 허창원 2004-05-20 14916
55 [팁:5] Parallel Port 이용할 때, CVI Low-level support driver [2] 허창원 2004-05-18 12860
54 [팁004]팁아닌...팁..Text Message오른쪽 정렬..... [4] 야리싸내 2004-02-02 14964
53 객체의 위치값을 이용한 퍼즐 게임. file [2] 조인배 2004-01-09 13724
52 [강좌020]실행시에 uir파일을 사용하지 맙시다. file [6] 야리싸내 2003-12-19 13338
51 [강좌:019] CVI 런타임엔진과 설치 프로그램 허창원 2003-12-08 14648
50 그래프에 Zoom 기능을 만들어봤습니다.. ^^ file 야리싸내 2003-09-30 13393
49 헉..ㅠ_ㅠ;; 죄송합니다..위에 첨부파일에 소스가 없네요....ㅠ_ㅠ; file 야리싸내 2003-11-26 13338
48 [팁:003] NI DAQ 프로그래밍 예제 얻기 file 허창원 2003-08-11 14858
47 켄바스 기능을 이용한 아날로그시계 file [1] 조인배 2003-07-09 14545
46 [강좌:018] 따라하기 13. AudioPlayer(MP3, WMA, ASF, WAV 등) (2) 허창원 2003-04-11 13230
» [강좌:018] 따라하기 13. AudioPlayer(MP3, WMA, ASF, WAV 등) (1) [1] 허창원 2003-04-11 14697
44 [강좌:017] 따라하기 12. 재사용 가능한 Library(static lib, DLL) 만들기 허창원 2003-04-11 15481
43 [팁:003] 종료시 MS Office와의 충돌 피해가는 대안 [2] 허창원 2003-04-01 13561
42 [강좌:016] 따라하기 11. 데이터 뷰어3로 업그레이드하기 (2) 허창원 2003-03-19 13875
41 [강좌:016] 따라하기 11. 데이터 뷰어3로 업그레이드하기 (1) 허창원 2003-03-19 12743
40 [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (3) [2] 허창원 2003-02-25 14019
39 [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (2) [2] 허창원 2003-02-25 12546
38 [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (1) [2] 허창원 2003-02-25 14840
37 [강좌:014] 따라하기 9. 터치스크린에서 숫자 입력하기 (3) [4] 허창원 2003-01-15 12502