Ausgabeplugin schreiben

Fragen zur Verwendung des PC_DIMMER
nefarius2001
Lüsterklemmenschrauber
Beiträge: 35
Registriert: 20.01.2009, 09:28

Ausgabeplugin schreiben

Beitrag von nefarius2001 » 15.04.2009, 14:53

Hi Christian,

Ich weis nicht ob ichs nur nicht gefunden hab oder obs nirgends steht:
Wie schreibe ich ein Ausgabeplugin für den PC-Dimmer?
Für DMXC hab ichs schon geschreibselt, welche Änderungen sind da nötig? Oder ist das nicht vergleichbar?

Vielen Dank,
Nefarius

Benutzeravatar
admin
PC_DIMMER-Entwickler
Beiträge: 1810
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Ausgabeplugin schreiben

Beitrag von admin » 16.04.2009, 08:59

Hi Nefarius,


auf der Downloadseite (siehe oben die Menübuttons) gibt es einen Punkt "Entwicklungskits (SDK) für den PC_DIMMER2008". Dort kannst du dir einige Quellcodes herunterladen. Die habe ich neulich erst aktualisiert, sodass du damit eigene Plugins schreiben können solltest.

Eventuell werde ich nochmal eine kurze Anleitung unter dem Punkt "Software" schreiben. Schreib mir mal, inwieweit du mit den aktuellen Unterlagen (also den Sourcecodes) klarkommst.
Zum Testen deines Plugins kannst du den Plugintester verwenden (ebenfalls unter dem genannten Link). Dann brauchst du nicht immer den PC_DIMMER starten, um deine Funktionen zu testen.


ciao,
Christian

nefarius2001
Lüsterklemmenschrauber
Beiträge: 35
Registriert: 20.01.2009, 09:28

Re: Ausgabeplugin schreiben

Beitrag von nefarius2001 » 28.04.2009, 14:42

Unter "Download" - natürlich. Ich hatte sie schon einmal gefunden, aber da hatte ich wohl n Brett vorm Kopf.

Jetzt hab ich mich daran probiert ein paar Fragen:
- Ich kann meine in VB geschriebene DLL (Klassenbibliothek, DMXC-Plugin) nur über den Umweg einer Delphi-DLL aufrufen. und dann habe ich das problem dass das aufrufen nichtmodaler Formulare nicht klappt(Fehler). Gibts für PC_Dimmer eine direktere Methode ein Klassen-Plugin einzubinden? (Fragen kostet ja nix)
- Ich vermisse die DMXC-Funktion die von Winamp gespielten Lieder im Audioeffektplayer wiederzugeben. Wäre es möglich das einzubauen? Der Zugriff auf Winamp ist sehr komfortabel, sollte das eingebaut werden versuche ich auch gerne mitzuhelfen, soweit ich das als Nichr-Delphiler kann.
- Alternativ dazu wäre eine Benachrichtigung wenn der Audioeffektplayer startet/pausiert/stoppt. Leider erhalte ich im Moment über DLLSendMessage ausschließlich Kanalwertänderungen. Kein speichern, Kein Audioeffektplayer-Recording, nichts. Weist du zufällig woran das liegen könnte?

Freundliche Grüße und Danke für das sonst tolle Programm,
Nefarius

Benutzeravatar
admin
PC_DIMMER-Entwickler
Beiträge: 1810
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Ausgabeplugin schreiben

Beitrag von admin » 28.04.2009, 20:07

Hallo Nefarius,


man kann in Delphi natürlich auch normale COM+ - Klassenbibliotheken aufrufen. Wie das geht kann ich dir leider im Detail auch nicht erklären, da ich bereits Probleme hatte, eine COM+DLL für DMXC mit Delphi zu schreiben.


Es wäre sicher möglich, so eine Funktion für WinAMP wie bei DMXC zu schreiben. Allerdings fehlt mir aktuell die Zeit dazu, mich in die WinAMP-API und die nötigen Plugins einzulesen. Außerdem wird in etwas näherer Zukunft eine neue DMXControl-Version herauskommen, die viele PC_DIMMER-Funktionen enthalten wird :)

Eine Benachrichtigung für Audioplayer-Events kann ich natürlich relativ leicht nachrüsten. Mal schauen, was ich so am Wochenende vor habe :)



bis dann,
Christian

nefarius2001
Lüsterklemmenschrauber
Beiträge: 35
Registriert: 20.01.2009, 09:28

Re: Ausgabeplugin schreiben

