Initial flame_lua_runtime package

This commit is contained in:
gem
2026-06-07 22:53:58 +08:00
commit 733b2fb798
262 changed files with 28439 additions and 0 deletions

View File

@@ -0,0 +1,99 @@
import 'dart:async' as async;
import 'dart:typed_data';
import 'package:audioplayers/audioplayers.dart';
abstract class RuntimeAudioPlayer {
Future<void> start(
Uint8List bytes, {
required double volume,
bool loop = false,
});
Future<void> pause();
Future<void> resume();
Future<void> stop();
Future<void> get done;
Future<void> dispose();
}
class AudioplayersRuntimeAudioPlayer implements RuntimeAudioPlayer {
AudioplayersRuntimeAudioPlayer({AudioPlayer? player})
: _player = player ?? AudioPlayer();
final AudioPlayer _player;
async.Completer<void> _done = async.Completer<void>();
async.StreamSubscription<void>? _completionSubscription;
bool _disposed = false;
@override
Future<void> get done => _done.future;
@override
Future<void> start(
Uint8List bytes, {
required double volume,
bool loop = false,
}) async {
if (_disposed) {
return;
}
await _completionSubscription?.cancel();
_completionSubscription = null;
if (_done.isCompleted) {
_done = async.Completer<void>();
}
_completionSubscription = _player.onPlayerComplete.listen((_) {
_completeDone();
});
await _player.setReleaseMode(loop ? ReleaseMode.loop : ReleaseMode.release);
await _player.play(BytesSource(bytes), volume: volume);
}
@override
Future<void> pause() async {
if (_disposed) {
return;
}
await _player.pause();
}
@override
Future<void> resume() async {
if (_disposed) {
return;
}
await _player.resume();
}
@override
Future<void> stop() async {
if (_disposed) {
return;
}
await _player.stop();
_completeDone();
}
@override
Future<void> dispose() async {
if (_disposed) {
return;
}
_disposed = true;
await _completionSubscription?.cancel();
_completionSubscription = null;
await _player.dispose();
_completeDone();
}
void _completeDone() {
if (!_done.isCompleted) {
_done.complete();
}
}
}