Mein Ziel ist es mit Hilfe von DBUS den Aktuellen gespielten Titel von Amarok zu Erfahren sowie bei jeder Änderung Informiert zu werden. Dazu hat Amarok ein DBUS-Signal: TrackChange. Empfangen klappt auch schon ganz gut. Bei Änderungen greift die IF Abfrage bereits. Das Problem dabei ist nur: Wie komme ich an den Inhalt ran? Durch verschiedene Tests bin ich der Auffassung: Das ich ein "DBUS_TYPE_STRUCT" verarbeiten muss aber wie?
Trotz intensiver suche im Internet, konnte ich diese Frage nicht klären. Einfache Daten Typen kann ich schon Verarbeiten. Z.B. habe ich ein Beispiel für Pidgin gefunden, darauf basiert auch dieser Code hier.
Die Entscheidene Stelle um die es mir geht ist: dbus_message_get_args(msg, @err, DBUS_TYPE_STRUCT, [@sp]);
Nur wie komme ich jetzt wieder an den Inhalt ran? Im Prinzip müsste ich "nur" args verarbeiten. Aber ich weiß einfach nicht wie das gehen soll.
Kennt sich wer von euch mit DBUS unter Lazarus aus?
so sieht im Moment mein Test Code aus:
(Ist ein Test Code, daher etwas unaufgeräumt)
Code: Alles auswählen
procedure TListeningThread.Execute;
var
List:array of Integer;
sender, body: Pchar;
s:cfloat;
b:byte;
g:PDBusMessageIter;
s1:String;
sp:Pointer;
begin
{ Initializes the errors }
dbus_error_init(@err);
{ Connection }
conn := dbus_bus_get(DBUS_BUS_SESSION, @err);
try
if dbus_error_is_set(@err) <> 0 then
begin
AddLog('Connection Error: ' + err.message);
dbus_error_free(@err);
end;
if conn = nil then Exit;
{ Request the name of the bus }
ret := dbus_bus_request_name(conn, 'org.mpris', DBUS_NAME_FLAG_REPLACE_EXISTING, @err);
if dbus_error_is_set(@err) <> 0 then begin
AddLog('Name Error: ' + err.message);
dbus_error_free(@err);
end;
// if ret <> DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER then Exit;
dbus_bus_add_match(conn, 'type=signal, interface=org.freedesktop.MediaPlayer', @err);
dbus_connection_flush(conn);
if dbus_error_is_set(@err) <> 0 then
begin
AddLog('Match Error: ' + err.message);
dbus_error_free(@err);
Exit
end;
writeln('Schleife Startet !!!');
s1:='TestTest';
sp:=@s1[1];
while not Terminated do begin
dbus_connection_read_write(conn, 0);
msg := dbus_connection_pop_message(conn);
if msg=nil then begin
sleep(300);
Continue;
end;
if (dbus_message_is_signal(msg, 'org.freedesktop.MediaPlayer', 'TrackChange')=1) then
begin
// read the parameters
if (dbus_message_iter_init(msg, @args)=0) then
AddLog('Message has no arguments!')
else begin
body:=' ';
dbus_message_get_args(msg, @err, DBUS_TYPE_STRUCT, [@sp]);
// writeln(body);
// writelN(dbus_message_type_to_string(msg));
// id:=dbus_message_iter_get_arg_type(@args);
// writeln(id);
// AddLog(Format('Status in Amarok: %s', [body]));
end
end;
dbus_message_unref(msg);
// free the message
end;
finally
dbus_connection_close(conn);
end;
end; // TListeningThread.Execute