Skip to content

Commit 3f3f435

Browse files
committed
feat: Release source for Web, Linux, Windows (#1517)
# Description Release sources in `Release` mode, when source is `completed`. ## Related Issues Closes #1537 (cherry picked from commit 09496dc)
1 parent 79d6439 commit 3f3f435

11 files changed

Lines changed: 46 additions & 28 deletions

File tree

feature_parity_table.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ Note: LLM means Low Latency Mode.
3838
<tr><td>low latency mode</td><td>SDK >=21</td><td>no</td><td>no</td><td>no</td><td>no</td><td>no</td></tr>
3939
<tr><td colspan="7"><strong>Audio Control Commands</strong></td></tr>
4040
<tr><td>resume / pause / stop</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td></tr>
41-
<tr><td>release</td><td>yes</td><td>yes (no mode)</td><td>yes (no mode)</td><td>yes (no mode)</td><td>not yet</td><td>not yet</td></tr>
41+
<tr><td>release</td><td>yes</td><td>yes (no mode)</td><td>yes (no mode)</td><td>yes (no mode)</td><td>yes (no mode)</td><td>yes (no mode)</td></tr>
4242
<tr><td>loop</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td></tr>
4343
<tr><td>volume</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td></tr>
4444
<tr><td>seek</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td><td>yes</td></tr>

packages/audioplayers_linux/linux/audio_player.cc

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,18 @@ void AudioPlayer::SetSourceUrl(std::string url) {
7777
}
7878
}
7979

