winamp - beat detection

0

Da się/jak pobrać ze swojego programu 'beat detection' z WINAMPA? Dokładnie chodzi mi o pobranie w czasie rzeczywistym głośności/natężenia (nie wiem jak to nazwać, ale chyba wiecie o co mi chodzi ;) ) najniższych tonów odgrywanej muzyki. Np. może da się to pobrać z jakiś dll'ów (np. vis_avs.dll, vis_nsfs.dll)?
http://www.chip.pl/arts/n/printversion/printversion_119024.html - tutaj jest troszkę o tym napisane.

0

TJ. chcesz muze miec w winampie a samemu pobierac wartosci dzwieku ??

mozna pisac swoje pluginy do winampa i tam (jest SDK) pokazuja jak to zrobic,
kiedys nawet przepisalem do delphi taki przykladzik (dwa okna jedno z dzwiekiem taki jak jest a druge to jego transformata fouriera no i byl jeszcze UVMeter - cos jak w linku co podales tylko w kompie !)

jak co to moge ten kod w delphi podeslac

0

Żródła nie musisz mi przesłać, bo mam ich już trochę. Obecny problem polega na tym, że wiem jak pobrać to co chce, ale jedynie jako plik dll, czyli winamp sam go wywołuje i uruchamia odpowiednie funkcje i sam wysyła parametry. A mi o to chodzi żeby zdobyć parametr mając jedynie hwnd winamp'a.
A tak w ogóle czy z odzielnego programu, będę mógł pobrać to co z pliku dll wywoływanego przez winamp'a?
Tutaj jest źródło pluginu http://www.devhood.com/tools/tool_details.aspx?tool_id=352

0

A tak w ogóle czy z odzielnego programu, będę mógł pobrać to co z pliku dll wywoływanego przez winamp'a?