Beitrag von nefarius2001 » 29.04.2009, 14:26

Das Audioplayer-Event wär echt klasse.
Hm, perfekt wäre noch eine Möglichkeit den Timecode des Audioplayers abrufen zu können, aber mir fällt keine einfache Möglichkeit ein... und ich kann ja einfach ne eigene Uhr starten wenn die Start-Meldung eintrifft.

Benutzeravatar
admin
PC_DIMMER-Entwickler
Beiträge: 1810
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Ausgabeplugin schreiben

Beitrag von admin » 02.05.2009, 12:40

So, ich habe eine neue Version des PC_DIMMERs hochgeladen. Zum Einen wird nun auch der Timecode von Audiodateien beim MediaCenter übertragen. Zum Anderen kann man nun Play/Pause/Stop-Events und den aktuellen Timecode des Audioeffektplayers in den DLLs abfangen. Hierzu einfach in der "DLLSendMessage(MSG:Byte; Data1, Data2:Variant)" Funktion auf folgende neue Events reagieren:

Code: Alles auswählen

  MSG_AUDIOEFFECTPLAYERTIMECODE=19; // Cardinal (in ms)
  MSG_AUDIOEFFECTPLAYEREVENT=20; // Byte  (0=Play, 1=Pause, 2=Stop)
Hier nochmal die aktuelle Liste der einzelnen Events:

Code: Alles auswählen

  // PC_DIMMER Messagesystem: MSG, Data1, Data2
  MSG_RECORDSCENE=0; // Booleanarray
  MSG_AUDIOEFFECTPLAYERRECORD=1; // Boolean
  MSG_SYSTEMVOLUME=2; // Byte
  MSG_SYSTEMMUTE=3; // Boolean
  MSG_JUMPTOCHANNEL=4; // Integer
  MSG_GRANDMASTER=5; // Byte
  MSG_FLASHMASTER=6; // Byte
  MSG_ADDLOGFILEENTRY=7; // String
  MSG_EFFECTSPLAY=8; // Boolean
  MSG_SYSTEMSPEED=9; // Integer und Float (BPM)
  MSG_NEW=10; // String (Projektverzeichnis)
  MSG_OPEN=11; // String (Projektverzeichnis)
  MSG_SAVE=12; // String (Projektverzeichnis)
  MSG_BEATIMPULSE=13; // Boolean
  MSG_ACTUALCHANNELVALUE=14; // Integer, Integer
  MSG_MIDIIN=15; // array[0..2] of byte
  MSG_STARTSCENE=16; // TGUID
  MSG_STOPSCENE=17; // TGUID
  MSG_SPEEDMASTER=18; // Byte
  MSG_AUDIOEFFECTPLAYERTIMECODE=19; // Cardinal (in ms)
  MSG_AUDIOEFFECTPLAYEREVENT=20; // Byte  (0=Play, 1=Pause, 2=Stop)

Die neue Version des PC_DIMMERs (v4.5.5 Build 3377) sollte bald downloadbar sein.


bis dann,
Christian

nefarius2001
Lüsterklemmenschrauber
Beiträge: 35
Registriert: 20.01.2009, 09:28

Re: Ausgabeplugin schreiben

Beitrag von nefarius2001 » 04.05.2009, 00:31

Hey, echt cool, danke!
Leider kann ich mich noch nicht daran erfreuen...
Ich grübel jetzt schon 2 Tage darüber, warum DLLSendMessage zwar vom Plugintester 1a angesprochen wird, von der PC_DIMMER.exe dann jedoch nicht :(
DLLAbout,DLLConfigure,DLLGetName,DLLDeactivate,DLLActivate werden doch auch korrekt aufgerufen.
Ich verstehs einfach nicht!

Hier mal der ganze Code der cpp:

Code: Alles auswählen

#include "windows.h"
//#include "stdafx.h"
//#include "mmsystem.h"
//#include "math.h"
//#include <oaidl.h>
#include "winreg.h"
#include <string>

#include <fstream>
using namespace std;


// CallBacks Definitionen
typedef void (__stdcall cbSetDLLValues) (int address, int startvalue, int endvalue, int fadetime) ;
typedef void (__stdcall cbSetDLLValueEvent) (int address, int endvalue) ;
typedef void (__stdcall cbSetDLLNames) (int address, char *channelname) ;
typedef void (__stdcall cbGetDLLValue) (int address) ;
typedef void (__stdcall cbSendMessage) (char MSG, VARIANT Data1, VARIANT Data2) ;

// Globale Pointers to Functions
cbSetDLLValues * pSetDLLValues  = NULL ;
cbSetDLLValueEvent * pSetDLLValueEvent  = NULL ;
cbSetDLLNames * pSetDLLNames = NULL ;
cbGetDLLValue * pGetDLLValue = NULL ;
cbSendMessage * pSendMessage = NULL ;

#define MaxChan 512


int channelvalue[MaxChan];
bool IsSending;
bool IsWriting;
long PlayerMS;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}




