winamp’ı kendi programınızdan yönetin

Winamp’ı kendi programınızdan yönetmek istemez miydiniz?.

winamp

hem bütün özelliklerine hükmederek  hem de birçok programlama dilinde. (C/C++,JAVA,DELPHI vs.. yeterki programınızdan komut satırına ulaşın 🙂 ),

elektronik  bir devre ile winampı kumanda etme imkanı sağlayan bilgisayar programları yazmanın çok kolay olduğunu farkedeceksiniz.

Böyle uygulamaları yapanları internetten görmüşüzdür. Fakat kapalı kutu gibidirler, paylaşsalar da derlenmiş hallerini paylaşıyorlar.

Winamp’ı bir elektronik devre ile kontrol etmeyi düşünüyordum. Mesela bir atari kolu veya kablosuz bir uygulama ile :). Araştırmalarım sonucu, Winamp’ı kontrol etmede edindiğim bilgileri herkesle paylaşmak istedim, çünkü Winamp’ın başka bir program ile kontrol edilmesi ile ilgili türkçe dökümanlara hiç rastlamadım.

Bu yazıda Winamp’ı kontrol etmenin ne kadar kolay olduğunu göreceksiniz. Bir nebze olsun konudaki eksikliğin giderileceğine ve daha güzel, daha fazla özellikli winamplı projelerin oluşturulmasına yardımcı olması temennisi dileğiyle, nice Winamplı projelere…

Hangi Yöntemler Var?

Winamp’ı,

  • Command Line Interface (Komut Satırından)
  • Windows Messages (Windows Mesajlarından)
  • CLAmp (Command Line Winamp)

ile kontrol edebilirsiniz.

Komut satırından kontol etmek çok basit fakat; hoş olmayan tarafı sadece 3-4 tane komut kullanabiliyorsunuz. Halbuki biz herşeye hakim olmak istiyoruz, örneğin;

  • çalan medyanın başlığını almak,
  • listede kaçıncı sırada olduğunu öğrenmek,
  • medyanın toplam süresini elde etmek,
  • listeyi rasgele çalmasını sağlamak,
  • sonraki/önceki medyayı oynatmasını sağlamak,
  • winamp penceresini simge durumuna küçültmek,
  • sesi arttırıp azaltmak,
  • videoyu tam ekran yapmak vs…

Windows Messages yönteminde, Winamp’a tam hakim oluyorsunuz fakat; bu yöntemi kullanmak komut satırına nazaran çok zor. Programınızdan Winamp’ın penceresini tanımlayıp bu pencereye mesaj kodları göndermeniz gerekiyor. Örneğin 40045 play butonuna karşılık geliyor.

Bize tam hakimiyet sağlayacak, hem de komut satırı gibi kolay bir yol yok mu? dersek, CLAmp programcığı, ben varım diyor.

  • CLAmp Programcığı (CLAmp.exe)

Bu program yardımıyla Winamp’a tam hakim olacağız, hem de birçok programlama dilinde.
Tek yapmamız gereken, programımızdan CLAmp’ı çalıştırmak ve ona komutlar göndermek. Örnekleri ve CLAmp’ı buradan indirin.

CLAmp, 124 Kb boyutunda, tek bir dosya halindedir. Kurulum gerektirmez. DLL’ye ihtiyaç duymaz.

Peki bu programıcığı nasıl kullanıyoruz?

Kullanımı komut satırından olmakta. İster el ile istersek yazdığımız program ile komutsatırına ulaşarak kullanabilirz. Kullanımı oldukca basit.

Kullanımı:
CLAmp {Options}

Bazı örnekler

CLAMP.exe /START
Winamp'ı başlatır.

CLAMP.exe /PLAY
Medyayı oynat.

CLAMP.exe /EXIT
Winamp'ı kapatır.

CLAMP.exe /NEXT
Sonraki medyayı oynatır.

CLAMP.exe /TITLE
Çalan medyanın başlığını döndürür.

