From ac143220e64a2b0a52c05731eae7986dfd7cc229 Mon Sep 17 00:00:00 2001 From: Moritz Weber Date: Sun, 20 Dec 2020 16:21:48 +0100 Subject: [PATCH] loop mode, just_audio update --- ...{player_state.dart => playback_event.dart} | 24 ++++-- lib/presentation/state/audio_store.dart | 1 - lib/system/audio/audio_handler.dart | 75 +++++++++---------- lib/system/audio/audio_manager.dart | 1 - lib/system/audio/audio_player_contract.dart | 5 +- lib/system/audio/audio_player_impl.dart | 57 +++++++++----- .../datasources/moor_music_data_source.dart | 20 ++--- ...e_model.dart => playback_event_model.dart} | 30 ++++++-- lib/system/models/shuffle_mode_model.dart | 29 +++++++ .../repositories/audio_repository_impl.dart | 1 - pubspec.lock | 52 +++++-------- pubspec.yaml | 11 ++- 12 files changed, 180 insertions(+), 126 deletions(-) rename lib/domain/entities/{player_state.dart => playback_event.dart} (59%) rename lib/system/models/{player_state_model.dart => playback_event_model.dart} (58%) create mode 100644 lib/system/models/shuffle_mode_model.dart diff --git a/lib/domain/entities/player_state.dart b/lib/domain/entities/playback_event.dart similarity index 59% rename from lib/domain/entities/player_state.dart rename to lib/domain/entities/playback_event.dart index a4d5b53..80f6f46 100644 --- a/lib/domain/entities/player_state.dart +++ b/lib/domain/entities/playback_event.dart @@ -1,22 +1,32 @@ -class PlayerState { - PlayerState(this.playing, this.processingState); - - final bool playing; +class PlaybackEvent { + PlaybackEvent({ + this.duration, + this.index, + this.processingState, + this.updatePosition, + this.updateTime, + }); + final Duration duration; + final int index; final ProcessingState processingState; - + final Duration updatePosition; + final DateTime updateTime; } -/// Enumerates the different processing states of a player. enum ProcessingState { /// The player has not loaded an [AudioSource]. none, + /// The player is loading an [AudioSource]. loading, + /// The player is buffering audio and unable to play. buffering, + /// The player is has enough audio buffered and is able to play. ready, + /// The player has reached the end of the audio. completed, -} \ No newline at end of file +} diff --git a/lib/presentation/state/audio_store.dart b/lib/presentation/state/audio_store.dart index 1e3668c..d49fb06 100644 --- a/lib/presentation/state/audio_store.dart +++ b/lib/presentation/state/audio_store.dart @@ -106,7 +106,6 @@ abstract class _AudioStore with Store { } Future setLoopMode(LoopMode loopMode) async { - print('setLoopMode'); _audioRepository.setLoopMode(loopMode); } diff --git a/lib/system/audio/audio_handler.dart b/lib/system/audio/audio_handler.dart index 6ca2471..e8f0205 100644 --- a/lib/system/audio/audio_handler.dart +++ b/lib/system/audio/audio_handler.dart @@ -4,9 +4,10 @@ import 'package:audio_service/audio_service.dart'; import 'package:logging/logging.dart'; import '../../domain/entities/loop_mode.dart'; -import '../../domain/entities/player_state.dart'; +import '../../domain/entities/playback_event.dart'; import '../../domain/entities/shuffle_mode.dart'; import '../datasources/music_data_source_contract.dart'; +import '../models/playback_event_model.dart'; import '../models/queue_item_model.dart'; import '../models/song_model.dart'; import 'audio_player_contract.dart'; @@ -18,17 +19,16 @@ class MyAudioHandler extends BaseAudioHandler { _handleSetQueue(event); }); - _audioPlayer.currentIndexStream.listen((event) => _handleIndexChange(event)); - _audioPlayer.currentSongStream.listen((songModel) { mediaItemSubject.add(songModel.toMediaItem()); }); - _audioPlayer.playerStateStream.listen((event) { - _handlePlayerState(event); + _audioPlayer.playbackEventStream.listen((event) { + _handlePlaybackEvent(event); }); _audioPlayer.shuffleModeStream.listen((shuffleMode) { + _musicDataSource.setShuffleMode(shuffleMode); customEventSubject.add({SHUFFLE_MODE: shuffleMode}); }); @@ -40,6 +40,14 @@ class MyAudioHandler extends BaseAudioHandler { } Future _initAudioPlayer() async { + if (_musicDataSource.loopModeStream != null) { + _audioPlayer.setLoopMode(await _musicDataSource.loopModeStream.first); + } + + if (_musicDataSource.shuffleModeStream != null) { + _audioPlayer.setShuffleMode(await _musicDataSource.shuffleModeStream.first, false); + } + if (_musicDataSource.queueStream != null && _musicDataSource.currentIndexStream != null) { _audioPlayer.loadQueue( queue: await _musicDataSource.queueStream.first, @@ -56,7 +64,7 @@ class MyAudioHandler extends BaseAudioHandler { @override Future stop() async { await _audioPlayer.stop(); - // await _audioPlayer.dispose(); + await _audioPlayer.dispose(); await super.stop(); } @@ -128,7 +136,6 @@ class MyAudioHandler extends BaseAudioHandler { } Future setCustomLoopMode(LoopMode mode) async { - _audioPlayer.setLoopMode(mode); } @@ -151,48 +158,34 @@ class MyAudioHandler extends BaseAudioHandler { } void _handleSetQueue(List queue) { - print('handleSetQueue'); _musicDataSource.setQueue(queue); final mediaItems = queue.map((e) => e.song.toMediaItem()).toList(); queueSubject.add(mediaItems); } - void _handleIndexChange(int index) { - _log.info('index: $index'); - if (index != null) { - _musicDataSource.setCurrentIndex(index); - - customEventSubject.add({KEY_INDEX: index}); - playbackStateSubject.add(playbackState.value.copyWith( - controls: [ - MediaControl.skipToPrevious, - MediaControl.pause, - MediaControl.skipToNext, - ], - playing: _audioPlayer.playerStateStream.value.playing, - processingState: AudioProcessingState.ready, - updatePosition: const Duration(milliseconds: 0), // _audioPlayer.positionStream.value, - )); + void _handlePlaybackEvent(PlaybackEventModel pe) { + if (pe.index != null) { + _musicDataSource.setCurrentIndex(pe.index); + customEventSubject.add({KEY_INDEX: pe.index}); } - } - void _handlePlayerState(PlayerState ps) { - _log.info('handlePlayerState called'); - if (ps.processingState == ProcessingState.ready && ps.playing) { - playbackStateSubject.add(playbackState.value.copyWith( - controls: [MediaControl.skipToPrevious, MediaControl.pause, MediaControl.skipToNext], - playing: true, - processingState: AudioProcessingState.ready, - updatePosition: _audioPlayer.positionStream.value, - )); - } else if (ps.processingState == ProcessingState.ready && !ps.playing) { - playbackStateSubject.add(playbackState.value.copyWith( - controls: [MediaControl.skipToPrevious, MediaControl.play, MediaControl.skipToNext], - processingState: AudioProcessingState.ready, - updatePosition: _audioPlayer.positionStream.value, - playing: false, - )); + if (pe.processingState == ProcessingState.ready) { + if (_audioPlayer.playingStream.value) { + playbackStateSubject.add(playbackState.value.copyWith( + controls: [MediaControl.skipToPrevious, MediaControl.pause, MediaControl.skipToNext], + playing: true, + processingState: AudioProcessingState.ready, + updatePosition: pe.updatePosition, + )); + } else { + playbackStateSubject.add(playbackState.value.copyWith( + controls: [MediaControl.skipToPrevious, MediaControl.play, MediaControl.skipToNext], + processingState: AudioProcessingState.ready, + updatePosition: pe.updatePosition, + playing: false, + )); + } } } } diff --git a/lib/system/audio/audio_manager.dart b/lib/system/audio/audio_manager.dart index d8f2068..deafc10 100644 --- a/lib/system/audio/audio_manager.dart +++ b/lib/system/audio/audio_manager.dart @@ -118,7 +118,6 @@ class AudioManagerImpl implements AudioManager { @override Future setLoopMode(LoopMode loopMode) async { - print('setLoopMode!!'); await _audioHandler.customAction(SET_LOOP_MODE, {'LOOP_MODE': loopMode}); } diff --git a/lib/system/audio/audio_player_contract.dart b/lib/system/audio/audio_player_contract.dart index bd2f945..6bfa07a 100644 --- a/lib/system/audio/audio_player_contract.dart +++ b/lib/system/audio/audio_player_contract.dart @@ -2,14 +2,15 @@ import 'package:rxdart/rxdart.dart'; import '../../domain/entities/loop_mode.dart'; import '../../domain/entities/shuffle_mode.dart'; -import '../models/player_state_model.dart'; +import '../models/playback_event_model.dart'; import '../models/queue_item_model.dart'; import '../models/song_model.dart'; abstract class AudioPlayer { ValueStream get currentIndexStream; ValueStream get currentSongStream; - ValueStream get playerStateStream; + ValueStream get playbackEventStream; + ValueStream get playingStream; ValueStream get positionStream; ValueStream> get queueStream; ValueStream get shuffleModeStream; diff --git a/lib/system/audio/audio_player_impl.dart b/lib/system/audio/audio_player_impl.dart index 3138a6d..e0ec137 100644 --- a/lib/system/audio/audio_player_impl.dart +++ b/lib/system/audio/audio_player_impl.dart @@ -5,7 +5,7 @@ import '../../domain/entities/loop_mode.dart'; import '../../domain/entities/queue_item.dart'; import '../../domain/entities/shuffle_mode.dart'; import '../models/loop_mode_model.dart'; -import '../models/player_state_model.dart'; +import '../models/playback_event_model.dart'; import '../models/queue_item_model.dart'; import '../models/song_model.dart'; import 'audio_player_contract.dart'; @@ -14,24 +14,31 @@ import 'queue_generator.dart'; class AudioPlayerImpl implements AudioPlayer { AudioPlayerImpl(this._audioPlayer, this._queueGenerator) { _audioPlayer.currentIndexStream.listen((event) { + print('currentIndex: $event'); _currentIndexSubject.add(event); - _currentSongSubject.add(_queueSubject.value[event].song); + if (_queueSubject.value != null) { + _currentSongSubject.add(_queueSubject.value[event].song); + } + }); + + _audioPlayer.playingStream.listen((event) => _playingSubject.add(event)); + + _audioPlayer.playbackEventStream.listen((event) { + _playbackEventSubject.add(PlaybackEventModel.fromJAPlaybackEvent(event)); }); _audioPlayer.positionStream.listen((event) { _positionSubject.add(event); }); - _audioPlayer.playerStateStream.listen((event) { - _playerStateSubject.add(PlayerStateModel.fromJAPlayerState(event)); - }); - _audioPlayer.loopModeStream.listen((event) { _loopModeSubject.add(event.toEntity()); }); _queueSubject.listen((event) { - _currentSongSubject.add(event[_currentIndexSubject.value].song); + if (_currentIndexSubject.value != null) { + _currentSongSubject.add(event[_currentIndexSubject.value].song); + } }); } @@ -44,7 +51,8 @@ class AudioPlayerImpl implements AudioPlayer { final BehaviorSubject _currentIndexSubject = BehaviorSubject(); final BehaviorSubject _currentSongSubject = BehaviorSubject(); - final BehaviorSubject _playerStateSubject = BehaviorSubject(); + final BehaviorSubject _playbackEventSubject = BehaviorSubject(); + final BehaviorSubject _playingSubject = BehaviorSubject(); final BehaviorSubject _positionSubject = BehaviorSubject(); final BehaviorSubject> _queueSubject = BehaviorSubject(); final BehaviorSubject _shuffleModeSubject = BehaviorSubject.seeded(ShuffleMode.none); @@ -57,11 +65,14 @@ class AudioPlayerImpl implements AudioPlayer { ValueStream get currentSongStream => _currentSongSubject.stream; @override - ValueStream get playerStateStream => _playerStateSubject.stream; + ValueStream get playbackEventStream => _playbackEventSubject.stream; @override ValueStream get positionStream => _positionSubject.stream; + @override + ValueStream get playingStream => _playingSubject.stream; + @override ValueStream> get queueStream => _queueSubject.stream; @@ -75,7 +86,7 @@ class AudioPlayerImpl implements AudioPlayer { Future dispose() async { await _currentIndexSubject.close(); await _currentSongSubject.close(); - await _playerStateSubject.close(); + await _playbackEventSubject.close(); await _positionSubject.close(); await _queueSubject.close(); await _shuffleModeSubject.close(); @@ -85,11 +96,16 @@ class AudioPlayerImpl implements AudioPlayer { @override Future loadQueue({List queue, int startIndex = 0}) async { - if (queue == null || queue.isEmpty) { + if (queue == null || queue.isEmpty ) { + return; + } + if (startIndex >= queue.length) { + print('$startIndex >= ${queue.length}'); return; } _audioSource = _queueGenerator.songModelsToAudioSource([queue[startIndex].song]); - await _audioPlayer.load(_audioSource); + await _audioPlayer.setAudioSource(_audioSource); + // await _audioPlayer.load(); final songModelQueue = queue.map((e) => e.song).toList(); _queueSubject.add(queue); @@ -115,11 +131,11 @@ class AudioPlayerImpl implements AudioPlayer { Future playSongList(List songs, int startIndex) async { _inputQueue = songs; - final firstSong = songs[startIndex]; // .sublist(startIndex, startIndex + 1); + final firstSong = songs[startIndex]; _queueSubject.add([QueueItemModel(firstSong, originalIndex: startIndex)]); _audioSource = _queueGenerator.songModelsToAudioSource([firstSong]); + await _audioPlayer.setAudioSource(_audioSource); _audioPlayer.play(); - await _audioPlayer.load(_audioSource, initialIndex: 0); _queue = await _queueGenerator.generateQueue(_shuffleModeSubject.value, songs, startIndex); final songModelQueue = _queue.map((e) => e.song).toList(); @@ -127,7 +143,7 @@ class AudioPlayerImpl implements AudioPlayer { final int splitIndex = _shuffleModeSubject.value == ShuffleMode.none ? startIndex : 0; final newQueue = _queueGenerator.songModelsToAudioSource(songModelQueue); - _audioSource.insertAll(0, newQueue.children.sublist(0, splitIndex)); + await _audioSource.insertAll(0, newQueue.children.sublist(0, splitIndex)); _audioSource.addAll(newQueue.children.sublist(splitIndex + 1, newQueue.length)); } @@ -176,6 +192,7 @@ class AudioPlayerImpl implements AudioPlayer { @override Future setShuffleMode(ShuffleMode shuffleMode, bool updateQueue) async { + if (shuffleMode == null) return; _shuffleModeSubject.add(shuffleMode); if (updateQueue) { @@ -193,11 +210,11 @@ class AudioPlayerImpl implements AudioPlayer { @override Future setLoopMode(LoopMode loopMode) async { - print('ap loopmode'); + if (loopMode == null) return; await _audioPlayer.setLoopMode(loopMode.toJA()); } - void _updateQueue(ja.ConcatenatingAudioSource newQueue, QueueItem currentQueueItem) { + Future _updateQueue(ja.ConcatenatingAudioSource newQueue, QueueItem currentQueueItem) async { final int index = currentQueueItem.originalIndex; _audioSource.removeRange(0, _currentIndexSubject.value); @@ -207,15 +224,15 @@ class AudioPlayerImpl implements AudioPlayer { switch (currentQueueItem.type) { case QueueItemType.added: case QueueItemType.standard: - _audioSource.insertAll(0, newQueue.children.sublist(0, index)); + await _audioSource.insertAll(0, newQueue.children.sublist(0, index)); _audioSource.addAll(newQueue.children.sublist(index + 1)); break; case QueueItemType.predecessor: - _audioSource.insertAll(0, newQueue.children.sublist(0, index)); + await _audioSource.insertAll(0, newQueue.children.sublist(0, index)); _audioSource.addAll(newQueue.children.sublist(index)); break; case QueueItemType.successor: - _audioSource.insertAll(0, newQueue.children.sublist(0, index + 1)); + await _audioSource.insertAll(0, newQueue.children.sublist(0, index + 1)); _audioSource.addAll(newQueue.children.sublist(index + 1)); break; } diff --git a/lib/system/datasources/moor_music_data_source.dart b/lib/system/datasources/moor_music_data_source.dart index cf4c0e3..79b6f6a 100644 --- a/lib/system/datasources/moor_music_data_source.dart +++ b/lib/system/datasources/moor_music_data_source.dart @@ -13,6 +13,7 @@ import '../models/album_model.dart'; import '../models/artist_model.dart'; import '../models/loop_mode_model.dart'; import '../models/queue_item_model.dart'; +import '../models/shuffle_mode_model.dart'; import '../models/song_model.dart'; import 'music_data_source_contract.dart'; @@ -242,7 +243,6 @@ class MoorMusicDataSource extends _$MoorMusicDataSource implements MusicDataSour .join([innerJoin(songs, songs.path.equalsExp(queueEntries.path))]); return query.watch().map((rows) { - print('rows: ${rows.length}'); return rows.map((row) => SongModel.fromMoorSong(row.readTable(songs))).toList(); }); } @@ -265,7 +265,6 @@ class MoorMusicDataSource extends _$MoorMusicDataSource implements MusicDataSour @override Future setQueue(List queue) async { - print('setQueue'); final _queueEntries = >[]; for (var i = 0; i < queue.length; i++) { @@ -290,7 +289,6 @@ class MoorMusicDataSource extends _$MoorMusicDataSource implements MusicDataSour @override Future setCurrentIndex(int index) async { - print('setCurrentIndex: $index'); final currentState = await select(playerState).getSingle(); if (currentState != null) { update(playerState).write(PlayerStateCompanion(index: Value(index))); @@ -306,7 +304,6 @@ class MoorMusicDataSource extends _$MoorMusicDataSource implements MusicDataSour @override Future setLoopMode(LoopMode loopMode) async { - print('setLoopMode!!!'); final currentState = await select(playerState).getSingle(); if (currentState != null) { update(playerState).write(PlayerStateCompanion(loopMode: Value(loopMode.toInt()))); @@ -316,14 +313,19 @@ class MoorMusicDataSource extends _$MoorMusicDataSource implements MusicDataSour } @override - Future setShuffleMode(ShuffleMode shuffleMode) { - // TODO: implement setShuffleMode - throw UnimplementedError(); + Future setShuffleMode(ShuffleMode shuffleMode) async { + final currentState = await select(playerState).getSingle(); + if (currentState != null) { + update(playerState).write(PlayerStateCompanion(shuffleMode: Value(shuffleMode.toInt()))); + } else { + into(playerState).insert(PlayerStateCompanion(shuffleMode: Value(shuffleMode.toInt()))); + } } @override - // TODO: implement shuffleModeStream - Stream get shuffleModeStream => throw UnimplementedError(); + Stream get shuffleModeStream { + return select(playerState).watchSingle().map((event) => event.shuffleMode.toShuffleMode()); + } } LazyDatabase _openConnection() { diff --git a/lib/system/models/player_state_model.dart b/lib/system/models/playback_event_model.dart similarity index 58% rename from lib/system/models/player_state_model.dart rename to lib/system/models/playback_event_model.dart index eb90f52..a566316 100644 --- a/lib/system/models/player_state_model.dart +++ b/lib/system/models/playback_event_model.dart @@ -1,15 +1,29 @@ import 'package:just_audio/just_audio.dart' as ja; -import '../../domain/entities/player_state.dart'; +import '../../domain/entities/playback_event.dart'; -class PlayerStateModel extends PlayerState { - PlayerStateModel(bool playing, ProcessingState processingState) - : super(playing, processingState); +class PlaybackEventModel extends PlaybackEvent { + PlaybackEventModel({ + Duration duration, + int index, + ProcessingState processingState, + Duration updatePosition, + DateTime updateTime, + }) : super( + duration: duration, + index: index, + processingState: processingState, + updatePosition: updatePosition, + updateTime: updateTime, + ); - factory PlayerStateModel.fromJAPlayerState(ja.PlayerState playerState) => - PlayerStateModel( - playerState.playing, - playerState.processingState.toProcessingState(), + factory PlaybackEventModel.fromJAPlaybackEvent(ja.PlaybackEvent playbackEvent) => + PlaybackEventModel( + duration: playbackEvent.duration, + index: playbackEvent.currentIndex, + processingState: playbackEvent.processingState.toProcessingState(), + updatePosition: playbackEvent.updatePosition, + updateTime: playbackEvent.updateTime, ); } diff --git a/lib/system/models/shuffle_mode_model.dart b/lib/system/models/shuffle_mode_model.dart new file mode 100644 index 0000000..56934f2 --- /dev/null +++ b/lib/system/models/shuffle_mode_model.dart @@ -0,0 +1,29 @@ + +import '../../domain/entities/shuffle_mode.dart'; + + +extension ShuffleModeToInt on ShuffleMode { + int toInt() { + switch(this) { + case ShuffleMode.standard: + return 1; + case ShuffleMode.plus: + return 2; + default: + return 0; + } + } +} + +extension IntToShuffleMode on int { + ShuffleMode toShuffleMode() { + switch(this) { + case 1: + return ShuffleMode.standard; + case 2: + return ShuffleMode.plus; + default: + return ShuffleMode.none; + } + } +} \ No newline at end of file diff --git a/lib/system/repositories/audio_repository_impl.dart b/lib/system/repositories/audio_repository_impl.dart index cf31796..72a6c56 100644 --- a/lib/system/repositories/audio_repository_impl.dart +++ b/lib/system/repositories/audio_repository_impl.dart @@ -101,7 +101,6 @@ class AudioRepositoryImpl implements AudioRepository { @override Future setLoopMode(LoopMode loopMode) async { - print('setLoopMode!'); await _audioManager.setLoopMode(loopMode); } } diff --git a/pubspec.lock b/pubspec.lock index 360f5dd..50c4808 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,18 +7,18 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "7.0.0" + version: "12.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "0.39.17" - analyzer_plugin: + version: "0.40.6" + analyzer_plugin_fork: dependency: transitive description: - name: analyzer_plugin + name: analyzer_plugin_fork url: "https://pub.dartlang.org" source: hosted version: "0.3.0" @@ -65,7 +65,7 @@ packages: name: build url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.5.2" build_config: dependency: transitive description: @@ -86,21 +86,21 @@ packages: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "1.3.11" + version: "1.4.4" build_runner: dependency: "direct dev" description: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "1.10.2" + version: "1.10.11" build_runner_core: dependency: transitive description: name: build_runner_core url: "https://pub.dartlang.org" source: hosted - version: "6.0.1" + version: "6.0.3" built_collection: dependency: transitive description: @@ -178,20 +178,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.5" - csslib: - dependency: transitive - description: - name: csslib - url: "https://pub.dartlang.org" - source: hosted - version: "0.16.2" dart_style: dependency: transitive description: name: dart_style url: "https://pub.dartlang.org" source: hosted - version: "1.3.6" + version: "1.3.10" dartz: dependency: "direct main" description: @@ -319,13 +312,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.0" - html: - dependency: transitive - description: - name: html - url: "https://pub.dartlang.org" - source: hosted - version: "0.14.0+4" http: dependency: transitive description: @@ -378,24 +364,26 @@ packages: just_audio: dependency: "direct main" description: - name: just_audio - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.7" + path: just_audio + ref: HEAD + resolved-ref: "62c369527f749ff06428c8de26d318e77e803cdf" + url: "https://github.com/ryanheise/just_audio.git" + source: git + version: "0.6.1" just_audio_platform_interface: dependency: transitive description: name: just_audio_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.1.1" + version: "2.0.0" just_audio_web: dependency: transitive description: name: just_audio_web url: "https://pub.dartlang.org" source: hosted - version: "0.1.1" + version: "0.2.0" logging: dependency: "direct main" description: @@ -439,7 +427,7 @@ packages: source: hosted version: "1.1.2" mockito: - dependency: "direct main" + dependency: "direct dev" description: name: mockito url: "https://pub.dartlang.org" @@ -458,7 +446,7 @@ packages: name: moor_generator url: "https://pub.dartlang.org" source: hosted - version: "3.3.1" + version: "3.4.0" nested: dependency: transitive description: @@ -673,7 +661,7 @@ packages: name: sqlparser url: "https://pub.dartlang.org" source: hosted - version: "0.10.1" + version: "0.11.0" stack_trace: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 7629633..0b34e4e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,10 +21,12 @@ dependencies: flutter_audio_query: ^0.3.5 flutter_mobx: ^1.1.0 get_it: ^4.0.2 - just_audio: ^0.5.0 + just_audio: # ^0.6.1 + git: + url: https://github.com/ryanheise/just_audio.git + path: just_audio logging: ^0.11.4 mobx: ^1.1.1 - mockito: ^4.1.1 moor: ^3.0.2 # moor_ffi: ^0.5.0 path: @@ -33,11 +35,12 @@ dependencies: sqlite3_flutter_libs: ^0.2.0 dev_dependencies: - build_runner: 1.10.2 + build_runner: 1.10.11 flutter_test: sdk: flutter mobx_codegen: ^1.0.3 - moor_generator: ^3.0.0 + mockito: ^4.1.1 + moor_generator: ^3.4.0 # For information on the generic Dart part of this file, see the