void msgbox(char* s)
{
	MessageBox ( NULL, s, "PC_Dimmer_C++_DLL!", MB_OK);// | MB_ICONEXCLAMATION);
}

void msgbox(string s)
{
	MessageBox ( NULL, s.c_str(), "PC_Dimmer_C++_DLL!", MB_OK);// | MB_ICONEXCLAMATION);
}

ofstream outfile;

string GetFile(string StrIn)
{
	HKEY keyHandle;
    char rgValue [1024];
	char* const sRegKey = "Software\\VB and VBA Program Settings\\KDMX_Erstellplugin\\PC_Dimmer_cpp_DLL"; //HKEY_CURRENT_USER\Software\VB and VBA Program Settings\KDMX_Erstellplugin\PC_Dimmer_cpp_DLL
	char* const sRegEntry = "Outputdatei";
    DWORD size1;
    DWORD Type;

        if( RegOpenKeyEx(HKEY_CURRENT_USER,sRegKey,0,KEY_QUERY_VALUE, &keyHandle) == ERROR_SUCCESS)
             {
                size1=1023;
                RegQueryValueEx( keyHandle, sRegEntry, NULL, &Type,
                    (LPBYTE)rgValue,&size1);
             }     
        else 
		{
			strcpy(rgValue,"zzzPcDimmerOut.kdmxRaw");
			msgbox("Kein Registry-Eintrag für Ausgabedatei gefunden, also nehme ich als Ausgebe zzzPcDimmerOut.txt her, wo auch immer die landen wird.");
		}
    
        RegCloseKey(keyHandle);
		
		StrIn = "";
		StrIn.insert(0,rgValue);
		return StrIn;
}


void Meep()
{
	string s,a;
	char *cstr;
	
	a = GetFile(s);
	
	cstr = new char [s.size()+1];
	strcpy (cstr,a.c_str());

	msgbox("Meep");
	MessageBox ( NULL, a.c_str() , "PC_Dimmer_C++_DLL!", MB_OK);
	msgbox(cstr);

}

void Moop()
{
	msgbox ("Nix, Windoof!");
}

void __stdcall DLLActivate(cbSetDLLValues * CallbackSetDLLValues, cbSetDLLValueEvent * CallbackSetDLLValueEvent,
                           cbSetDLLNames * CallbackSetDLLNames, cbGetDLLValue * CallbackGetDLLValue,
						   cbSendMessage * CallbackSendMessage)
{
  // Funktionsaufruf bei Pluginaktivierung

  // Zuweisen der einzelnen Pointer für die Callbacks
	  pSetDLLValues		= CallbackSetDLLValues ;
	  pSetDLLValueEvent = CallbackSetDLLValueEvent ;
	  pSetDLLNames		= CallbackSetDLLNames ;
	  pGetDLLValue		= CallbackGetDLLValue ;
	  pSendMessage		= CallbackSendMessage ;

	  IsSending=false;

	  string s;
	s = GetFile(s);
	outfile.open(s.c_str(),fstream::out);
  return ;
}

void __stdcall DLLDeactivate()
{
  // Funktionsaufruf bei Plugindeaktivierung
	outfile.close();
  return ;
}

char * __stdcall DLLIdentify()
{
  // Funktionsaufruf bei Identifizierung ob Programmplugin oder Ausgabeplugin
  return ("Output") ; // Output oder Input
}

char * __stdcall DLLGetName()
{
  // Dieser Name wird in der Pluginliste angezeigt
  return ("PC_DIMMER Output-Plugindemo für C") ;
}

char * __stdcall DLLGetVersion()
{
  // Derzeit nur zu Anzeigezwecken verwendet
  return ("V0.1") ;
}

void __stdcall DLLConfigure()
{
  // Funktionsaufruf bei Klick auf "Konfigurieren"
  msgbox("This is DLLConfigure") ;
  return ;
}

void __stdcall DLLAbout()
{
  // Funktionsaufruf bei Klick auf "Info"
  msgbox("This is DLLAbout");
  return ;
}

