Hi Ingo,
hier ist der gesamte Code für die Callback-Funktion:
Code: Alles auswählen
procedure CallbackMessage(MSG:Byte; Data1, Data2:Variant);stdcall;
var
i,j:integer;
// mididata:Variant;
SzenenData:PTreeData;
begin
with mainform do
begin
if not startingup then
case MSG of
MSG_RECORDSCENE: // Szene
begin
for i:=1 to lastchan do
begin
if (Data1[i]>-1) then
recordchannelvalue[i]:=maxres-Data1[i]
else
recordchannelvalue[i]:=-1;
end;
audioeffektplayerform.RecordAudioeffekt(Data2);
end;
MSG_AUDIOEFFECTPLAYERRECORD: // Boolean
begin
end;
MSG_SYSTEMVOLUME: // Integer
begin
//Bass_SetVolume(round((Data1/maxres)*100));
masterform.volumeslider.position:=100-round((Data1/maxres)*100);
end;
MSG_SYSTEMMUTE: // Boolean
begin
if Data1 then
Bass_SetVolume(0)
else
Bass_SetVolume(100-masterform.volumeslider.position);
end;
MSG_GRANDMASTER: // Integer
begin
masterform.dimmermaster.Position:=round(((maxres-Data1)/maxres)*100);
end;
MSG_FLASHMASTER: // Integer
begin
masterform.flashmaster.position:=(maxres-Data1);
end;
MSG_SPEEDMASTER:
begin
masterform.speedmaster.position:=(512-Data1);
end;
MSG_ADDLOGFILEENTRY: // String
begin
debuglistbox.ItemIndex:=debuglistbox.Items.Add('['+inttostr(debuglistbox.Items.Count)+'] ['+Timetostr(now)+'] ['+Datetostr(now)+'] PLUGIN: '+Data1);
debuglistbox.Items.SaveToFile(workingdirectory+'\PC_DIMMER.log');
end;
MSG_SYSTEMSPEED: // Word
begin
if (beatform.Temposourcebox.ItemIndex=2) then
begin
beatform.temposlider.Position:=Data1;
end;
end;
MSG_NEW: ToolButton1Click(nil);
MSG_OPEN: openproject(Data1, false);
MSG_SAVE: saveproject(false,false);
MSG_BEATIMPULSE: // Boolean
begin
if (beatform.Temposourcebox.ItemIndex=2) then
begin
if beatform.beat.color=clMaroon then
begin
beatform.beat.Color:=clBlack;
end else
begin
beatform.beat.Color:=clMaroon;
end;
ExecuteBeat(nil);
end;
end;
MSG_ACTUALCHANNELVALUE: senddata(Data1, maxres-Data2, maxres-Data2, 0);
MSG_STARTSCENE: StartScene(StringToGUID(string(data1)),false,false, -1);
MSG_STOPSCENE: StopScene(StringToGUID(string(data1)));
MSG_MIDIIN:
begin
// mididata:=VarArrayCreate([0,2], varInteger);
// mididata:=data1;
GetMidi(data1[0], data1[1], data1[2]);
end;
MSG_MIDIOUT:
begin
SendMidi(data1[0], data1[1], data1[2]);
end;
MSG_OPENLIBRARY:
begin
setlength(szenenverwaltung_formarray,length(szenenverwaltung_formarray)+1);
szenenverwaltung_formarray[length(szenenverwaltung_formarray)-1]:=Tszenenverwaltungform.Create(mainform);
szenenverwaltung_formarray[length(szenenverwaltung_formarray)-1].Positionselection:=StringToGUID(data1);
if (szenenverwaltung_formarray[length(szenenverwaltung_formarray)-1].showmodal=mrOK) then
begin
if szenenverwaltung_formarray[length(szenenverwaltung_formarray)-1].VST.SelectedCount>0 then
begin
SzenenData:=szenenverwaltung_formarray[length(szenenverwaltung_formarray)-1].VST.GetNodeData(szenenverwaltung_formarray[length(szenenverwaltung_formarray)-1].VST.FocusedNode);
SendMSG(MSG_LIBRARYVALUE, mainform.GetSceneInfo2(SzenenData^.ID,'name'), GUIDToString(SzenenData^.ID));
end;
end;
szenenverwaltung_formarray[length(szenenverwaltung_formarray)-1].Free;
setlength(szenenverwaltung_formarray,length(szenenverwaltung_formarray)-1);
end;
// PluginScenes
MSG_CREATEPLUGINSCENE:
begin
setlength(pluginszenen, length(pluginszenen)+1);
pluginszenen[length(pluginszenen)-1].ID:=StringToGUID(string(Data1));
pluginszenen[length(pluginszenen)-1].Name:=string(Data2);
pluginszenen[length(pluginszenen)-1].Category:='';
// Szenenverwaltung aktualisieren
if szenenverwaltung_formarray[0].Showing then
szenenverwaltung_formarray[0].FormShow(nil);
end;
MSG_REFRESHPLUGINSCENE:
begin
for i:=0 to length(pluginszenen)-1 do
begin
if IsEqualGUID(StringToGUID(string(Data1)), pluginszenen[i].ID) then
begin
pluginszenen[i].Name:=string(Data2);
// Szenenverwaltung aktualisieren
if szenenverwaltung_formarray[0].Showing then
szenenverwaltung_formarray[0].FormShow(nil);
break;
end;
end;
end;
MSG_REMOVEPLUGINSCENE:
begin
for i:=0 to length(pluginszenen)-1 do
begin
if IsEqualGUID(StringToGUID(string(Data1)), pluginszenen[i].ID) then
begin
for j:=i to length(pluginszenen)-2 do
begin
pluginszenen[j].ID:=pluginszenen[j+1].ID;
pluginszenen[j].Name:=pluginszenen[j+1].Name;
pluginszenen[j].Category:=pluginszenen[j+1].Category;
end;
setlength(pluginszenen, length(pluginszenen)-1);
// Szenenverwaltung aktualisieren
if szenenverwaltung_formarray[0].Showing then
szenenverwaltung_formarray[0].FormShow(nil);
break;
end;
end;
end;
MSG_STARTPLUGINSCENE:
begin
// nur von Plugins auswerten
end;
MSG_STOPPLUGINSCENE:
begin
// nur von Plugins auswerten
end;
MSG_EDITPLUGINSCENE:
begin
// nur von Plugins auswerten
end;
MSG_REGISTERPLUGINCOMMAND:
begin
setlength(Befehlssystem[13].Steuerung, length(Befehlssystem[13].Steuerung)+1);
Befehlssystem[13].Steuerung[length(Befehlssystem[13].Steuerung)-1].Bezeichnung:=string(Data2);
Befehlssystem[13].Steuerung[length(Befehlssystem[13].Steuerung)-1].GUID:=StringToGUID(string(Data1));
Befehlssystem[13].Steuerung[length(Befehlssystem[13].Steuerung)-1].InputValueOnly:=false;
Befehlssystem[13].Steuerung[length(Befehlssystem[13].Steuerung)-1].IntegerArgCount:=0;
Befehlssystem[13].Steuerung[length(Befehlssystem[13].Steuerung)-1].StringArgCount:=0;
Befehlssystem[13].Steuerung[length(Befehlssystem[13].Steuerung)-1].GUIDArgCount:=0;
end;
MSG_SETCOLOR: geraetesteuerung.set_color(StringToGUID(string(Data1)), data2[0], data2[1], data2[2], 0, 0); // Data1=ID, Data2=array[0..2] of byte (=R,G,B)
MSG_SETDIMMER: geraetesteuerung.set_dimmer(StringToGUID(string(Data1)), data2); // Data1=ID, Data2=byte
MSG_SETSTROBE: geraetesteuerung.set_strobe(StringToGUID(string(Data1)), data2); // Data1=ID, Data2=byte
MSG_SETSHUTTER: geraetesteuerung.set_shutter(StringToGUID(string(Data1)), data2); // Data1=ID, Data2=byte (0=off, 255=on)
MSG_SETGOBOROT1: geraetesteuerung.set_gobo1rot(StringToGUID(string(Data1)), data2); // Data1=ID, Data2=byte (0=off, 255=on)
MSG_SETGOBOROT2: geraetesteuerung.set_gobo2rot(StringToGUID(string(Data1)), data2); // Data1=ID, Data2=byte (0=off, 255=on)
MSG_SETPRISMA: geraetesteuerung.set_prisma(StringToGUID(string(Data1)), data2); // Data1=ID, Data2=byte (0=off, 255=on)
MSG_SETPRISMAROT: geraetesteuerung.set_prismarot(StringToGUID(string(Data1)), data2); // Data1=ID, Data2=byte (0=off, 255=on)
MSG_SETIRIS: geraetesteuerung.set_iris(StringToGUID(string(Data1)), data2); // Data1=ID, Data2=byte (0=off, 255=on)
MSG_STARTCOMMAND:
begin
TerminalSystem.BefehlsTyp:=StringToGUID(data1[0]);
TerminalSystem.IntegerArg1:=strtoint(data1[1]);
TerminalSystem.IntegerArg2:=strtoint(data1[2]);
TerminalSystem.StringArg1:=data1[3];
TerminalSystem.StringArg2:=data1[4];
TerminalSystem.GUID1:=StringToGUID(data1[5]);
TerminalSystem.GUID2:=StringToGUID(data1[6]);
StartBefehl(StringToGUID('{46368186-DF3D-467A-9792-DAC6B03A21E3}'), integer(data2));
end;
end;
end;
end;
Bei MSG_OPENLIBRARY wird zunächst eine Instanz der Bibliothek erzeugt, dann die ID in eine GUID umgewandelt und der Selektion übergeben und anschließend die Bibliothek angezeigt. Sobald man auf OK klickt, wird geprüft, ob eine Szene ausgewählt wurde - wenn nicht wird die Verwaltung ohne Nachricht wieder gelöscht. Wird aber eine Szene ausgewählt, dann wird zum Plugin wieder ein SendMSG gesendet mit den entsprechenden Werten. Dann wieder entsprechend die Szenenverwaltung entfernt.
viele Grüße,
Christian