CLAMP.exe /FWD
Çalan medyayı 5 sn. ileri sarar

CLAMP.exe /PLPOS
Çalanın listede kaçıncı sırada olduğunu verir. (4/9 gibi)

CLAMP.exe /PLCLEAR /PLADD "MySong1.mp3" /PLADD "MySong2.mp3" /PLAY
listeyi temizle, listeye iki mp3 ekle. Sonra oynat.

Görüldüğü gibi birden fazla komut da kullanılabillir.

CLAmp, her komutta, eğer winamp açık değil ise winmap’ı açar ve komutu uygular.
Java ve C ile winamp yönetimi için örnekler:

Java
String clampYolu = "C:\\clamp\\CLAMP.exe";
//oynatsın
Runtime.getRuntime().exec(clampYolu +” /PLAY”);
//sonrakine geçsin
Runtime.getRuntime().exec(clampYolu +” /NEXT”);
//sesi maksimum yapsın
Runtime.getRuntime().exec(clampYolu +” /VOLMAX”);

C
int cevap;
cevap = system("c:\\clamp\\clamp.exe /PLAY");
if(cevap!=0){ printf("hata var"); system("PAUSE"); }

Java ile winampta çalan medyanın başlığını almak
String clampYolu = "C:\\clamp\\CLAMP.exe";
proc = runt.exec(clampYolu+" /TITLE");
in = proc.getInputStream();
donus = new DataInputStream(in).readLine();
System.out.println(donus);

İndirdiğiniz dosyada yer alan java programlarının ekran görüntüleri aşağıda verilmiştir.
Wimampta çalan medyanın başlığını alan küçük program.
medyabasligi

Winamp’ın kontrolünu sağlayan öncekine nazaran daha gelişmiş bir program.
genisprog

CLAmp ile Kullanılabilecek Bütün Komutlar (kaynak)
Program Control
START
Start Winamp
QUIT
Exit Winamp
RESTART
Restart Winamp
TOFRONT
Bring Winamp window to front

General Control
PLAY
Play (current file) - Quits Stopped or Pause mode
STOP
Stop playing
STOPFADE
Stop playing with fadout
STOPAFTER
Stop playing after current track (returns now, stops later)
PAUSE
Toggle pause mode
PAUSE ON|OFF
Sets pause mode
PLAYPAUSE
Same as PAUSE
NEXT
Play next song
PREV
Play previous song
FWD
Forward 5 seconds
FORWARD
Same as above
REW
Rewind 5 seconds
REWIND
Same as above
RESTART
Restart current track from beginning (not working with Winamp 2)
JUMP
Seek to (in millisecs)
QUITAFTER
Close winamp upon completion of current track - CLAmp will not return immediately

Winamp Modes
REPEAT
Toggle Repeat mode
SWREPEAT
Same as above
REPEAT ON
Set Repeat mode ON
REPEAT=1
Same as above
REPEAT OFF
Set Repeat mode OFF
REPEAT=0
Same as above
REPEAT STATUS
Query REPEAT status (ON, OFF)
GETREPEAT
Same as above
RANDOM
Toggle Random mode
RANDOM ON
Set Random mode ON
RANDOM=1
Same as above
RANDOM OFF
Set Random mode OFF
RANDOM=0
Same as above
RANDOM STATUS
Query RANDOM status (ON, OFF)
GETSHUFFLE
Same as above

PlayList Control
PLADD
Add file(s) to end of playlist (like drag-n-drop)
LOAD
Same as above
PLCLEAR
Clear Playlist
CLEAR
Same as above
PL
Show/Hide Winamp Playlist window
PLWIN
Same as above
PLPOS
Query Playlist position (requires Winamp 2.05+)
PLFIRST
Play first item of playlist
PLLAST
Play last item of playlist
PLSET
Set current playlist item
(note this does not interfere with curring playing, if needed, use /PLAY after to go to this item)
PLSET RANDOM
Set current playlist item to a random item within playlist
SETPLPOS
Same as PLSET
LOADNEW
Same as /PLCLEAR /PLADD
LOADPLAY
Shortcut for /PLCLEAR /PLADD /PLAY
PLSAVE
Saves current playlist to (as a M3U file)

