컴퓨터 프로그래밍2009. 12. 18. 04:39


중간 단계 따윈 없이 바로 제작 과정 들어갑니다..

일단 WMP 의 주요 인터페이스는 이렇습니다.
IWMPCore -> 미플 총괄
IWMPControls -> 재생/정지
IWMPPlaylist -> 재생목록
IWMPMedia -> 곡하나
그외에
IWMPPlaylistCollection, IWMPPlaylistArray등이 있는데 특히 이 두개는 이번 플러그인 제작에 쓰였습니다.

제작할 플러그인은 다음곡들을 예약하는 기능이고 이름은 BookMe로 정했습니다.

BookMe 재생목록 만들기&가져오는 함수
일단 플러그인 내에서 이 BookMe 목록은 중요한데요 이 목록을 가져오는 함수인데
m_spCore->get_playlistCollection(&spPlaylistCollection); // 전체 재생목록
spPlaylistCollection->getByName(L"BookMe", &spPlaylistArray); // 이름이 BookMe인것들
spPlaylistArray->get_count(&playlistCount); // 일치하는 재생목록 갯수
if (playlistCount > 0)
    spPlaylistArray->item(0, &spPlaylist); // 처음 재생목록으로 선택
else
    spPlaylistCollection->newPlaylist(L"BookMe", &spPlaylist); // 새로 만듦

이 코드로 미플 재생시 BookMe 재생목록이 바로바로 생기게 되죠..
사용자는 다음에 듣고 싶은곡을 이 재생목록에 추가할테고요...
이제 남은건 현재 재생곡이 끝났을 때, 이 목록에 남은 곡이 있다면 그 곡을 재생하고 BookMe목록에서 지우는겁니다..

플러그인 프로젝트 생성시에 event항목을 체크하면 IWMPEvents를 상속받게 되어서, WMP의 다양한 이벤트에 대해 처리할 수 가 있게 됩니다.. 그중에는 PlayStateChange 함수에서  wmppsPlaying, wmppsMediaEnded 로 재생시작/정지를 알 수 있죠.. wmppsMediaEnded 이벤트가 발생하면 BookMe목록에서 하나 가져와서 재생하면 되는거죠, 근데 중요한것은 IWMPCore나 IWMPControls의 노래변경기능은 현재 재생중인 목록에서 가져온 미디어 객체만 허용하기 때문에, BookMe에서 가져온 객체를 가지고, 현재 재생중인 목록의 미디어들과 비교하면서 파일이 같은 미디어를 찾아서 재생시켜줘야 된다는 것입니다..
또 하나 플러그인을 제작하면서 힘들었던건... wmppsMediaEnded 이벤트 발생시 곡을 멈추고 원하는 곡을 재생하면, wmp가 선택한 노래로 바로 바뀌어 버리는것이었습니다.. 그래서 결국 타이머를 이용한 시간차로 해결했죠.. 자세한건 소스를....
그리고 중요한건 윈도우7에선 관리자모드로 visual studio를 켜야, 컴파일후 플러그인 등록이 됩니다~ 안그럼 에러뜸

Posted by orange code
컴퓨터 프로그래밍2009. 12. 17. 11:37
시험도 끝나고.. 간단한것을 하나 만들기로 했습니다..
리눅스용 프로그램중에 KDE의 AmaroK이 있는데요, 여기에 보면 노래 목록중에서 여러곡을 예약해서 순차/랜덤 재생과는 상관없이 현재 재생되는 곡이 끝나면 예약된 곡들이 순서대로 나오고 그 뒤에 원래 재생방식으로 돌아갑니다. 리눅스를 지우고 윈도우로 들어오면서 미디어 플레이어를 쓰게 됐는데 기능 중에 아쉬운 점이 있다면 이게 그 중 하나지요.. 또 하나라면 폴더별로 분류가 안된다는 점..
어찌됐든 그 기능을 직접 만들고자 SDK를 찾았습니다. WMP(Windows Media Player) SDK는 Windows SDK안에 속해 있고, 저는 윈도우7을 쓰기 때문에 WMP 11을 쓰고 WMP 11 SDK는 Windows SDK for Vista 이상에 포함됐다고 하네요..

윈도우7용 Windows SDK 입니다.. 원래 SDK는 최신유지해야하는법

설치를 할때 꼭 Samples를 포함해서 설치해야합니다.. 그 안에 프로젝트 템플릿이 들어있어요
설치가 완료 됐으면 프로젝트 템플릿을 설치합시다.
C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\multimedia\WMP\Wizards\wmpwiz\wmpwiz.vsz
파일을 엽니다.
Wizard=VsWizard.VsWizardEngine.9.0
Param="ABSOLUTE_PATH = C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\multimedia\WMP\Wizards\wmpwiz"
해당하는 두줄을 위처럼 수정합니다..  vs2005일경우 8.0 으로 하고,  ABSOLUTE_PATH는 이 파일이 들어있는 경로로 sdk가 다른 곳에 설치됐다면 그 주소로 적으면 됩니다.
수정이 다됐다면 이 폴더안의 wmpwiz.ico, wmpwiz.vsdir, wmpwiz.vsz 세파일을 선택하고, visual studio가 설치된 곳에서 vc\vcprojects 를 따라들어가서 세 파일을 복사해오면 끝입니다.

이렇게 뜬다면 성공

Posted by orange code
컴퓨터 프로그래밍2009. 12. 14. 20:19

바탕화면이나, 유저 홈디렉터리, 내음악, 내비디오, 내사진, 쿠키, 인터넷캐쉬 등..
여러 잡다한 시스템 폴더의 주소를 가져올 수 있습니다..

c++로 하시려면
shlobj.h 를 추가하시고
SHGetSpecialFolderPath 를 쓰심 됩니다

c#으로 쉽게 쓰시려면
밑의 소스 참고

Posted by orange code