Skip to content

Commit 8c4abdc

Browse files
Merge pull request #89 from alexmercerind/improvements
Fixed memory leaks & improved cleanup.
2 parents 44b4a32 + 9244262 commit 8c4abdc

38 files changed

+289
-215
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ jobs:
2828
- run: flutter config --enable-windows-desktop
2929
- run: flutter pub get
3030
- run: flutter build windows --verbose
31+
- uses: actions/upload-artifact@v1
32+
with:
33+
name: dart_vlc_example
34+
path: example/build/windows/runner/Release
3135

3236
build_linux:
3337
name: Build Linux

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 0.1.1
2+
3+
- Fixed setState being called after dispose (#75) (Finally)
4+
- Improved memory management.
5+
- Fixed ton of memory leaks.
6+
- Fixed `Devices::all` & `Media::parse` causing crash on Windows.
7+
18
## 0.1.0
29

310
- Fixed build on Linux.

README.md

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
<h4 align="center">Flutter 🎞 media playback, broadcast, recording & chromecast library for Windows & Linux.</h4>
33
<h5 align="center">Written in C++ using libVLC & libVLC++.</h5>
44

5-
![](https://github.com/alexmercerind/dart_vlc/blob/assets/dart_vlc_6.png?raw=true)
5+
![](https://github.com/alexmercerind/dart_vlc/blob/assets/dart_vlc_windows_11_1.PNG?raw=true)
66

7-
![](https://github.com/alexmercerind/dart_vlc/blob/assets/dart_vlc_7.png?raw=true)
7+
![](https://github.com/alexmercerind/dart_vlc/blob/assets/dart_vlc_windows_11_2.PNG?raw=true)
88

99
## Installation
1010

@@ -13,33 +13,27 @@
1313
```yaml
1414
dependencies:
1515
...
16-
dart_vlc: ^0.0.9
16+
dart_vlc: ^0.1.1
1717
```
1818
1919
**Dart CLI**
2020
2121
```yaml
2222
dependencies:
2323
...
24-
dart_vlc_ffi: ^0.0.1
24+
dart_vlc_ffi: ^0.1.0
2525
```
2626
2727
More on Dart CLI implementation [here](./ffi/README.md).
2828
29+
Feel free to open issue, incase you find something to be not working.
2930
3031
## Support
3132
3233
Consider supporting the project by starring the repository or buying me a coffee.
3334
3435
<a href="https://www.buymeacoffee.com/alexmercerind"><img src="https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=alexmercerind&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff"></a>
3536
36-
**Donate in Crypto**
37-
38-
- ETH (Ethereum)
39-
- `0x92f92BC204cDFDAB655e6A69e5Aa4bA5476D7661`
40-
- BTC (Bitcoin)
41-
- `1M3DNwnX1GDauPoPr7VywojMRWygje8ctq`
42-
4337
Thanks a lot for your support.
4438
4539
Looking for contributors for macOS port.
@@ -328,7 +322,7 @@ You can see an example project [here](https://github.com/alexmercerind/dart_vlc/
328322

329323
Windows
330324

331-
![](https://github.com/alexmercerind/dart_vlc/blob/assets/dart_vlc_0.PNG?raw=true)
325+
![](https://github.com/alexmercerind/dart_vlc/blob/assets/dart_vlc_6.png?raw=true)
332326

333327

334328
## Workings

dartvlc/broadcast.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ class Broadcast {
7171
);
7272
}
7373

74-
void dispose() {
74+
~Broadcast() {
7575
libvlc_vlm_release(this->instance.get());
76+
delete this->media;
7677
}
7778

7879
private:
@@ -89,6 +90,11 @@ class Broadcasts {
8990
return this->broadcasts[id];
9091
}
9192

93+
void dispose(int id, std::function<void()> callback = []() -> void {}) {
94+
delete this->broadcasts[id];
95+
callback();
96+
}
97+
9298
private:
9399
std::map<int, Broadcast*> broadcasts;
94100
};

dartvlc/chromecast.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,9 @@ class Chromecast {
4848
);
4949
}
5050

51-
void dispose() {
51+
~Chromecast() {
5252
libvlc_vlm_release(this->instance.get());
53+
delete this->media;
5354
}
5455

5556
private:
@@ -66,6 +67,11 @@ class Chromecasts {
6667
return this->chromecasts[id];
6768
}
6869

70+
void dispose(int id, std::function<void()> callback = []() -> void {}) {
71+
delete this->chromecasts[id];
72+
callback();
73+
}
74+
6975
private:
7076
std::map<int, Chromecast*> chromecasts;
7177
};

dartvlc/device.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ class Devices {
4141
std::vector<Device*> all;
4242

4343
void refresh() {
44+
for (Device* device: this->all) {
45+
delete device;
46+
}
4447
this->all.clear();
4548
VLC::Instance _ = VLC::Instance(0, nullptr);
4649
VLC::MediaPlayer __ = VLC::MediaPlayer(_);

dartvlc/equalizer.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ class Equalizers {
102102
return id;
103103
}
104104

105+
void dispose(int id, std::function<void()> callback = []() -> void {}) {
106+
delete this->equalizers[id];
107+
callback();
108+
}
109+
105110
private:
106111
std::map<int, Equalizer*> equalizers;
107112
};

dartvlc/internal/events.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class PlayerEvents : public PlayerGetters {
106106
if (this->isPlaylistModified) {
107107
this->mediaListPlayer.setMediaList(this->mediaList);
108108
if (!this->mediaList.count()) {
109-
this->state = new PlayerState();
109+
this->state->reset();
110110
this->mediaListPlayer.stop();
111111
return;
112112
}

dartvlc/internal/setters.hpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,34 @@
1818
class PlayerSetters: public PlayerEvents {
1919
public:
2020
void open(MediaSource* mediaSource, bool autoStart = true) {
21-
if (this->state->device == nullptr)
22-
this->stop();
23-
this->state->medias = new Playlist({}, PlaylistMode::single);
21+
/* Freed the previous `Media` objects when a new `Playlist` or `Media` is opened. */
22+
for (Media* media: this->state->medias->medias) {
23+
delete media;
24+
}
25+
this->stop();
26+
this->state->medias->medias = {};
2427
this->mediaList = VLC::MediaList(this->instance);
2528
if (mediaSource->mediaSourceType() == "MediaSourceType.media") {
2629
Media* media = dynamic_cast<Media*>(mediaSource);
2730
VLC::Media _ = VLC::Media(this->instance, media->location, VLC::Media::FromLocation);
2831
this->mediaList.addMedia(_);
2932
this->mediaListPlayer.setMediaList(this->mediaList);
30-
this->state->medias = new Playlist({ media }, PlaylistMode::single);
33+
this->state->medias->medias = { media };
3134
this->state->isPlaylist = false;
32-
3335
}
3436
else if (mediaSource->mediaSourceType() == "MediaSourceType.playlist") {
3537
Playlist* playlist = dynamic_cast<Playlist*>(mediaSource);
3638
if (playlist->medias.empty())
3739
return;
38-
for (Media* _ : playlist->medias) {
39-
VLC::Media media = VLC::Media(this->instance, _->location, VLC::Media::FromLocation);
40-
this->mediaList.addMedia(media);
40+
for (Media* media : playlist->medias) {
41+
VLC::Media _ = VLC::Media(this->instance, media->location, VLC::Media::FromLocation);
42+
this->mediaList.addMedia(_);
4143
}
4244
this->mediaListPlayer.setMediaList(this->mediaList);
43-
this->state->medias = playlist;
45+
this->state->medias->medias = playlist->medias;
4446
this->state->isPlaylist = true;
4547
}
4648
this->_onOpenCallback(this->mediaList.itemAtIndex(0));
47-
4849
this->mediaListPlayer.playItemAtIndex(0);
4950
this->state->index = 0;
5051
this->state->isPlaying = this->mediaListPlayer.isPlaying();
@@ -123,7 +124,6 @@ class PlayerSetters: public PlayerEvents {
123124

124125
void setEqualizer(Equalizer* equalizer) {
125126
this->mediaPlayer.setEqualizer(equalizer->equalizer);
126-
this->state->equalizer = equalizer;
127127
}
128128

129129
void setUserAgent(std::string userAgent) {
@@ -173,7 +173,12 @@ class PlayerSetters: public PlayerEvents {
173173
}
174174

175175
void move(int initial, int final) {
176-
if (initial < 0 || initial >= this->state->medias->medias.size() || final < 0 || final >= this->state->medias->medias.size()) return;
176+
if (
177+
initial < 0 ||
178+
initial >= this->state->medias->medias.size() ||
179+
final < 0 ||
180+
final >= this->state->medias->medias.size()
181+
) return;
177182
if (initial == final) return;
178183
this->isPlaylistModified = true;
179184
Media* _ = this->state->medias->medias[initial];

dartvlc/internal/state.hpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,29 @@ class PlayerState {
2828
float rate = 1.0;
2929
bool isPlaylist = false;
3030
Device* device = nullptr;
31+
/* TODO: Not used yet.
3132
Equalizer* equalizer = nullptr;
33+
*/
34+
35+
void reset() {
36+
this->index = 0;
37+
this->medias->medias = {};
38+
this->isPlaying = false;
39+
this->isValid = true;
40+
this->isSeekable = true;
41+
this->isCompleted = false;
42+
this->position = 0;
43+
this->duration = 0;
44+
this->volume = 1.0;
45+
this->rate = 1.0;
46+
this->isPlaylist = false;
47+
this->device = nullptr;
48+
/*
49+
this->equalizer = nullptr;
50+
*/
51+
}
52+
53+
~PlayerState() {
54+
delete this->medias;
55+
}
3256
};

0 commit comments

Comments
 (0)