Winamp Volume Control
VOLUP [X]
Volume up
VOLDN [X]
Volume down
VOLSET
Volume set (scale 0-255)
VOL=
Volume set (scale 0-100)
VOLMAX
Volume max
VOLMIN
Volume min (no sound)

Windows Volume Control
Syntax: CLAMP /WAV
This set of commands will *not* start Winamp if not already running (no need to do so)
WAV MUTE ON
Mutes speaker
WAV MUTE OFF
Unmutes speaker
WAV VOLGET
Prints current Windows volume as two figures (left speaker, right speaker)
WAV VOLSET
Sets volume (for both speakers) on a 0-65535 scale
WAV VOLSET MIN
Sets volume to zero (for both speakers)
WAV VOLSET MAX
Sets volume to maximum (for both speakers)

Examples
CLAMP /WAV MUTE ON
CLAMP /WAV MUTE OFF
CLAMP /WAV VOLGET
CLAMP /WAV VOLSET 32768
Infos
POS
Query current position in file and track length
PATHNAME
Display pathname of current track
POSITION
Query current position in file only
STATE
Query current state (PLAYING;PAUSED;STOPPED;NOT RUNNING)
STATUS
Synonym for STATE
TITLE
Query current track title (Note that, as string is returned by Winamp, it uses a Windows charset - special characters might be corrupted in a DOS window)
VER
Query Winamp version
TRACKINFO
Info on current track
POS = current position (MM:SS)
LENGTH = track length (MM:SS)
BITRATE = bitrate in KBPS
SAMPLERATE = Sample rate in KHz
CHANNELS
If no track current being played, result is zero (0 or 00:00)
PLINFO
Info on playlist
POS = current position
LENGTH = playlist length
Note that even if play list is empty (Length = 0), pos is still 1.

Track rating
RATING
Display current track's rating (1 to 5, 0 = No rating)
RATING=X
Set rating for current track

Winamp Interactive Windows
ABOUT
Display Winamp About window
PREFS
Display Winamp Preferences window
OPEN
Display Winamp Open File window
MEDIALIBRARY
Opens MediaLibrary
VIDEOFULLSCREEN
Toggles video window full screen mode - Works only if video window is open - This option has issues

Equalizer Control
EQWIN
Toggle Eq window (Works with Classic skins only)
EQINFO
Query Eq parameters (10 bands, Preamp, Status, Autoload)
EQSET Set Eq parameters (Same format as EQINFO)
EQSTATUS
Toggle Eq status (ON / OFF)
EQSTATUS ON
Set Eq status ON
EQSTATUS OFF
Set Eq status OFF

Winamp Display
ONTOP
Toggle Always On Top option
MAINWIN
Toggle Main Window (Show / Hide)
MINIMIZE
Minimize Winamp

Visualization plug-in
VISUEXEC
Toggles visualization plug-in
VISUEXEC ON|OFF
Sets visualization plug-in on or off
VISUEXEC STATUS
ON if running, OFF if not running

Bookmarks management
BOOKMARK
Add to bookmarks
BOOKMARK CURRENT
Add current track to bookmarks

Skin management
SKINGET
Display name of current skin
OPGET
Display name of output plug-in
OUTPUTPLUGIN
Same as OPGET

Winamp install
INSTALLDIR
Display Winamp install directory, as detected by CLAmp
INSTALLDIR=...
Force using this as install directory, overwriting result of default detection. Must be first option.
INIFILE
Display Winamp ini file
INIDIR
Display Winamp.ini directory