// fadetime in milliseconds !
void __stdcall DLLSendData(int address, int startvalue, int endvalue, int fadetime, char *name)
{
// Diese Funktion wird bei jeder manuellen Kanaländerung, bzw. bei jedem Start eines automatischen Dimmvorganges ausgeführt
// Hat man eine Hardware, die keine Fadezeiten unterstützt und den internen PC_DIMMER2008-Dimmerkernel benötigt, nutzt man
// besser die Funktion DLLSendMessage weiter unten, um immer die aktuellen Kanalwerte zu erhalten
  return ;
}

bool __stdcall DLLIsSending()
{
  // Funktionsaufruf um bei Interfaces mit DMX-In keine Feedbackschleife zu erzeugen. Sendet das Plugin einen Wert an
  // den PC_DIMMER, muss entsprechend die Variable "IsSending" gesetzt werden.
  return IsSending;
}

void __stdcall DLLSendMessage(char MSG, VARIANT Data1, VARIANT Data2)
{
/*
PC_DIMMER Messagesystem: MSG, Data1, Data2
  MSG_RECORDSCENE=0; // Booleanarray
  MSG_AUDIOEFFECTPLAYERRECORD=1; // Boolean
  MSG_SYSTEMVOLUME=2; // Byte
  MSG_SYSTEMMUTE=3; // Boolean
  MSG_JUMPTOCHANNEL=4; // Integer
  MSG_GRANDMASTER=5; // Byte
  MSG_FLASHMASTER=6; // Byte
  MSG_ADDLOGFILEENTRY=7; // String
  MSG_EFFECTSPLAY=8; // Boolean
  MSG_SYSTEMSPEED=9; // Integer und Float (BPM)
  MSG_NEW=10; // String (Projektverzeichnis)
  MSG_OPEN=11; // String (Projektverzeichnis)
  MSG_SAVE=12; // String (Projektverzeichnis)
  MSG_BEATIMPULSE=13; // Boolean
  MSG_ACTUALCHANNELVALUE=14; // Integer, Integer
  MSG_MIDIIN=15; // array[0..2] of byte
  MSG_STARTSCENE=16; // TGUID
  MSG_STOPSCENE=17; // TGUID
  MSG_SPEEDMASTER=18; // Byte
  MSG_AUDIOEFFECTPLAYERTIMECODE=19; // Cardinal (in ms)
  MSG_AUDIOEFFECTPLAYEREVENT=20; // Byte  (0=Play, 1=Pause, 2=Stop)
*/

	MessageBox ( NULL, "DLLSendMessage" , "PC_Dimmer_C++_DLL!", MB_OK);

	/*
	switch(MSG)
	{ 
	case 14:
		outfile << IsWriting;
		outfile << "|";
		outfile << PlayerMS;
		outfile << "|";
		outfile << Data1.iVal;
		outfile << "|";
		outfile << Data2.intVal;
		outfile << endl;
        break;
	case 19:
		PlayerMS = Data1.lVal;
		break;
	case 20:
		if (Data1.iVal==0)
		  {
			IsWriting = TRUE;
		  }
		else 
		  {
			IsWriting = FALSE;
		  }

		break;
	}
	*/
}

def:

Code: Alles auswählen

LIBRARY PC_Dimmer_DLL_Cpp

EXPORTS
  Meep @1  
  DLLActivate         @2
  DLLDeactivate       @3
  DLLIdentify         @4
  DLLGetVersion       @5
  DLLGetName          @6
  DLLConfigure        @7
  DLLAbout            @8
  DLLSendData         @9
  DLLIsSending        @10
  DLLSendMessage      @11
  Moop @12  

Benutzeravatar
admin
PC_DIMMER-Entwickler
Beiträge: 1810
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Ausgabeplugin schreiben

Beitrag von admin » 04.05.2009, 07:03

Guten Morgen,


nun, deine Deklaration sieht eigentlich gut aus. Von daher müsste es eigentlich funktionieren. Der PC_DIMMER macht auch nichts anderes, als das, was der Plugintester macht. Eventuell verwendest du nicht die neueste Version, wobei ich an dieser Funktion länger nichts geändert habe.

Ich schau mir das bei Gelegenheit mal an!

bis dann,
Christian

nefarius2001
Lüsterklemmenschrauber
Beiträge: 35
Registriert: 20.01.2009, 09:28

Re: Ausgabeplugin schreiben

Beitrag von nefarius2001 » 04.05.2009, 12:51

Ich benutze die allerneueste Version. Daran liegt es nicht, leider.

