<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=WinampPlugin%EC%9D%84%EC%9D%B4%EC%9A%A9%ED%95%9C%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D</id>
	<title>WinampPlugin을이용한프로그래밍 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=WinampPlugin%EC%9D%84%EC%9D%B4%EC%9A%A9%ED%95%9C%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=WinampPlugin%EC%9D%84%EC%9D%B4%EC%9A%A9%ED%95%9C%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D&amp;action=history"/>
	<updated>2026-05-16T03:23:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=WinampPlugin%EC%9D%84%EC%9D%B4%EC%9A%A9%ED%95%9C%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D&amp;diff=40302&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:28, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=WinampPlugin%EC%9D%84%EC%9D%B4%EC%9A%A9%ED%95%9C%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D&amp;diff=40302&amp;oldid=prev"/>
		<updated>2021-02-07T05:28:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;winamp 의 plugin 을 이용한 프로그래밍&lt;br /&gt;
----&lt;br /&gt;
winamp 의 경우 다양한 plugin 를 지원한다. &lt;br /&gt;
&lt;br /&gt;
input plugin은 해당 화일을 읽어드리고 output plugin 으로의 출력을 소스를 제공한다. output plugin 은 출력 소스를 사운드카드나 하드 디스크로의 출력을 관장한다. 이 중간에 DSP 와 Visual plugin 이 callback 으로 결과물을 받은뒤 변수들을 이용한다.&lt;br /&gt;
&lt;br /&gt;
이들을 잘 이용하면 복잡한 ACM 관련 처리 없이 훌륭한 확장성의 플레이어를 만들 수 있을 것이다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Simple Code ===&lt;br /&gt;
컴파일하려면 in2.h 와 Out.h 가 필요하다. 이는 http://www.winamp.com/nsdn/ 에서 Winamp SDK를 다운받는다.&lt;br /&gt;
&lt;br /&gt;
http://download.nullsoft.com/winamp/client/wa502_sdk.zip&lt;br /&gt;
&lt;br /&gt;
 #include &amp;amp;lt;windows.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;stdio.h&amp;amp;gt;&lt;br /&gt;
 #include &amp;quot;in2.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 // define procedures, that&amp;#039;ll be found in a .DLL&lt;br /&gt;
 typedef In_Module* (*INHDRPROC)(void);&lt;br /&gt;
 typedef Out_Module* (*OUTHDRPROC)(void);&lt;br /&gt;
 &lt;br /&gt;
 // dsp-functions&lt;br /&gt;
 int dsp_donothing(short int *, int cnt, int, int, int) {&lt;br /&gt;
 	return cnt;&lt;br /&gt;
 }&lt;br /&gt;
 int dsp_isactive() {&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // other functions, needed to get it to work&lt;br /&gt;
 void SAVSAInit(int maxlatency_in_ms, int srate){&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void SAVSADeInit(){&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void SAAddPCMData(void *PCMData, int nch, int bps, int timestamp){&lt;br /&gt;
 //	printf (&amp;quot;%d,%d,%d\n&amp;quot;, nch,bps,timestamp);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int  SAGetMode(){&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void SAAdd(void *data, int timestamp, int csa){&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void VSAAddPCMData(void *PCMData, int nch, int bps, int timestamp){&lt;br /&gt;
 //	printf (&amp;quot;%d,%d,%d\n&amp;quot;, nch,bps,timestamp);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int  VSAGetMode(int *specNch, int *waveNch) {&lt;br /&gt;
 	*specNch = *waveNch = 0;&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void VSAAdd(void *data, int timestamp){&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void VSASetInfo(int nch, int srate){&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void SetInfo(int bitrate, int srate, int stereo, int synched){&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void playFile() {&lt;br /&gt;
 &lt;br /&gt;
     // 플러그인인 DLL들을 load 하는 부분.&lt;br /&gt;
     HINSTANCE hout = LoadLibrary(&amp;quot;out_wave.dll&amp;quot;);&lt;br /&gt;
     HINSTANCE hin = LoadLibrary(&amp;quot;in_vorbis.dll&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     // 모듈 관련 포인터 얻어오는 부분&lt;br /&gt;
     INHDRPROC ihp = (INHDRPROC)GetProcAddress(hin,&amp;quot;winampGetInModule2&amp;quot;);&lt;br /&gt;
     OUTHDRPROC ohp = (OUTHDRPROC)GetProcAddress(hout,&amp;quot;winampGetOutModule&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     // Mapping. &lt;br /&gt;
     In_Module* in = ihp();&lt;br /&gt;
     Out_Module* out = ohp();&lt;br /&gt;
     &lt;br /&gt;
     // 버전이 다른 경우에 대한 처리.&lt;br /&gt;
     if (in-&amp;amp;gt;version != IN_VER || out-&amp;amp;gt;version != OUT_VER) &lt;br /&gt;
     {&lt;br /&gt;
         FreeLibrary(hout);&lt;br /&gt;
         FreeLibrary(hin);&lt;br /&gt;
         return;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // 이 프로그램은 console mode 기반이다. 그러므로 window 관련 셋팅은 NULL.&lt;br /&gt;
     out-&amp;amp;gt;hMainWindow = NULL;&lt;br /&gt;
     out-&amp;amp;gt;hDllInstance = hout;&lt;br /&gt;
 &lt;br /&gt;
     in-&amp;amp;gt;hMainWindow = NULL;&lt;br /&gt;
     in-&amp;amp;gt;hDllInstance = hin;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     if (in-&amp;amp;gt;UsesOutputPlug)&lt;br /&gt;
     {&lt;br /&gt;
         in-&amp;amp;gt;outMod = out;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // 아직 파악 안된 부분. input plugin 과 Visual plugin 연결부분이라 생각. &lt;br /&gt;
     // 함수포인터들을 적절하게 매핑해준다.&lt;br /&gt;
     // 여기서는 화면 출력 부분이 없으므로 비어있는 callback 함수를 만들어서 연결해준다.&lt;br /&gt;
     // 추후에 Visualization 부분을 만들때는 실제 함수부분을 이용하게 될 것이다.&lt;br /&gt;
     in-&amp;amp;gt;SAVSAInit = SAVSAInit;&lt;br /&gt;
     in-&amp;amp;gt;SAVSADeInit = SAVSADeInit;&lt;br /&gt;
     in-&amp;amp;gt;SAAdd = SAAdd;&lt;br /&gt;
     in-&amp;amp;gt;SAGetMode = SAGetMode;&lt;br /&gt;
     in-&amp;amp;gt;SAAddPCMData = SAAddPCMData;&lt;br /&gt;
     in-&amp;amp;gt;VSAAddPCMData = VSAAddPCMData;&lt;br /&gt;
     in-&amp;amp;gt;VSAGetMode = VSAGetMode;&lt;br /&gt;
     in-&amp;amp;gt;VSAAdd = VSAAdd;&lt;br /&gt;
     in-&amp;amp;gt;VSASetInfo = VSASetInfo;&lt;br /&gt;
     &lt;br /&gt;
     // DSP Plugin 부분. 역시 위와 비슷한 맥락일듯. &lt;br /&gt;
     in-&amp;amp;gt;dsp_dosamples = dsp_donothing;&lt;br /&gt;
     in-&amp;amp;gt;dsp_isactive = dsp_isactive;&lt;br /&gt;
 &lt;br /&gt;
     in-&amp;amp;gt;SetInfo = SetInfo;&lt;br /&gt;
 &lt;br /&gt;
     // 플러그인 초기화.&lt;br /&gt;
     out-&amp;amp;gt;Init();&lt;br /&gt;
     in-&amp;amp;gt;Init();&lt;br /&gt;
 &lt;br /&gt;
     char playFile[256] = &amp;quot;garden.ogg&amp;quot;;&lt;br /&gt;
     &lt;br /&gt;
 	printf (&amp;quot;%d \n&amp;quot;, in-&amp;amp;gt;version); // 플러그인 버전이 출력&lt;br /&gt;
 	printf (&amp;quot;%s \n&amp;quot;, in-&amp;amp;gt;description); // 플러그인 설명이 출력&lt;br /&gt;
 	printf (&amp;quot;%s \n&amp;quot;, in-&amp;amp;gt;FileExtensions); // 해당 플러그인이 지원하는 확장자가 나옴.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     // if playing starts correctly&lt;br /&gt;
     if (!in-&amp;amp;gt;Play(playFile))&lt;br /&gt;
     {&lt;br /&gt;
         // 볼륨 &amp;amp;amp; panning (좌 우 balance) 조정.&lt;br /&gt;
         in-&amp;amp;gt;SetVolume(255);&lt;br /&gt;
         in-&amp;amp;gt;SetPan(0);&lt;br /&gt;
 &lt;br /&gt;
         //int x = 1,len = in-&amp;amp;gt;GetLength();&lt;br /&gt;
         //for (;x=1 &amp;amp;amp;&amp;amp;amp; in-&amp;amp;gt;GetOutputTime()&amp;amp;lt;len;) Sleep(100);&lt;br /&gt;
         &lt;br /&gt;
 		for (int i=0;i&amp;amp;lt;10000;i++) {&lt;br /&gt;
 			printf(&amp;quot; %d ms\n&amp;quot;, in-&amp;amp;gt;GetLength()); // 전체 play time (ms)&lt;br /&gt;
 			printf(&amp;quot;current : %d ms\n&amp;quot;, in-&amp;amp;gt;GetOutputTime()); // 진행중 play time (ms)&lt;br /&gt;
 			Sleep(1000); // 각 plugin 에서의 작업은 멀티스레드로 비동기적으로 일어난다.&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
         // when playing stops, terminate&lt;br /&gt;
         in-&amp;amp;gt;Stop();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // un-init plugins&lt;br /&gt;
     in-&amp;amp;gt;Quit();&lt;br /&gt;
     out-&amp;amp;gt;Quit();&lt;br /&gt;
 &lt;br /&gt;
     // dll 들 이용 완료.&lt;br /&gt;
     FreeLibrary(hin);&lt;br /&gt;
     FreeLibrary(hout);&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
 	playFile();&lt;br /&gt;
 }&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>