Winamp process
CLASS
Force using this class name
Parameters are handled left to right, so the following provide different results :
CLAMP /CLASS MyClass /START /PLAY
CLAMP /START /CLASS MyClass /PLAY
First line means "Start Winamp with class MyClass (same as Winamp /class=MyClass) and play it"
Second line means "Start standard instance of winamp then search for MyClass instance and play this one"
Note: if all this means nothing to you, don't worry, you probably just don't need it !
PID
Show Winamp process ID

Misc.
CDPLAY
Play CD
JUMPTOFILE
Open the "Jump to file" dialog window

Bu bilgilerden sonra elektronik projelerinizin, winamp ile etkileşimli olmasını sağlamak rahat olacaktır.

Mehmet Demir
mdemir85@gmail.com
Dicle Ü. Elk.-Elktr. Müh.
4. Sınıf, Diyarbakır, 2009

Kaynaklar:
1- http://membres.lycos.fr/clamp/ — buraya artık ulaşılamıyor.
2- http://www.winamp.com/plugin/clamp/144432 — CLAmp’ı eklenti haline getirmişler.
2- http://en.allexperts.com/q/Java-1046/

Firefox’un Babylon Eklentisi ve Geliştirilmesi

Babylon sözlüğü duymayan neredeyse kalmamıştır. Firefox için yapılmış ücretsiz bir eklentileri burada mevcut. Gayet güzel çalışıyor. Sözlükte aramak için kelimeye iki defa tıklamanız yeterli oluyor.

extension

Fakat eksik yanı şu;

Sözlükte arattığımız kelimeleri bir yerde saklamıyor, 10 gün önce baktığınız bir kelimeyle karşılaştığınızda ya onu hatırlayacaksınız yada tekrar aratacaksınız.

Bu eksikliği giderme adına eklentiye eklemeler yaptım. Eklentinin değişmiş halini kullandığınızda Desktop dizininizde bulunan mywords.html dosyası içerisinde daha önce sözlükten baktığınız  kelimeleri aşağıdaki gibi bulacaksınız :-).

testciktisieklenti

değişikliği yaptığım eklentiyi ve mywords.html(sağ tıklayıp farklı kaydedin) dosyasını indirin, eklentiyi firefox’a kurun, mywords.html dosyasını da Desktop dizininize atın.

eklentide yaptığım değişiklikler aşağıdaki gibidir.

BabylonWordSearch.Results.js dosyasında;
saveDataToFile adında bir fonksiyon ekledim.

saveDataToFile: function(filepath, data, charset)
{
var lokasyon = data.search("OT_CopyrightStyle") - 14;
var lokasyon2 = data.search("Download this dictionary") + 37;
//alert(lokasyon);
data = data.substr(lokasyon2,lokasyon-lokasyon2);
data = data +"
";
file = Components.classes["@mozilla.org/file/local;1"].
createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(filepath);
// file is nsIFile, data is a string
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].
createInstance(Components.interfaces.nsIFileOutputStream);
// use 0x02 | 0x10 to open file for appending.
foStream.init(file, 0x02 | 0x10, 0666, 0);
// write, create, truncate
// In a c file operation, we have no need to set file mode with or operation,
// directly using "r" or "w" usually.
// if you are sure there will never ever be any non-ascii text in data you can
// also call foStream.write(data, data.length) directly
var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].
createInstance(Components.interfaces.nsIConverterOutputStream);
converter.init(foStream, "UTF-8", 0, 0);
converter.writeString(data);
converter.close(); // this closes foStream
}

aşağıdaki if bloğunda da, innerHTML ile babylon sunucusundan gelen cevabı alarak, yukarıdaki fonksiyona gönderdim.

if (containerDiv) {
var data = this.resultsFrame.contentWindow.document.getElementById('container').innerHTML;
this.saveDataToFile("~/Desktop/mywords.html",data,"UTF-8");

eklentiyi kendinize göre modifiye etmek için, kaynak kodlarına ulaşmayı buradaki yazıda bulabilirsiniz.