1
+ #define _GNU_SOURCE
2
+
1
3
#include <stdio.h>
4
+ #include <stdbool.h>
2
5
3
6
#include "gst/gst.h"
4
7
#include "gst/gstelementfactory.h"
5
8
#include "gst/gstmessage.h"
6
9
#include "gst/gstsegment.h"
7
10
#include "platformchannel.h"
8
- #include "pluginregistry.h"
9
11
10
12
#include <flutter-pi.h>
11
13
#include <plugins/audioplayers.h>
@@ -30,7 +32,9 @@ struct audio_player {
30
32
31
33
char * url ;
32
34
char * player_id ;
33
- char event_channel_name [128 ];
35
+ char * event_channel_name ;
36
+
37
+ _Atomic bool event_subscribed ;
34
38
};
35
39
36
40
// Private Class functions
@@ -75,22 +79,6 @@ static void audio_player_source_setup(GstElement *playbin, GstElement *source, G
75
79
}
76
80
}
77
81
78
- static int on_receive_event_ch (char * channel , struct platch_obj * object , FlutterPlatformMessageResponseHandle * responsehandle ) {
79
- //TODO: Do we need any more setup to send events to dart code?
80
- (void )channel ;
81
- if (strcmp (object -> method , "listen" ) == 0 ) {
82
- LOG_DEBUG ("%s: listen()\n" , channel );
83
- platch_respond_success_std (responsehandle , NULL );
84
- } else if (strcmp (object -> method , "cancel" ) == 0 ) {
85
- LOG_DEBUG ("%s: cancel()\n" , channel );
86
- platch_respond_success_std (responsehandle , NULL );
87
- } else {
88
- return platch_respond_not_implemented (responsehandle );
89
- }
90
-
91
- return 0 ;
92
- }
93
-
94
82
struct audio_player * audio_player_new (char * player_id , char * channel ) {
95
83
GPollFD fd ;
96
84
sd_event_source * busfd_event_source ;
@@ -101,11 +89,13 @@ struct audio_player *audio_player_new(char *player_id, char *channel) {
101
89
}
102
90
103
91
self -> url = NULL ;
92
+ self -> source = NULL ;
104
93
self -> is_initialized = false;
105
94
self -> is_playing = false;
106
95
self -> is_looping = false;
107
96
self -> is_seek_completed = false;
108
97
self -> playback_rate = 1.0 ;
98
+ self -> event_subscribed = false;
109
99
110
100
gst_init (NULL , NULL );
111
101
self -> playbin = gst_element_factory_make ("playbin" , NULL );
@@ -154,23 +144,10 @@ struct audio_player *audio_player_new(char *player_id, char *channel) {
154
144
155
145
// audioplayers player event channel clang:
156
146
// <local>/events/<player_id>
157
- int ok = snprintf (
158
- self -> event_channel_name ,
159
- sizeof (self -> event_channel_name ),
160
- "%s/events/%s" ,
161
- channel ,
162
- player_id
163
- );
164
- DEBUG_ASSERT_MSG (ok < sizeof (self -> event_channel_name ), "event channel name overflow" );
165
-
166
- // set a receiver on the videoEvents event channel
167
- ok = plugin_registry_set_receiver (
168
- self -> event_channel_name ,
169
- kStandardMethodCall ,
170
- on_receive_event_ch
171
- );
147
+ asprintf (& self -> event_channel_name , "%s/events/%s" , channel , player_id );
148
+ DEBUG_ASSERT_MSG (self -> event_channel_name != NULL , "event channel name OEM" );
172
149
173
- if (ok != 0 ) {
150
+ if (self -> event_channel_name == NULL ) {
174
151
goto deinit_player_id ;
175
152
}
176
153
@@ -293,6 +270,10 @@ void audio_player_set_playback(struct audio_player *self, int64_t seekTo, double
293
270
}
294
271
295
272
void audio_player_on_media_error (struct audio_player * self , GError * error , gchar * debug ) {
273
+ if (!self -> event_subscribed ) {
274
+ return ;
275
+ }
276
+
296
277
char error_code [16 ] = {0 };
297
278
snprintf (error_code , sizeof (error_code ), "%d" , error -> code );
298
279
// clang-format off
@@ -335,6 +316,10 @@ void audio_player_on_media_state_change(struct audio_player *self, GstObject *sr
335
316
}
336
317
337
318
void audio_player_on_prepared (struct audio_player * self , bool value ) {
319
+ if (!self -> event_subscribed ) {
320
+ return ;
321
+ }
322
+
338
323
// clang-format off
339
324
platch_send_success_event_std (
340
325
self -> event_channel_name ,
@@ -347,6 +332,10 @@ void audio_player_on_prepared(struct audio_player *self, bool value) {
347
332
}
348
333
349
334
void audio_player_on_position_update (struct audio_player * self ) {
335
+ if (!self -> event_subscribed ) {
336
+ return ;
337
+ }
338
+
350
339
// clang-format off
351
340
platch_send_success_event_std (
352
341
self -> event_channel_name ,
@@ -359,6 +348,9 @@ void audio_player_on_position_update(struct audio_player *self) {
359
348
}
360
349
361
350
void audio_player_on_duration_update (struct audio_player * self ) {
351
+ if (!self -> event_subscribed ) {
352
+ return ;
353
+ }
362
354
// clang-format off
363
355
platch_send_success_event_std (
364
356
self -> event_channel_name ,
@@ -371,28 +363,32 @@ void audio_player_on_duration_update(struct audio_player *self) {
371
363
}
372
364
void audio_player_on_seek_completed (struct audio_player * self ) {
373
365
audio_player_on_position_update (self );
374
- // clang-format off
375
- platch_send_success_event_std (
376
- self -> event_channel_name ,
377
- & STDMAP2 (
378
- STDSTRING ("event" ), STDSTRING ("audio.onSeekComplete" ),
379
- STDSTRING ("value" ), STDBOOL (true)
380
- )
381
- );
382
- // clang-format on
366
+
367
+ if (self -> event_subscribed ) {
368
+ // clang-format off
369
+ platch_send_success_event_std (
370
+ self -> event_channel_name ,
371
+ & STDMAP2 (
372
+ STDSTRING ("event" ), STDSTRING ("audio.onSeekComplete" ),
373
+ STDSTRING ("value" ), STDBOOL (true)
374
+ )
375
+ );
376
+ // clang-format on
377
+ }
383
378
self -> is_seek_completed = true;
384
379
}
385
380
void audio_player_on_playback_ended (struct audio_player * self ) {
386
- // clang-format off
387
- platch_send_success_event_std (
388
- self -> event_channel_name ,
389
- & STDMAP2 (
390
- STDSTRING ("event" ), STDSTRING ("audio.onComplete" ),
391
- STDSTRING ("value" ), STDBOOL (true)
392
- )
393
- );
394
-
395
- // clang-format on
381
+ if (self -> event_subscribed ) {
382
+ // clang-format off
383
+ platch_send_success_event_std (
384
+ self -> event_channel_name ,
385
+ & STDMAP2 (
386
+ STDSTRING ("event" ), STDSTRING ("audio.onComplete" ),
387
+ STDSTRING ("value" ), STDBOOL (true)
388
+ )
389
+ );
390
+ // clang-format on
391
+ }
396
392
397
393
if (audio_player_get_looping (self )) {
398
394
audio_player_play (self );
@@ -482,14 +478,15 @@ void audio_player_destroy(struct audio_player *self) {
482
478
self -> url = NULL ;
483
479
}
484
480
485
-
486
481
if (self -> player_id != NULL ) {
487
482
free (self -> player_id );
488
483
self -> player_id = NULL ;
489
484
}
490
485
491
- plugin_registry_remove_receiver (self -> event_channel_name );
492
- self -> event_channel_name [0 ] = 0 ;
486
+ if (self -> event_channel_name != NULL ) {
487
+ free (self -> event_channel_name );
488
+ self -> event_channel_name = NULL ;;
489
+ }
493
490
494
491
free (self );
495
492
}
@@ -572,3 +569,16 @@ void audio_player_set_source_url(struct audio_player *self, char *url) {
572
569
bool audio_player_is_id (struct audio_player * self , char * player_id ) {
573
570
return strcmp (self -> player_id , player_id ) == 0 ;
574
571
}
572
+
573
+ const char * audio_player_subscribe_channel_name (const struct audio_player * self ) {
574
+ return self -> event_channel_name ;
575
+ }
576
+
577
+ bool audio_player_set_subscription_status (struct audio_player * self , const char * channel , bool value ) {
578
+ if (strcmp (self -> event_channel_name , channel ) == 0 ) {
579
+ self -> event_subscribed = value ;
580
+ return true;
581
+ } else {
582
+ return false;
583
+ }
584
+ }
0 commit comments