Thread Perl Funktion von XS aufrufen (16 answers)
Opened by Max_Perlbeginner at 2019-01-02 16:28

Max_Perlbeginner
 2019-01-24 21:39
#189608 #189608
User since
2016-04-04
107 Artikel
BenutzerIn
[default_avatar]
Kleines Update:
Ich konnte mit Hilfe des Entwicklers des MPV Media Player das Problem lösen. Ich habe im Constructor des MPV::Simple Objects folgendermaßen eine Pipe in C erstellt:

Code: (dl )
1
2
3
4
5
6
7
8
9
static int pipes[2];

[...]
new [...]
if ( pipe(pipes) < 0) {
printf("Pipe creation failed\n");
perror ("pipe");
exit(EXIT_FAILURE);
}


Im nun reinen C-Callback, dem ich der Funktion mpv_set_wakeup_callback übergebe, wird nun immer ein kleines Byte in diese Pipe hineingeschrieben:

Code: (dl )
1
2
3
4
5
void callback()
{
if (pipes[0] != -1)
write( pipes[1], &(char){0}, 1);
}


in meinem Perl Modul wird nun mittels der folgenden XS Funktion has_events innerhalb einer while Schleife stets neu abgefragt, ob Ereignisse vorhanden sind, und wenn ja, werden diese ausgewertet:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
has_events(MPV__Simple* ctx)
CODE:
int ret;
int pipefd = pipes[0];
if (pipefd < 0)
ret = -1;
else {
struct pollfd pfds[1] = {
{ .fd = pipefd, .events = POLLIN },
};
// Wait until there are possibly new mpv events
poll(pfds,1,0);
if (pfds[0].revents & POLLIN) {
// Empty the pipe. Doing this before calling mpv_wait_event()
// ensures that no wakeups are missed. It's not so important to
// make sure the pipe is really empty (it will just cause some
// additional wakeups in unlikely corner cases).
char unused[256];
read(pipefd, unused, sizeof(unused));
ret = 1;
}
else {
ret = 0;
}
}
RETVAL = ret;
OUTPUT: RETVAL


Nochmals herzlichen Dank an alle, die mir geholfen haben. Das war ein echt hartes Stück Arbeit,
Max

PS: Die Perl Anbindung für MPV ist nun fertig (siehe hier). Ich habe auch noch eine Anbindung an das JSON IPC Interface von MPV hinzugefügt. Die nächsten Tage geht es auf CPAN. Ein Video Player sollte mit Perl nun also problemlos möglich sein ;-) Da es mein erstes C/XS Modul ist, würde ich mich natürlich über jedes Feedback freuen (gleichwohl ob positiv oder kritisch...)
Last edited: 2020-04-25 08:15:15 +0200 (CEST)

View full thread Perl Funktion von XS aufrufen