hm, mir fällt grad auf, dass DLLSendData im Plugintester einen Zugriff auf 00000000 ergibt.
Komisch, ich tu doch gar nichts darin. Was ist eigentlich der char* bei DLLSendData ?

nefarius2001
Lüsterklemmenschrauber
Beiträge: 35
Registriert: 20.01.2009, 09:28

Re: Ausgabeplugin schreiben

Beitrag von nefarius2001 » 17.05.2009, 21:56

Es gibt Neuigkeiten: das war der selbe "Kanal 0 bis 0" Fehler, den ich schon einmal erleben durfte(Hier).
Ich vermute das hängt mit dem Löschen der Plugin-DLLs zusammen, auch wenn ich nicht verstehe wie. Egal.

Bin ich froh das sich das geklärt hat !
Danke für das Programm samt genialem Audioplayer!

---------------------------------------------------------------------------------------
Tja, das hat mich jetzt erstmal gefangen genommen.
Wenn ich das Richtig sehe empfangen "Output"-Plugins nur 14er-Nachrichten und "Input"-Plugins alle.
Die 20er-Nachricht ist 1a implementiert.
Allerdings kommt die 19er-Nachricht nie an. Muss ich die irgendwie selbst anstupsen?
Gute Nacht erstmal. :D

Benutzeravatar
admin
PC_DIMMER-Entwickler
Beiträge: 1810
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Ausgabeplugin schreiben

Beitrag von admin » 18.05.2009, 07:38

Guten Morgen Nefarius,


tut mir leid, dass es schon wieder an diesem Bug gelegen hat. Ich konnte bislang allerdings noch nichts an der Software ändern. Werde das am kommenden freien Tag mal in Angriff nehmen. Aber schön, dass es jetzt endlich läuft :)


Bei den Nachrichten ist es tatsächlich so, dass die Output-Plugins derzeit noch nicht an das gesamte Nachrichtensystem angeschlossen waren. Ist mir bislang nie aufgefallen. Werde das am Donnerstag korrigieren und dann Ende der Woche ne neue Version hochladen. Kannst also schonmal alles vorbereiten, was du da verwenden willst. Warum Nachricht 19 nicht ankommt prüfe ich dann auch nochmal nach.


bis dann,
Christian :)

nefarius2001
Lüsterklemmenschrauber
Beiträge: 35
Registriert: 20.01.2009, 09:28

Re: Ausgabeplugin schreiben

Beitrag von nefarius2001 » 27.05.2009, 09:23

Hi,

ich wollt mal vorsichtig nach dem Stend der Dinge fragen.

Grüße,
Nefarius

Benutzeravatar
admin
PC_DIMMER-Entwickler
Beiträge: 1810
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Ausgabeplugin schreiben

Beitrag von admin » 27.05.2009, 15:35

Hi Nefarius,


ich habe am Wochenende auf einer Busfahrt ein wenig am Programm geschrieben. Die Ausgabeplugins können nun auch das gesamte Nachrichtensystem empfangen.

Bezüglich des Timecodes: du musst den Timecode im Audioeffektplayer für das Senden aktivieren (Hauptmenü Audioeffektplayer->Einstellungen->Timecode senden...) dann geht das auch *g*


bis dann,
Christian

nefarius2001
Lüsterklemmenschrauber
Beiträge: 35
Registriert: 20.01.2009, 09:28

Re: Ausgabeplugin schreiben

Beitrag von nefarius2001 » 27.05.2009, 20:27

Cool !

ist das schon in der jetzt downloadbaren Version umgesetzt? Auf der Webseite steht immernoch

Code: Alles auswählen

Hauptprogramm  Version 4.5.5 Build 3377 vom 02.05.2009 (Changelog)


und die Timecode.Geschichte macht Sinn :)

Benutzeravatar
admin
PC_DIMMER-Entwickler
Beiträge: 1810
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Ausgabeplugin schreiben

Beitrag von admin » 28.05.2009, 08:36

Guten Morgen,

nein, die aktuelle Exe ist noch nicht auf der Website. Da meine Freizeit begrenzt ist, schaffe ich das leider auch nicht vor dem Wochenende, ein neues Setup zu machen. Also poste ich einfach hier die aktuelle Exe v4.5.5 Build 3382. Einfach über die alte Exe drüberkopieren.

Link zum Download von PC_DIMMER v4.5.5 Build 3382:
http://rapidshare.com/files/238067528/P ... R.zip.html

bsi dann,
Christian :)

Antworten