Skip to content

Commit bb55014

Browse files
Merge pull request #135 from alexmercerind/fix-seg-faults
2 parents b27eac9 + ee41049 commit bb55014

File tree

6 files changed

+64
-37
lines changed

6 files changed

+64
-37
lines changed

dartvlc/api/eventmanager.h

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -160,48 +160,68 @@ inline void OnRate(int32_t id, PlayerState* state) {
160160
inline void OnOpen(int32_t id, PlayerState* state) {
161161
const auto& media_items = state->medias()->medias();
162162

163-
auto value_objects = std::unique_ptr<Dart_CObject* []>(
164-
new Dart_CObject*[4 + media_items.size() * 2]);
165-
166163
Dart_CObject id_object;
167164
id_object.type = Dart_CObject_kInt32;
168165
id_object.value.as_int32 = id;
169-
value_objects[0] = &id_object;
170166

171167
Dart_CObject type_object;
172168
type_object.type = Dart_CObject_kString;
173169
type_object.value.as_string = "openEvent";
174-
value_objects[1] = &type_object;
175170

176171
Dart_CObject index_object;
177172
index_object.type = Dart_CObject_kInt32;
178173
index_object.value.as_int32 = state->index();
179-
value_objects[2] = &index_object;
180174

181175
Dart_CObject is_playlist_object;
182176
is_playlist_object.type = Dart_CObject_kBool;
183177
is_playlist_object.value.as_int32 = state->is_playlist();
184-
value_objects[3] = &is_playlist_object;
185-
int index = 0;
186-
for (const auto& media : media_items) {
187-
Dart_CObject media_type_object;
188-
media_type_object.type = Dart_CObject_kString;
189-
media_type_object.value.as_string =
190-
const_cast<char*>(media->media_type().c_str());
191-
192-
Dart_CObject resource_object;
193-
resource_object.type = Dart_CObject_kString;
194-
resource_object.value.as_string =
195-
const_cast<char*>(media->resource().c_str());
196-
value_objects[index + 4] = &media_type_object;
197-
value_objects[index + 5] = &resource_object;
198-
index += 2;
178+
179+
auto types_objects =
180+
std::unique_ptr<Dart_CObject[]>(new Dart_CObject[media_items.size()]);
181+
auto types_object_refs =
182+
std::unique_ptr<Dart_CObject* []>(new Dart_CObject*[media_items.size()]);
183+
std::vector<std::string> types_str(media_items.size());
184+
std::vector<const char*> types_ptr(media_items.size());
185+
for (int32_t i = 0; i < media_items.size(); i++) {
186+
types_str[i] = media_items[i]->media_type();
187+
types_ptr[i] = types_str[i].c_str();
188+
Dart_CObject* value_object = &types_objects[i];
189+
value_object->type = Dart_CObject_kString;
190+
value_object->value.as_string = const_cast<char*>(types_ptr[i]);
191+
types_object_refs[i] = value_object;
192+
}
193+
Dart_CObject types_object;
194+
types_object.type = Dart_CObject_kArray;
195+
types_object.value.as_array.length = media_items.size();
196+
types_object.value.as_array.values = types_object_refs.get();
197+
198+
auto resources_objects =
199+
std::unique_ptr<Dart_CObject[]>(new Dart_CObject[media_items.size()]);
200+
auto resources_object_refs =
201+
std::unique_ptr<Dart_CObject* []>(new Dart_CObject*[media_items.size()]);
202+
std::vector<std::string> resources_str(media_items.size());
203+
std::vector<const char*> resources_ptr(media_items.size());
204+
for (int32_t i = 0; i < media_items.size(); i++) {
205+
resources_str[i] = media_items[i]->resource();
206+
resources_ptr[i] = resources_str[i].c_str();
207+
Dart_CObject* value_object = &resources_objects[i];
208+
value_object->type = Dart_CObject_kString;
209+
value_object->value.as_string = const_cast<char*>(resources_ptr[i]);
210+
resources_object_refs[i] = value_object;
199211
}
212+
Dart_CObject resources_object;
213+
resources_object.type = Dart_CObject_kArray;
214+
resources_object.value.as_array.length = media_items.size();
215+
resources_object.value.as_array.values = resources_object_refs.get();
216+
217+
Dart_CObject* value_objects[] = {&id_object, &type_object,
218+
&index_object, &is_playlist_object,
219+
&types_object, &resources_object};
200220

201221
Dart_CObject return_object;
202222
return_object.type = Dart_CObject_kArray;
203-
return_object.value.as_array.length = 4 + media_items.size() * 2;
204-
return_object.value.as_array.values = value_objects.get();
223+
return_object.value.as_array.length = 6;
224+
return_object.value.as_array.values = value_objects;
205225
g_dart_post_C_object(g_callback_port, &return_object);
206226
}
207227

ffi/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.1.4
2+
3+
- Fix OnOpen callback
4+
15
## 0.1.3
26

37
- Update `ReceivePort` listener to match new NativePort callbacks.

ffi/lib/src/internal/ffi.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -228,22 +228,24 @@ final ReceivePort receiver = new ReceivePort()
228228
{
229229
players[id]!.current.index = event[2];
230230
players[id]!.current.isPlaylist = event[3];
231+
assert(event[4].length == event[5].length);
232+
int length = event[4].length;
231233
List<Media> medias = [];
232-
for (int index = 4; index < event.length; index += 2) {
233-
switch (event[index]) {
234+
for (int index = 0; index < length; index++) {
235+
switch (event[4][index]) {
234236
case 'MediaType.file':
235237
{
236-
medias.add(Media.file(File(event[index + 1])));
238+
medias.add(Media.file(File(event[5][index])));
237239
break;
238240
}
239241
case 'MediaType.network':
240242
{
241-
medias.add(Media.network(Uri.parse(event[index + 1])));
243+
medias.add(Media.network(Uri.parse(event[5][index])));
242244
break;
243245
}
244246
case 'MediaType.directShow':
245247
{
246-
medias.add(Media.directShow(rawUrl: event[index + 1]));
248+
medias.add(Media.directShow(rawUrl: event[5][index]));
247249
break;
248250
}
249251
}

ffi/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: dart_vlc_ffi
22
description: FFI based binding to dart_vlc wrapper (Based on libVLC & libVLC++).
3-
version: 0.1.3
3+
version: 0.1.4
44
homepage: https://github.com/alexmercerind/dart_vlc
55
repository: https://github.com/alexmercerind/dart_vlc
66
documentation: https://github.com/alexmercerind/dart_vlc/blob/master/README.md

pubspec.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ packages:
77
name: audio_video_progress_bar
88
url: "https://pub.dartlang.org"
99
source: hosted
10-
version: "0.4.0"
10+
version: "0.9.0"
1111
characters:
1212
dependency: transitive
1313
description:
@@ -25,10 +25,10 @@ packages:
2525
dart_vlc_ffi:
2626
dependency: "direct main"
2727
description:
28-
name: dart_vlc_ffi
29-
url: "https://pub.dartlang.org"
30-
source: hosted
31-
version: "0.1.3"
28+
path: ffi
29+
relative: true
30+
source: path
31+
version: "0.1.4"
3232
ffi:
3333
dependency: transitive
3434
description:
@@ -68,7 +68,7 @@ packages:
6868
name: path_provider
6969
url: "https://pub.dartlang.org"
7070
source: hosted
71-
version: "2.0.1"
71+
version: "2.0.2"
7272
path_provider_linux:
7373
dependency: transitive
7474
description:

pubspec.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: dart_vlc
22
description: Flutter media playback, broadcast, recording & chromecast library. Based on libVLC & libVLC++.
3-
version: 0.1.6
3+
version: 0.1.7
44
homepage: https://github.com/alexmercerind/dart_vlc
55
repository: https://github.com/alexmercerind/dart_vlc
66
documentation: https://github.com/alexmercerind/dart_vlc/blob/master/README.md
@@ -12,7 +12,8 @@ environment:
1212
dependencies:
1313
flutter:
1414
sdk: flutter
15-
dart_vlc_ffi: ">=0.1.3 <1.0.0"
15+
dart_vlc_ffi:
16+
path: ./ffi
1617
path: ">=1.8.0 <2.0.0"
1718
path_provider: ">=2.0.2 <3.0.0"
1819
audio_video_progress_bar: ">=0.9.0 <1.0.0"

0 commit comments

Comments
 (0)