Chodzi ci o to, czy będziesz mógł pobrać dane z DLL, które ta DLL`ka dostanie od WinAmp?
Jeżeli to twoja dll to dopisz tam funkcję exportową zwracającą (lub przekazującą przez wskaźnik) to, czego potrzebujesz...

0

Metod na pobranie jest duzo
-sharemem
-funkcj zwrotna (to co napisane)
-dde
-komunikaty win
-przez plik(che che)
-jako interfejs

ale mozna tez zrobic tak (jesli chcesz jako wygaszacz)

w tym co masz kaza

Installation: Place the compiled file "GeoMAS.dll" in "Program Files/Winamp/plugins/"
wydaje sie ze bez tego nie pojdzie !

wiec pakujesz tam dll'a a jak sie wlacza wygaszacz to pozwalasz mu wyswietlac obrazek (i przechwytywac dane z winampa (w przeciwnym przypadku plugin "pracuje na jalowym biegu" i okno (to w dll) jest ukryte)

0

Mam pytanie w związku z wysyłaniem danych między uruchomionym programem, a plikiem dll. A konkretnie chodzi mi czy da się uzyskać uchwyt pliku dll (uruchomionego przez winampa), znając jego nazwę instancji, a następnie wysłać mu (plikowi dll) jakiś komunikat?

0

chodzi mi czy da się uzyskać uchwyt pliku dll (uruchomionego przez winampa), znając jego nazwę instancji, a następnie wysłać mu (plikowi dll) jakiś komunikat
Błędnie rozumujesz komunikacje między jakąkolwiek aplikacją a dll. Ona nie odbywa się za pomocą komunikatów, a poprzez wywoływanie procedur. Kod dll'a to jakby (w pewnym uproszczeniu) przedluzenie zwyklego kodu aplikacji, tyle ze w innym pliku, nie ma zadnych komunikatow. A jesli chodzi o:

Dokładnie chodzi mi o pobranie w czasie rzeczywistym głośności/natężenia (nie wiem jak to nazwać, ale chyba wiecie o co mi chodzi ;) ) najniższych tonów odgrywanej muzyki

hm, moze i tak ale wg mnie winamp musialby (zakladam ze nie masz zamiaru zmieniac wew. kodu winampa) korzystac z twojego Out-pluginu. Wygladalo by to mniej wiecej tak:

winamp -> twoj dll -> oryginalny out-plugin

Musialbys zrobic to tak zeby oryginalny out-plugin mial "wrazenie" ze pracuje z zwyklym winampem, czyli musialbys zasymulowac dzialanie winampa podczas jego ladowania (wypalnianie pól HWND hMainWindow, HINSTANCE hDllInstance i ewentualnie inne w oryg pluginie). Twoj dll musialby z budowy oczywiscie byc zwyklym out-pluginem, miec importowana winampGetOutModule, posiadac wszystkie funkcje: about, init, quit, open... itd. jednak jego dzialanie polegalo by na wywolywaniu funkcji z oryginalnego out-plugina i przechwytywaniu przesylanych danych, tych ktorych potrzebujesz, lub ew. ich modyfikacji. Czyli przykladowo calosc mogla by wygladac tak (uwzgledniajac twoj zewnetrzny program)

  1. input-plugin wywoluje out.Write(bufor,dlugosc)
  2. trfia do twojego dll, ty te dane z "bufor" gdzies zapisujesz
  3. przeszylasz je do swojego programu
  4. wyslasz je do oryginalnego out-pluginu oryg-out-plug.Write(bufor,dlugosc) ktory je odgrywa na glosnikach

Oczywiscie musisz zabac o odpowienia synchronizacje miedzy twoim dll'em a programem, mozesz to zrobic przy uzyciu mutexow i pamieci dzielonej. Pozdro</ort>

0

Dzieki za rade, podales mi sposob az za dobry :)
Bo do pluginu wizualizacji (mojego pliku dll) wysylana jest struktura z danymi ktorych potrzebuje. A mi chodzi o to ze uzytkownik sam ma sobie ten plugin wlaczyc, czyli problem polega tylko na tym jak przeslac te dane z dll'a do mojego programu. Nie wiem czy cie dobrze zrozumialem, ale jesli uzytkownik wlaczylby sam mojego plugina to punkty:

  1. input-plugin wywoluje out.Write(bufor,dlugosc)
  2. wyslasz je do oryginalnego out-pluginu oryg-out-plug.Write(bufor,dlugosc) ktory je odgrywa na glosnikach

bylyby z glowy, czyli pozostaje tylko synchronizacja miedzy dll'em a programem, a z tego co napisales, to mozna to zrobic przy uzyciu mutexow i pamieci dzielonej. Napiszcie mi jesli sie myle.

0

punkt 1) bezposrednio ciebie nie dotyczy, chcialem wskazac tylko funkcje ktora musisz u siebie obsluzyc. A jesli uzytkowni wybiera twoj plugin to rzeczywiscie punkt 4) odpada, myslalem ze dzwiek takze ma byc odgrywany. Jesli chodzi o sama synchronizacje to mutexu moglbys uzyc jako flage czy dane sa w buforze, czyli:

w dll:

  • w funkcji inicjujacej tworzysz mutex i blok pamieci dzielonej 8192+4 powinno wystarczyc (w winamp sdk pisza ze bufor dla Write() nie moze byc wiekszy niz 8192 jesli dobrze pamietam, 4 bajty to pole na rozmiar danych)
  • w funkcji Write(), jesli mutex nie jest zasygnalizowany, kopiujesz dane do pamieci dzielonej i sygnalizujesz mutex

w prog:

  • czekasz na zasygnalizowanie mutexu, pozniej obrabiasz dane z pamieci dzielonej i zmieniasz stan mutexu.

Pamietaj tez o obsludze CanWrite() - tu tez moglbys uzyc sprawdzania stanu mutexu.
A w programie po jego obecnosci latwo poznasz czy dll jest zaladowany.

0

Z pamiecia dzielona juz sobie poradzilem. Teraz tylko pozostaje problem mutexow. Szukalem o tym w sieci, ale nic co by mi pomoglo nie moglem <ort>znaleŹĆ.</ort> Wiem tylko jak je utworzyc i nic wiecej. Wiec moje pytania sa takie:

  • jak sprawdzic flage mutexu,
  • jak zmienic stan flagi,
0

Nie powiedziałeś w jakim języku to piszesz, jeśli używasz WinApi to interesują cie funkcje: CreateMutex(), OpenMutex(), WaitForSingleObject(), ReleaseMutex(), CloseHandle().

To co napisalem wczesniej o uzywaniu mutexu jako flagi chyba nie bardzo da sie zrobic, s<ort>proboj</ort> tak:

Dll:
w funckji inicjujacej:

 mutex = CreateMutex(0,TRUE,"nazwa");  // wlascicielem mutexu jest watek biezacy 

we Write():

  WaitForSingleObject(mutex,-1);
// zapisywanie do pamieci dzielonej
ReleaseMutex(mutex);

w funkcji sprzatajacej:

 CloseHandle(mutex); 

Program:

  • najpierw:
 mutex = OpenMutex(MUTEX_ALL_ACCESS,0,"nazwa"); 
  • pozniej:
 WaitForSingleObject(mutex,-1);
// odczyt z pamieci dzielonej
ReleaseMutex(mutex);
  • na koncu:
 CloseHandle(mutex); 

Pisalem na suchara ale powinno dzialac.

1 użytkowników online, w tym zalogowanych: 0, gości: 1