Skip to content

Commit c0b3f85

Browse files
authored
refactor!: improve separation of global audioplayer interface (#1443)
# Description AudioPlayers platform communication consists of two parts: the `AudioPlayer` scope and the `Global` scope. These were not separated consistently, so one was used as implementation and the other as interface. Now both scopes are handled the same way: * `AudioPlayer`: player specific processing and interaction via `AudioplayersPlatformInterface` * `GlobalAudioScope`: global processing and interaction via `GlobalAudioplayersPlatformInterface` * `AudioplayersPlatformInterface`: interface to player platform channel (methods and events), holds an instance implementation like `AudioplayersPlatform` or `WebAudioplayersPlatform` * `GlobalAudioplayersPlatformInterface`: interface to global platform channel (methods and events), holds an instance implementation like `GlobalAudioplayersPlatform` or `WebGlobalAudioplayersPlatform` * `AudioplayersPlatform`: platform channel implementation of `AudioplayersPlatformInterface` * `GlobalAudioplayersPlatform`: platform channel implementation of `GlobalAudioplayersPlatformInterface` Also deprecated `AudioPlayer.global.setGlobalAudioContext()` in favor of `AudioPlayer.global.setAudioContext()`. ## Migration instructions **audioplayers**: | Before | After | |---|---| | `GlobalPlatformInterface` | `GlobalAudioScope` | | `AudioPlayer.global.setGlobalAudioContext()` | `AudioPlayer.global.setAudioContext()` | **audioplayers_platform_interface**: | Before | After | |---|---| | `AudioplayersPlatform` | `AudioplayersPlatformInterface` | | `MethodChannelAudioplayersPlatform` | `AudioplayersPlatform` | | `GlobalPlatformInterface` | `GlobalAudioplayersPlatformInterface` | | `MethodChannelGlobalPlatform` | `GlobalAudioplayersPlatform` | **audioplayers_web**: | Before | After | |---|---| | `AudioplayersPlugin` | `AudioplayersPlugin`, `WebAudioplayersPlatform` and `WebGlobalAudioplayersPlatform` |
1 parent 3b5de50 commit c0b3f85

14 files changed

Lines changed: 108 additions & 49 deletions

packages/audioplayers/example/integration_test/lib_test.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ void main() {
131131
//ignore: avoid_redundant_argument_values
132132
respectSilence: false,
133133
).build();
134-
await AudioPlayer.global.setGlobalAudioContext(audioContext);
134+
await AudioPlayer.global.setAudioContext(audioContext);
135135
await player.setAudioContext(audioContext);
136136

137137
await player.play(td.source);
@@ -143,7 +143,7 @@ void main() {
143143
forceSpeaker: false,
144144
respectSilence: true,
145145
).build();
146-
await AudioPlayer.global.setGlobalAudioContext(audioContext);
146+
await AudioPlayer.global.setAudioContext(audioContext);
147147
await player.setAudioContext(audioContext);
148148

149149
await player.resume();
@@ -172,7 +172,7 @@ void main() {
172172
//ignore: avoid_redundant_argument_values
173173
respectSilence: false,
174174
).build();
175-
await AudioPlayer.global.setGlobalAudioContext(audioContext);
175+
await AudioPlayer.global.setAudioContext(audioContext);
176176
await player.setAudioContext(audioContext);
177177

178178
await player.setSource(td.source);
@@ -187,7 +187,7 @@ void main() {
187187
forceSpeaker: false,
188188
respectSilence: true,
189189
).build();
190-
await AudioPlayer.global.setGlobalAudioContext(audioContext);
190+
await AudioPlayer.global.setAudioContext(audioContext);
191191
await player.setAudioContext(audioContext);
192192

193193
await player.resume();

packages/audioplayers/example/lib/tabs/audio_context.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class AudioContextTab extends StatefulWidget {
1616

1717
class _AudioContextTabState extends State<AudioContextTab>
1818
with AutomaticKeepAliveClientMixin<AudioContextTab> {
19-
static GlobalPlatformInterface get _global => AudioPlayer.global;
19+
static GlobalAudioScope get _global => AudioPlayer.global;
2020

2121
AudioPlayer get player => widget.player;
2222

@@ -43,7 +43,7 @@ class _AudioContextTabState extends State<AudioContextTab>
4343
ElevatedButton.icon(
4444
icon: const Icon(Icons.public),
4545
label: const Text('Global'),
46-
onPressed: () => _global.setGlobalAudioContext(audioContext),
46+
onPressed: () => _global.setAudioContext(audioContext),
4747
),
4848
ElevatedButton.icon(
4949
icon: const Icon(Icons.looks_one),

packages/audioplayers/example/lib/tabs/logger.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class LoggerTab extends StatefulWidget {
1111
}
1212

1313
class _LoggerTabState extends State<LoggerTab> {
14-
static GlobalPlatformInterface get _logger => AudioPlayer.global;
14+
static GlobalAudioScope get _logger => AudioPlayer.global;
1515

1616
LogLevel currentLogLevel = _logger.logLevel;
1717

packages/audioplayers/lib/audioplayers.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ export 'package:audioplayers_platform_interface/src/api/log_level.dart';
55
export 'package:audioplayers_platform_interface/src/api/player_mode.dart';
66
export 'package:audioplayers_platform_interface/src/api/player_state.dart';
77
export 'package:audioplayers_platform_interface/src/api/release_mode.dart';
8-
export 'package:audioplayers_platform_interface/src/global_platform_interface.dart';
98

109
export 'src/audio_cache.dart';
1110
export 'src/audio_pool.dart';
1211
export 'src/audioplayer.dart';
12+
export 'src/global_audio_scope.dart';
1313
export 'src/source.dart';

packages/audioplayers/lib/src/audioplayer.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ const _uuid = Uuid();
1818
/// It holds methods to play, loop, pause, stop, seek the audio, and some useful
1919
/// hooks for handlers and callbacks.
2020
class AudioPlayer {
21-
static final global = GlobalPlatformInterface.instance;
22-
static final _platform = AudioplayersPlatform.instance;
21+
static final global = GlobalAudioScope();
22+
static final _platform = AudioplayersPlatformInterface.instance;
2323

2424
/// This is the [AudioCache] instance used by this player.
2525
/// Unless you want to control multiple caches separately, you don't need to
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import 'package:audioplayers_platform_interface/audioplayers_platform_interface.dart';
2+
3+
/// Handle global audio scope like calls and events concerning all AudioPlayers.
4+
class GlobalAudioScope {
5+
static final _platform = GlobalAudioplayersPlatformInterface.instance;
6+
7+
LogLevel get logLevel => _platform.logLevel;
8+
9+
Future<void> changeLogLevel(LogLevel level) =>
10+
_platform.changeLogLevel(level);
11+
12+
void log(LogLevel level, String message) => _platform.log(level, message);
13+
14+
void info(String message) => _platform.info(message);
15+
16+
void error(String message) => _platform.error(message);
17+
18+
Future<void> setAudioContext(AudioContext ctx) =>
19+
_platform.setGlobalAudioContext(ctx);
20+
21+
@Deprecated('Use `setAudioContext()` instead.')
22+
Future<void> setGlobalAudioContext(AudioContext ctx) =>
23+
_platform.setGlobalAudioContext(ctx);
24+
}

packages/audioplayers_platform_interface/lib/audioplayers_platform_interface.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ export 'src/api/player_mode.dart';
55
export 'src/api/player_state.dart';
66
export 'src/api/release_mode.dart';
77
export 'src/audioplayers_platform_interface.dart';
8-
export 'src/global_platform_interface.dart';
8+
export 'src/global_audioplayers_platform_interface.dart';
99
export 'src/streams_interface.dart';

packages/audioplayers_platform_interface/lib/src/method_channel_audioplayers_platform.dart renamed to packages/audioplayers_platform_interface/lib/src/audioplayers_platform.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:async';
2+
23
// TODO(gustl22): remove when upgrading min Flutter version to >=3.3.0
34
// ignore: unnecessary_import
45
import 'dart:typed_data';
@@ -7,21 +8,21 @@ import 'package:audioplayers_platform_interface/src/api/audio_context.dart';
78
import 'package:audioplayers_platform_interface/src/api/player_mode.dart';
89
import 'package:audioplayers_platform_interface/src/api/release_mode.dart';
910
import 'package:audioplayers_platform_interface/src/audioplayers_platform_interface.dart';
10-
import 'package:audioplayers_platform_interface/src/global_platform_interface.dart';
11+
import 'package:audioplayers_platform_interface/src/global_audioplayers_platform_interface.dart';
1112
import 'package:audioplayers_platform_interface/src/method_channel_interface.dart';
1213
import 'package:audioplayers_platform_interface/src/streams_interface.dart';
1314
import 'package:flutter/services.dart';
1415

15-
class MethodChannelAudioplayersPlatform extends AudioplayersPlatform
16+
class AudioplayersPlatform extends AudioplayersPlatformInterface
1617
with StreamsInterface {
1718
final MethodChannel _channel = const MethodChannel('xyz.luan/audioplayers');
1819

19-
MethodChannelAudioplayersPlatform() {
20+
AudioplayersPlatform() {
2021
_channel.setMethodCallHandler(platformCallHandler);
2122
}
2223

23-
static GlobalPlatformInterface get _logger =>
24-
GlobalPlatformInterface.instance;
24+
static GlobalAudioplayersPlatformInterface get _logger =>
25+
GlobalAudioplayersPlatformInterface.instance;
2526

2627
@override
2728
Future<int?> getCurrentPosition(String playerId) {

packages/audioplayers_platform_interface/lib/src/audioplayers_platform_interface.dart

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'package:audioplayers_platform_interface/src/api/audio_context.dart';
55
import 'package:audioplayers_platform_interface/src/api/for_player.dart';
66
import 'package:audioplayers_platform_interface/src/api/player_mode.dart';
77
import 'package:audioplayers_platform_interface/src/api/release_mode.dart';
8-
import 'package:audioplayers_platform_interface/src/method_channel_audioplayers_platform.dart';
8+
import 'package:audioplayers_platform_interface/src/audioplayers_platform.dart';
99
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
1010

1111
/// The interface that implementations of audioplayers must implement.
@@ -15,18 +15,19 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart';
1515
/// changes. Extending this class (using `extends`) ensures that the subclass
1616
/// will get the default implementation, while platform implementations that
1717
/// `implements` this interface will be broken by newly added
18-
/// [AudioplayersPlatform] methods.
19-
abstract class AudioplayersPlatform extends PlatformInterface {
20-
AudioplayersPlatform() : super(token: _token);
18+
/// [AudioplayersPlatformInterface] methods.
19+
abstract class AudioplayersPlatformInterface extends PlatformInterface {
20+
AudioplayersPlatformInterface() : super(token: _token);
2121

2222
static final Object _token = Object();
2323

24-
/// The default instance of [AudioplayersPlatform] to use.
24+
/// The default instance of [AudioplayersPlatformInterface] to use.
2525
///
26-
/// Defaults to [MethodChannelAudioplayersPlatform].
26+
/// Defaults to [AudioplayersPlatform].
2727
/// Platform-specific plugins should set this with their own platform-specific
28-
/// class that extends [AudioplayersPlatform] when they register themselves.
29-
static AudioplayersPlatform instance = MethodChannelAudioplayersPlatform();
28+
/// class that extends [AudioplayersPlatformInterface] when they register
29+
/// themselves.
30+
static AudioplayersPlatformInterface instance = AudioplayersPlatform();
3031

3132
/// Pauses the audio that is currently playing.
3233
///

packages/audioplayers_platform_interface/lib/src/global_platform_interface.dart renamed to packages/audioplayers_platform_interface/lib/src/global_audioplayers_platform.dart

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,10 @@
11
import 'package:audioplayers_platform_interface/src/api/audio_context.dart';
22
import 'package:audioplayers_platform_interface/src/api/log_level.dart';
3+
import 'package:audioplayers_platform_interface/src/global_audioplayers_platform_interface.dart';
34
import 'package:audioplayers_platform_interface/src/method_channel_interface.dart';
45
import 'package:flutter/services.dart';
56

6-
abstract class GlobalPlatformInterface {
7-
static GlobalPlatformInterface instance = MethodChannelGlobalPlatform();
8-
9-
LogLevel get logLevel;
10-
11-
Future<void> changeLogLevel(LogLevel value);
12-
13-
Future<void> setGlobalAudioContext(AudioContext ctx);
14-
15-
void log(LogLevel level, String message) {
16-
if (level.getLevel() <= logLevel.getLevel()) {
17-
// ignore: avoid_print
18-
print(message);
19-
}
20-
}
21-
22-
void info(String message) => log(LogLevel.info, message);
23-
24-
void error(String message) => log(LogLevel.error, message);
25-
}
26-
27-
class MethodChannelGlobalPlatform extends GlobalPlatformInterface {
7+
class GlobalAudioplayersPlatform extends GlobalAudioplayersPlatformInterface {
288
static const MethodChannel _channel =
299
MethodChannel('xyz.luan/audioplayers.global');
3010

0 commit comments

Comments
 (0)