80+
void AudioPlayer::ReleaseMediaSource() {
81+
if(_isPlaying) _isPlaying = false;
82+
if(_isInitialized) _isInitialized = false;
83+
_url.clear();
84+
85+
GstState playbinState;
86+
gst_element_get_state(playbin, &playbinState, NULL, GST_CLOCK_TIME_NONE);
87+
if(playbinState > GST_STATE_NULL) {
88+
gst_element_set_state(playbin, GST_STATE_NULL);
89+
}
90+
}
91+
8092
gboolean AudioPlayer::OnBusMessage(GstBus *bus, GstMessage *message,
8193
AudioPlayer *data) {
8294
switch (GST_MESSAGE_TYPE(message)) {
@@ -413,8 +425,7 @@ void AudioPlayer::Resume() {
413425

414426
void AudioPlayer::Dispose() {
415427
if(!playbin) throw "Player was already disposed (Dispose)";
416-
if(_isPlaying) _isPlaying = false;
417-
if(_isInitialized) _isInitialized = false;
428+
ReleaseMediaSource();
418429

419430
g_source_remove(_refreshId);
420431

@@ -440,11 +451,6 @@ void AudioPlayer::Dispose() {
440451
panorama = nullptr;
441452
}
442453

443-
GstState playbinState;
444-
gst_element_get_state(playbin, &playbinState, NULL, GST_CLOCK_TIME_NONE);
445-
if(playbinState > GST_STATE_NULL) {
446-
gst_element_set_state(playbin, GST_STATE_NULL);
447-
}
448454
gst_object_unref(GST_OBJECT(playbin));
449455
// Do not dispose method channel as it is used by multiple players!
450456
g_clear_object(&_eventChannel);

packages/audioplayers_linux/linux/audio_player.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class AudioPlayer {
5151

5252
void SetSourceUrl(std::string url);
5353

54+
void ReleaseMediaSource();
55+
5456
void OnError(const gchar *code, const gchar *message, FlValue *details,
5557
GError **error);
5658

packages/audioplayers_linux/linux/audioplayers_linux_plugin.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,7 @@ static void audioplayers_linux_plugin_handle_method_call(
139139
player->Pause();
140140
player->SetPosition(0);
141141
} else if (strcmp(method, "release") == 0) {
142-
player->Pause();
143-
player->SetPosition(0);
142+
player->ReleaseMediaSource();
144143
} else if (strcmp(method, "seek") == 0) {
145144
auto flPosition = fl_value_lookup_string(args, "position");
146145
int position = flPosition == nullptr ? (int)(player->GetPosition().value_or(0))

packages/audioplayers_web/lib/wrapped_player.dart

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class WrappedPlayer {
4040
}
4141
_currentUrl = url;
4242

43-
stop();
43+
release();
4444
recreateNode();
4545
if (_isPlaying) {
4646
await resume();
@@ -138,8 +138,11 @@ class WrappedPlayer {
138138
);
139139
_playerEndedSubscription = p.onEnded.listen(
140140
(_) {
141-
_pausedAt = 0;
142-
p.currentTime = 0;
141+
if (_currentReleaseMode == ReleaseMode.release) {
142+
release();
143+
} else {
144+
stop();
145+
}
143146
eventStreamController.add(
144147
const AudioEvent(eventType: AudioEventType.complete),
145148
);
@@ -167,10 +170,10 @@ class WrappedPlayer {
167170
}
168171

169172
void release() {
173+
stop();
170174
// Release `AudioElement` correctly (#966)
171175
player?.src = '';
172176
player?.remove();
173-
_cancel();
174177
player = null;
175178
_stereoPanner = null;
176179

@@ -211,7 +214,7 @@ class WrappedPlayer {
211214
}
212215

213216
void stop() {
214-
_cancel();
217+
pause();
215218
_pausedAt = 0;
216219
player?.currentTime = 0;
217220
}
@@ -225,21 +228,14 @@ class WrappedPlayer {
225228
}
226229
}
227230

228-
void _cancel() {
229-
_isPlaying = false;
230-
player?.pause();
231-
if (_currentReleaseMode == ReleaseMode.release) {
232-
player = null;
233-
}
234-
}
235-
236231
void log(String message) {
237232
eventStreamController.add(
238233
AudioEvent(eventType: AudioEventType.log, logMessage: message),
239234
);
240235
}
241236

242237
Future<void> dispose() async {
238+
release();
243239
eventStreamController.close();
244240
}
245241
}

packages/audioplayers_windows/windows/MediaEngineExtension.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,4 @@ void MediaEngineExtension::Shutdown()
106106
}
107107
}
108108

109-
} // namespace media
109+
} // namespace media

packages/audioplayers_windows/windows/MediaEngineWrapper.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,11 @@ void MediaEngineWrapper::SetMediaSource(IMFMediaSource* mediaSource) {
339339
THROW_IF_FAILED(mediaEngineEx->SetSource(source.get()));
340340
}
341341

342+
void MediaEngineWrapper::ReleaseMediaSource() {
343+
m_mediaEngineExtension->SetMediaSource(nullptr);
344+
m_mediaEngine->SetSource(nullptr);
345+
}
346+
342347
// Callback methods
343348

344349
void MediaEngineWrapper::OnLoaded()

packages/audioplayers_windows/windows/MediaEngineWrapper.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ class MediaEngineWrapper : public winrt::implements<MediaEngineWrapper, IUnknown
3838
// Initialize with the provided media source
3939
void SetMediaSource(IMFMediaSource* mediaSource);
4040

41+
// Release media resources
42+
void ReleaseMediaSource();
43+
4144
// Stop playback and cleanup resources
4245
void Pause();
4346
void Shutdown();

packages/audioplayers_windows/windows/audio_player.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,13 +195,19 @@ void AudioPlayer::SendInitialized() {
195195
}
196196
}
197197

198-
void AudioPlayer::Dispose() {
198+
void AudioPlayer::ReleaseMediaSource() {
199199
if (_isInitialized) {
200200
m_mediaEngineWrapper->Pause();
201201
}
202+
m_mediaEngineWrapper->ReleaseMediaSource();
203+
_isInitialized = false;
204+
}
205+
206+
void AudioPlayer::Dispose() {
207+
ReleaseMediaSource();
208+
m_mediaEngineWrapper->Shutdown();
202209
_methodChannel = nullptr;
203210
_eventHandler = nullptr;
204-
_isInitialized = false;
205211
}
206212

207213
void AudioPlayer::SetLooping(bool isLooping) {

packages/audioplayers_windows/windows/audio_player.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ class AudioPlayer {
5353

5454
void Dispose();
5555

56+
void ReleaseMediaSource();
57+
5658
void SetLooping(bool isLooping);
5759

5860
void SetVolume(double volume);

0 commit comments

Comments
 (0)