player_handler.dart 2.71 KB
import 'dart:ffi';

import 'package:appframe/services/dispatcher.dart';
import 'package:flutter_sound/flutter_sound.dart';

FlutterSoundPlayer? localPlayer;
bool isLocalPlaying = false;
bool isLocalPausePlaying = false;
String? localPlayedFilePath;

Future<bool> initLocalPlayer() async {
  localPlayer = FlutterSoundPlayer();
  try {
    await localPlayer!.openPlayer();
  } catch (e) {
    print(e);
    await _resetPlayerStatus();
    throw Exception('打开播放器失败!');
  }

  return true;
}

Future<bool> startLocalPlayer(String url) async {
  if (localPlayer == null) {
    await initLocalPlayer();
  }

  try {
    localPlayedFilePath = url;
    localPlayer!.startPlayer(fromURI: url);
    return true;
  } catch (e) {
    print(e);
    await _resetPlayerStatus();
    return false;
  }
}

Future<bool> pauseLocalPlayer() async {

  if(!(isLocalPlaying==true && isLocalPausePlaying==false)) {
    return false;
  }


  try {
    await localPlayer!.pausePlayer();
    return true;
  } catch (e) {
    print(e);
    await _resetPlayerStatus();
    return false;
  }
}

Future<bool> resumeLocalPlayer() async {
  if(!(isLocalPlaying==true && isLocalPausePlaying==true)) {
    return false;
  }

  try {
    await localPlayer!.resumePlayer();
    return true;
  } catch (e) {
    print(e);
    await _resetPlayerStatus();
    return false;
  }
}

Future<bool> stopLocalPlayer() async {
  try {
    localPlayer!.stopPlayer();
    return true;
  } catch (e) {
    print(e);
    return false;
  } finally {
    await _resetPlayerStatus();
  }
}

void closeLocalPlayer() async {
  await _resetPlayerStatus();
}

Future<void> _resetPlayerStatus() async {
  try {
    await localPlayer?.closePlayer();
  } catch (e) {
    print(e);
  }
  localPlayer = null;
  isLocalPlaying = false;
  isLocalPausePlaying = false;
  localPlayedFilePath = null;
}

class AudioPlayHandler extends MessageHandler {
  @override
  Future<dynamic> handleMessage(dynamic params) async {
    bool result = await startLocalPlayer(params['url']);
    return result;
  }
}

class AudioPauseHandler extends MessageHandler {
  @override
  Future<dynamic> handleMessage(dynamic params) async {
    bool result = await pauseLocalPlayer();
    return result;
  }
}

class AudioResumeHandler extends MessageHandler {
  @override
  Future<dynamic> handleMessage(dynamic params) async {
    bool result = await resumeLocalPlayer();
    return result;
  }
}

class AudioStopHandler extends MessageHandler {
  @override
  Future<dynamic> handleMessage(dynamic params) async {
    bool result = await stopLocalPlayer();
    return result;
  }
}

class AudioClearHandler extends MessageHandler {
  @override
  Future<dynamic> handleMessage(dynamic params) async {
    closeLocalPlayer();
    return true;
  }
}